From 8c9c916491d6a581c49afc231f3fb231588890af Mon Sep 17 00:00:00 2001 From: Konstantin Zudov Date: Tue, 13 Oct 2015 12:06:06 +0300 Subject: [PATCH 1/3] Add /feed/lts and /feed/nightly --- Handler/Feed.hs | 18 +++++++++++++++--- Stackage/Database.hs | 33 +++++++++++++++++++++++++++++++++ config/routes | 3 +++ 3 files changed, 51 insertions(+), 3 deletions(-) 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 From 5c2e8ecf6840c090c18fb495122d907c134273bf Mon Sep 17 00:00:00 2001 From: Konstantin Zudov Date: Tue, 13 Oct 2015 13:36:37 +0300 Subject: [PATCH 2/3] Add /feed/#LtsMajor (e.g /feed/lts-3) --- Handler/Feed.hs | 5 +++++ Stackage/Database.hs | 18 ++++++++++++++++++ config/routes | 1 + 3 files changed, 24 insertions(+) diff --git a/Handler/Feed.hs b/Handler/Feed.hs index 61a7a79..c3d148a 100644 --- a/Handler/Feed.hs +++ b/Handler/Feed.hs @@ -1,6 +1,7 @@ module Handler.Feed ( getFeedR , getLtsFeedR + , getLtsMajorFeedR , getNightlyFeedR ) where @@ -16,10 +17,14 @@ getFeedR = mkFeed . snd =<< getSnapshots 20 0 getLtsFeedR :: Handler TypedContent getLtsFeedR = mkFeed . snd =<< getLtsSnapshots 20 0 +getLtsMajorFeedR :: LtsMajor -> Handler TypedContent +getLtsMajorFeedR (LtsMajor v) = mkFeed . snd =<< getLtsMajorSnapshots v 20 0 + getNightlyFeedR :: Handler TypedContent getNightlyFeedR = mkFeed . snd =<< getNightlySnapshots 20 0 mkFeed :: [Entity Snapshot] -> Handler TypedContent +mkFeed [] = notFound mkFeed snaps = do entries <- forM snaps $ \(Entity snapid snap) -> do content <- getContent snapid snap diff --git a/Stackage/Database.hs b/Stackage/Database.hs index c2576ea..d1c2ac1 100644 --- a/Stackage/Database.hs +++ b/Stackage/Database.hs @@ -34,6 +34,7 @@ module Stackage.Database , getSnapshotsForPackage , getSnapshots , getLtsSnapshots + , getLtsMajorSnapshots , getNightlySnapshots , currentSchema , last5Lts5Nightly @@ -684,6 +685,23 @@ getLtsSnapshots l o = run $ do return snapshot return (ltsCount, snapshots) +getLtsMajorSnapshots :: GetStackageDatabase m + => Int -- ^ Major version + -> Int -- ^ limit + -> Int -- ^ offset + -> m (Int, [Entity Snapshot]) +getLtsMajorSnapshots v 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.^. LtsMinor)] + E.where_ ((lts E.^. LtsMajor) E.==. (E.val v)) + E.limit $ fromIntegral l + E.offset $ fromIntegral o + return snapshot + return (ltsCount, snapshots) + getNightlySnapshots :: GetStackageDatabase m => Int -- ^ limit -> Int -- ^ offset diff --git a/config/routes b/config/routes index 70e126f..5bd3315 100644 --- a/config/routes +++ b/config/routes @@ -47,5 +47,6 @@ /download/#SupportedArch/#Text DownloadGhcLinksR GET /feed FeedR GET +!/feed/#LtsMajor LtsMajorFeedR GET /feed/lts LtsFeedR GET /feed/nightly NightlyFeedR GET From 5d1d97c46dd9d9b25e9f3dcc58a046ce08af57fb Mon Sep 17 00:00:00 2001 From: Konstantin Zudov Date: Tue, 13 Oct 2015 14:58:10 +0300 Subject: [PATCH 3/3] Reflect the branch in the feed title/description --- Handler/Feed.hs | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/Handler/Feed.hs b/Handler/Feed.hs index c3d148a..76b0e6f 100644 --- a/Handler/Feed.hs +++ b/Handler/Feed.hs @@ -10,22 +10,24 @@ 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 = mkFeed . snd =<< getSnapshots 20 0 +getFeedR = mkFeed "" . snd =<< getSnapshots 20 0 getLtsFeedR :: Handler TypedContent -getLtsFeedR = mkFeed . snd =<< getLtsSnapshots 20 0 +getLtsFeedR = mkFeed "LTS" . snd =<< getLtsSnapshots 20 0 getLtsMajorFeedR :: LtsMajor -> Handler TypedContent -getLtsMajorFeedR (LtsMajor v) = mkFeed . snd =<< getLtsMajorSnapshots v 20 0 +getLtsMajorFeedR (LtsMajor v) = + mkFeed ("LTS-" <> tshow v) . snd =<< getLtsMajorSnapshots v 20 0 getNightlyFeedR :: Handler TypedContent -getNightlyFeedR = mkFeed . snd =<< getNightlySnapshots 20 0 +getNightlyFeedR = mkFeed "Nightly" . snd =<< getNightlySnapshots 20 0 -mkFeed :: [Entity Snapshot] -> Handler TypedContent -mkFeed [] = notFound -mkFeed snaps = do +mkFeed :: Text -> [Entity Snapshot] -> Handler TypedContent +mkFeed _ [] = notFound +mkFeed branch snaps = do entries <- forM snaps $ \(Entity snapid snap) -> do content <- getContent snapid snap return FeedEntry @@ -39,11 +41,11 @@ mkFeed snaps = do [] -> liftIO getCurrentTime x:_ -> return $ feedEntryUpdated x newsFeed Feed - { feedTitle = "Recent Stackage snapshots" + { feedTitle = "Recent Stackage " <> branch <> " snapshots" , feedLinkSelf = FeedR , feedLinkHome = HomeR , feedAuthor = "Stackage Project" - , feedDescription = "Recent Stackage snapshots" + , feedDescription = text ("Recent Stackage " <> branch <> " snapshots") , feedLanguage = "en" , feedUpdated = updated , feedEntries = entries