diff --git a/Handler/Feed.hs b/Handler/Feed.hs index fbee2f7..61a7a79 100644 --- a/Handler/Feed.hs +++ b/Handler/Feed.hs @@ -1,4 +1,8 @@ -module Handler.Feed where +module Handler.Feed + ( getFeedR + , getLtsFeedR + , getNightlyFeedR + ) where import Import import Stackage.Database @@ -7,8 +11,16 @@ import Stackage.Snapshot.Diff import qualified Data.HashMap.Strict as HashMap getFeedR :: Handler TypedContent -getFeedR = do - (_, snaps) <- getSnapshots 20 0 +getFeedR = mkFeed . snd =<< getSnapshots 20 0 + +getLtsFeedR :: Handler TypedContent +getLtsFeedR = mkFeed . snd =<< getLtsSnapshots 20 0 + +getNightlyFeedR :: Handler TypedContent +getNightlyFeedR = mkFeed . snd =<< getNightlySnapshots 20 0 + +mkFeed :: [Entity Snapshot] -> Handler TypedContent +mkFeed snaps = do entries <- forM snaps $ \(Entity snapid snap) -> do content <- getContent snapid snap return FeedEntry diff --git a/Stackage/Database.hs b/Stackage/Database.hs index c5defff..c2576ea 100644 --- a/Stackage/Database.hs +++ b/Stackage/Database.hs @@ -33,6 +33,8 @@ module Stackage.Database , prettyNameShort , getSnapshotsForPackage , getSnapshots + , getLtsSnapshots + , getNightlySnapshots , currentSchema , last5Lts5Nightly , snapshotsJSON @@ -666,6 +668,37 @@ getSnapshots l o = run $ (,) [] [LimitTo l, OffsetBy o, Desc SnapshotCreated] +getLtsSnapshots :: GetStackageDatabase m + => Int -- ^ limit + -> Int -- ^ offset + -> m (Int, [Entity Snapshot]) +getLtsSnapshots l o = run $ do + ltsCount <- count ([] :: [Filter Lts]) + snapshots <- E.select $ E.from $ + \(lts `E.InnerJoin` snapshot) -> do + E.on $ lts E.^. LtsSnap E.==. snapshot E.^. SnapshotId + E.orderBy [ E.desc (lts E.^. LtsMajor) + , E.desc (lts E.^. LtsMinor) ] + E.limit $ fromIntegral l + E.offset $ fromIntegral o + return snapshot + return (ltsCount, snapshots) + +getNightlySnapshots :: GetStackageDatabase m + => Int -- ^ limit + -> Int -- ^ offset + -> m (Int, [Entity Snapshot]) +getNightlySnapshots l o = run $ do + nightlyCount <- count ([] :: [Filter Nightly]) + snapshots <- E.select $ E.from $ + \(nightly `E.InnerJoin` snapshot) -> do + E.on $ nightly E.^. NightlySnap E.==. snapshot E.^. SnapshotId + E.orderBy [E.desc (nightly E.^. NightlyDay)] + E.limit $ fromIntegral l + E.offset $ fromIntegral o + return snapshot + return (nightlyCount, snapshots) + last5Lts5Nightly :: GetStackageDatabase m => m [SnapName] last5Lts5Nightly = run $ do ls <- selectList [] [Desc LtsMajor, Desc LtsMinor, LimitTo 5] diff --git a/config/routes b/config/routes index 9baae5e..70e126f 100644 --- a/config/routes +++ b/config/routes @@ -45,4 +45,7 @@ /download/snapshots.json DownloadSnapshotsJsonR GET /download/lts-snapshots.json DownloadLtsSnapshotsJsonR GET /download/#SupportedArch/#Text DownloadGhcLinksR GET + /feed FeedR GET +/feed/lts LtsFeedR GET +/feed/nightly NightlyFeedR GET