lebd/src/Handler/Feed.hs

55 lines
1.7 KiB
Haskell

{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedStrings #-}
module Handler.Feed where
import Import
import Data.Time.Clock.POSIX ( posixSecondsToUTCTime )
import Model.Entry ( entryTitle )
import Widget.Entry ( entryR )
import qualified Data.Text as T
import qualified Model.Entry.Kind as K
getFeedR :: Handler TypedContent
getFeedR = do
entries <- runDB $ selectList [] [Desc EntryPublished]
newsFeed $ toFeed entries
getFeedKindR :: K.EntryKind -> Handler TypedContent
getFeedKindR kind = do
entries <- runDB $ selectList [EntryKind ==. kind] [Desc EntryPublished]
let basicFeed = toFeed entries
newsFeed $ basicFeed
{ feedTitle = T.concat [K.pluralise kind, " ~ ", feedTitle basicFeed]
, feedDescription = toHtml $ T.concat ["feed of all ", K.pluralise kind]
, feedLinkSelf = FeedKindR kind
, feedLinkHome = EntriesR kind
}
toFeed :: [Entity Entry] -> Feed (Route App)
toFeed entries@(latestEntry:_) = (toFeed [])
{ feedEntries = toFeedEntry <$> entries
, feedUpdated = entryUpdated $ entityVal latestEntry
}
toFeed [] = Feed
{ feedTitle = siteTitle compileTimeAppSettings
, feedLinkSelf = FeedR
, feedLinkHome = HomeR
, feedAuthor = ""
, feedDescription = "sitewide feed of all entries"
, feedLanguage = "en-au"
, feedUpdated = posixSecondsToUTCTime 0
, feedLogo = Nothing
, feedEntries = []
}
toFeedEntry :: Entity Entry -> FeedEntry (Route App)
toFeedEntry entry = FeedEntry
{ feedEntryLink = entryR entry
, feedEntryUpdated = entryUpdated $ entityVal entry
, feedEntryTitle = entryTitle $ entityVal entry
, feedEntryContent = toHtml . entryContent . entityVal $ entry
, feedEntryEnclosure = Nothing
}