@@ -76,6 +76,11 @@ import qualified Text.XHtml.Strict as XHtml
76
76
import Text.XHtml.Table (simpleTable )
77
77
import Distribution.PackageDescription (hasLibs )
78
78
import Distribution.PackageDescription.Configuration (flattenPackageDescription )
79
+ import qualified Distribution.Server.Pages.Recent as Pages
80
+ import qualified Distribution.Server.Util.Paging as Paging
81
+ import Distribution.Server.Features.RecentPackages (RecentPackagesFeature (RecentPackagesFeature , getRecentRevisions , getRecentPackages ))
82
+ import Data.Time (getCurrentTime )
83
+ import Text.Read (readMaybe )
79
84
import Distribution.Server.Pages.Group (listGroupCompact )
80
85
81
86
@@ -115,6 +120,7 @@ initHtmlFeature :: ServerEnv
115
120
-> TarIndexCacheFeature
116
121
-> ReportsFeature
117
122
-> UserDetailsFeature
123
+ -> RecentPackagesFeature
118
124
-> IO HtmlFeature )
119
125
120
126
initHtmlFeature env@ ServerEnv {serverTemplatesDir, serverTemplatesMode,
@@ -153,7 +159,8 @@ initHtmlFeature env@ServerEnv{serverTemplatesDir, serverTemplatesMode,
153
159
docsCore docsCandidates
154
160
tarIndexCache
155
161
reportsCore
156
- usersdetails -> do
162
+ usersdetails
163
+ recentPackagesFeature -> do
157
164
-- do rec, tie the knot
158
165
rec let (feature, packageIndex, packagesPage) =
159
166
htmlFeature env user core
@@ -172,6 +179,7 @@ initHtmlFeature env@ServerEnv{serverTemplatesDir, serverTemplatesMode,
172
179
(reverseHtmlUtil reversef)
173
180
mainCache namesCache
174
181
templates
182
+ recentPackagesFeature
175
183
176
184
-- Index page caches
177
185
mainCache <- newAsyncCacheNF packageIndex
@@ -224,6 +232,7 @@ htmlFeature :: ServerEnv
224
232
-> AsyncCache Response
225
233
-> AsyncCache Response
226
234
-> Templates
235
+ -> RecentPackagesFeature
227
236
-> (HtmlFeature , IO Response , IO Response )
228
237
229
238
htmlFeature env@ ServerEnv {.. }
@@ -245,6 +254,7 @@ htmlFeature env@ServerEnv{..}
245
254
reverseH@ ReverseHtmlUtil {.. }
246
255
cachePackagesPage cacheNamesPage
247
256
templates
257
+ recentPackagesFeature
248
258
= (HtmlFeature {.. }, packageIndex, packagesPage)
249
259
where
250
260
htmlFeatureInterface = (emptyHackageFeature " html" ) {
@@ -288,6 +298,7 @@ htmlFeature env@ServerEnv{..}
288
298
templates
289
299
names
290
300
candidates
301
+ recentPackagesFeature
291
302
htmlUsers = mkHtmlUsers user usersdetails
292
303
htmlUploads = mkHtmlUploads utilities upload
293
304
htmlDocUploads = mkHtmlDocUploads utilities core docsCore templates
@@ -419,6 +430,7 @@ mkHtmlCore :: ServerEnv
419
430
-> Templates
420
431
-> SearchFeature
421
432
-> PackageCandidatesFeature
433
+ -> RecentPackagesFeature
422
434
-> HtmlCore
423
435
mkHtmlCore ServerEnv {serverBaseURI, serverBlobStore}
424
436
utilities@ HtmlUtilities {.. }
@@ -448,10 +460,11 @@ mkHtmlCore ServerEnv{serverBaseURI, serverBlobStore}
448
460
templates
449
461
SearchFeature {.. }
450
462
PackageCandidatesFeature {.. }
463
+ RecentPackagesFeature {getRecentPackages, getRecentRevisions}
451
464
= HtmlCore {.. }
452
465
where
453
466
candidatesCore = candidatesCoreResource
454
- cores@ CoreResource {packageInPath, lookupPackageName, lookupPackageId} = coreResource
467
+ cores@ CoreResource {packageInPath, lookupPackageName, lookupPackageId} = coreResource
455
468
versions = versionsResource
456
469
docs = documentationResource
457
470
@@ -505,8 +518,76 @@ mkHtmlCore ServerEnv{serverBaseURI, serverBlobStore}
505
518
, (resourceAt " /package/:package/revisions/.:format" ) {
506
519
resourceGet = [(" html" , serveCabalRevisionsPage)]
507
520
}
521
+ , (resourceAt " /packages/recent.:format" ) {
522
+ resourceGet = [(" html" , serveRecentPage),(" rss" , serveRecentRSS)]
523
+ }
524
+ , (resourceAt " /packages/recent/revisions.:format" ) {
525
+ resourceGet = [(" html" , serveRevisionPage), (" rss" , serveRevisionRSS)]
526
+ }
508
527
]
509
528
529
+ readParamWithDefaultAndValid :: (Read a , HasRqData m , Monad m , Functor m , Alternative m ) =>
530
+ a -> (a -> Bool ) -> String -> m a
531
+ readParamWithDefaultAndValid n f queryParam = do
532
+ m <- optional (look queryParam)
533
+ let parsed = m >>= readMaybe >>= (\ x -> if f x then Just x else Nothing )
534
+
535
+ return $ fromMaybe n parsed
536
+
537
+ lookupPageSize :: (HasRqData m , Monad m , Functor m , Alternative m ) => Int -> m Int
538
+ lookupPageSize def = readParamWithDefaultAndValid def validPageSize " pageSize"
539
+ where validPageSize x = x > 1 && x <= 200
540
+
541
+ lookupPage :: (HasRqData m , Monad m , Functor m , Alternative m ) => Int -> m Int
542
+ lookupPage def = readParamWithDefaultAndValid def validPage " page"
543
+ where validPage = (>= 1 )
544
+
545
+ serveRecentPage :: DynamicPath -> ServerPartE Response
546
+ serveRecentPage _ = do
547
+ recentPackages <- getRecentPackages
548
+ users <- queryGetUserDb
549
+ page <- lookupPage 1
550
+ pageSize <- lookupPageSize 20
551
+
552
+ let conf = Paging. createConf page pageSize recentPackages
553
+
554
+ return . toResponse $ Pages. recentPage conf users recentPackages
555
+
556
+ serveRecentRSS :: DynamicPath -> ServerPartE Response
557
+ serveRecentRSS _ = do
558
+ recentPackages <- getRecentPackages
559
+ users <- queryGetUserDb
560
+ page <- lookupPage 1
561
+ pageSize <- lookupPageSize 20
562
+ now <- liftIO getCurrentTime
563
+
564
+ let conf = Paging. createConf page pageSize recentPackages
565
+
566
+ return . toResponse $ Pages. recentFeed conf users serverBaseURI now recentPackages
567
+
568
+ serveRevisionPage :: DynamicPath -> ServerPartE Response
569
+ serveRevisionPage _ = do
570
+ revisions <- getRecentRevisions
571
+ users <- queryGetUserDb
572
+ page <- lookupPage 1
573
+ pageSize <- lookupPageSize 40
574
+
575
+ let conf = Paging. createConf page pageSize revisions
576
+
577
+ return . toResponse $ Pages. revisionsPage conf users revisions
578
+
579
+ serveRevisionRSS :: DynamicPath -> ServerPartE Response
580
+ serveRevisionRSS _ = do
581
+ revisions <- getRecentRevisions
582
+ users <- queryGetUserDb
583
+ page <- lookupPage 1
584
+ pageSize <- lookupPageSize 40
585
+ now <- liftIO getCurrentTime
586
+
587
+ let conf = Paging. createConf page pageSize revisions
588
+
589
+ return . toResponse $ Pages. recentRevisionsFeed conf users serverBaseURI now revisions
590
+
510
591
serveBrowsePage :: DynamicPath -> ServerPartE Response
511
592
serveBrowsePage _dpath = do
512
593
template <- getTemplate templates " browse.html"
0 commit comments