packages feed

Yablog-0.0.1.1: Handler/Root.hs

module Handler.Root where
import qualified Data.Text as T
import Import
import Yesod.Feed
import Control.Arrow
import Data.Time
import Data.Maybe
import Data.List (last)

-- This is a handler function for the GET request method on the RootR
-- resource pattern. All of your resource patterns are defined in
-- config/routes
--
-- The majority of the code you will write in Yesod lives in these handler
-- functions. You can spread them across multiple files if you are so
-- inclined, or create a single monolithic file.
getRootR :: Handler RepHtml
getRootR = do
  offset <- fromMaybe 0 <$> runInputGet (iopt intField "of")
  (articles, hasMore) <- runDB $ do
    as <- selectList [] [OffsetBy offset, LimitTo 5, Desc ArticleCreatedDate, Desc ArticleCreatedTime]
    hasMore <-
      if null as
        then return False
        else do
          let anc = entityVal $ last as
          olds <- count [ ArticleCreatedDate <=. articleCreatedDate anc
                        , FilterOr [ ArticleCreatedDate <.  articleCreatedDate anc
                                   , ArticleCreatedTime <.   articleCreatedTime anc
                                   ]
                        ]
          return (olds > 0)
    cs <- mapM (\(Entity key _) -> count [CommentArticle ==. key]) as
    ts <- mapM (\(Entity key _) -> count [TrackbackArticle ==. key]) as
    return $ (zip [1 :: Int ..] $ zip3 (map entityVal as) cs ts, hasMore)
  title <- getBlogTitle
  defaultLayout $ do
    setTitle $ toHtml $ "Home - " `T.append` title
    $(widgetFile "homepage")

getFeedR :: Handler RepAtomRss
getFeedR = do
  bTitle <- getBlogTitle
  desc <- getBlogDescription
  arts <- runDB $ map entityVal <$> selectList [] [ LimitTo 5
                                              , Desc ArticleCreatedDate
                                              , Desc ArticleCreatedTime
                                              ]
  let ts = map (uncurry UTCTime . ((toEnum . articleCreatedDate) &&& (toEnum . articleCreatedTime))) arts
           ++ mapMaybe articleModifiedAt arts
  es <- mapM toFeedEntry arts
  time <- if null ts then liftIO getCurrentTime else return $ maximum ts
  newsFeed $ Feed { feedTitle = bTitle
                  , feedLinkSelf = FeedR
                  , feedLinkHome = RootR
                  , feedDescription = toHtml desc
                  , feedLanguage = "ja"
                  , feedUpdated = time
                  , feedEntries = es
                  }

toFeedEntry :: Article -> Handler (FeedEntry (Route Yablog))
toFeedEntry art = do
  body <- markupRender Nothing art
  let time = UTCTime (toEnum $ articleCreatedDate art) (toEnum $ articleCreatedTime art)
  return FeedEntry { feedEntryLink    = ArticleR (toEnum $ articleCreatedDate art) (articleTitle art)
                   , feedEntryUpdated = fromMaybe time $ articleModifiedAt art
                   , feedEntryTitle   = articleTitle art
                   , feedEntryContent = body
                   }