module Handler.Feed ( getFeedR , getBranchFeedR ) where import Import import Stackage.Database import Data.These import Stackage.Snapshot.Diff import qualified Data.HashMap.Strict as HashMap import Text.Blaze (text) getFeedR :: Handler TypedContent getFeedR = getBranchFeed Nothing getBranchFeedR :: SnapshotBranch -> Handler TypedContent getBranchFeedR = getBranchFeed . Just getBranchFeed :: Maybe SnapshotBranch -> Handler TypedContent getBranchFeed mBranch = mkFeed mBranch =<< getSnapshots mBranch 20 0 mkFeed :: Maybe SnapshotBranch -> [Entity Snapshot] -> Handler TypedContent mkFeed _ [] = notFound mkFeed mBranch snaps = do entries <- forM snaps $ \(Entity snapid snap) -> do content <- getContent snapid snap return FeedEntry { feedEntryLink = SnapshotR (snapshotName snap) StackageHomeR , feedEntryUpdated = UTCTime (snapshotCreated snap) 0 , feedEntryTitle = prettyName (snapshotName snap) (snapshotGhc snap) , feedEntryContent = content } updated <- case entries of [] -> liftIO getCurrentTime x:_ -> return $ feedEntryUpdated x newsFeed Feed { feedTitle = title , feedLinkSelf = FeedR , feedLinkHome = HomeR , feedAuthor = "Stackage Project" , feedDescription = text title , feedLanguage = "en" , feedUpdated = updated , feedEntries = entries } where branchTitle NightlyBranch = "Nightly" branchTitle LtsBranch = "LTS" branchTitle (LtsMajorBranch x) = "LTS-" <> tshow x title = "Recent Stackage " <> maybe "" branchTitle mBranch <> " snapshots" getContent :: SnapshotId -> Snapshot -> Handler Html getContent sid2 snap = do mprev <- case snapshotName snap of SNLts x y -> ltsBefore x y SNNightly day -> nightlyBefore day case mprev of Nothing -> return "No previous snapshot found for comparison" Just (sid1, name1) -> do snapDiff <- getSnapshotDiff sid1 sid2 return [shamlet|

Difference between #{prettyNameShort name1} and #{prettyNameShort $ snapshotName snap} $forall (name, VersionChange verChange) <- sortOn (toCaseFold . fst) $ HashMap.toList snapDiff
Package name Old New
#{name} $case verChange $of This oldVersion #{oldVersion} $of That newVersion #{newVersion} $of These oldVersion newVersion #{oldVersion} #{newVersion} |]