lucienne-0.0.1: Lucienne/Controller/FeedItem.hs
module Lucienne.Controller.FeedItem
( feedItem, doDeleteFeedItem, doReadFeedItem, doChangeFeedItemState)
where
import Control.Applicative ((<$>))
import Control.Monad (msum)
import Data.Maybe (isJust,fromJust,catMaybes)
import qualified Lucienne.Database as DB
import Lucienne.Controller.Imports
import qualified Lucienne.View.FeedItem as View
import Lucienne.Model.FeedItem (FeedItem)
import qualified Lucienne.Model.FeedItem as FI
import Lucienne.Model.FeedItemState (FeedItemState (..))
feedItem :: String -> User -> Controller Response
feedItem feedItemId user = do
mFeedItem <- lift $ DB.feedItemById user feedItemId
case mFeedItem of
Nothing -> mzero
Just feedItem ->
let redirect = (null $ FI.content feedItem) && (FI.state feedItem == New)
in do
setStateOfItem feedItem Read
if redirect
then seeOther $ FI.url feedItem
else ok $ toResponse $ View.feedItem feedItem
doDeleteFeedItem :: String -> User -> Controller Response
doDeleteFeedItem feedItemId user =
setStateAndSeeFeed feedItemId user Deleted
doReadFeedItem :: String -> User -> Controller Response
doReadFeedItem feedItemId user =
setStateAndSeeFeed feedItemId user Read
doChangeFeedItemState :: User -> Controller Response
doChangeFeedItemState user = do
decodeBody
action <- msum <$> mapM lookAction ["markAsRead","delete"]
ids <- readParameter "numItems" >>= lookFeedItemIds . fromJust
case action of
Just "markAsRead" -> mapM_ (\id -> setState id user Read) ids
Just "delete" -> mapM_ (\id -> setState id user Deleted) ids
mFeedId <- fmap readObjectId <$> lookParameter "feedId"
case mFeedId of
Nothing -> seeHome
Just feedId -> seeFeed feedId
where
lookAction a = do
isAction <- isJust <$> lookParameter a
return $ if isAction then Just a else Nothing
lookFeedItemIds numItems =
catMaybes <$> mapM (\i -> lookParameter $ "feedItem" ++ show i) [0..numItems - 1]
setState :: String -> User -> FeedItemState -> Controller ()
setState feedItemId user state = do
Just feedItem <- lift $ DB.feedItemById user feedItemId
setStateOfItem feedItem state
setStateOfItem :: FeedItem -> FeedItemState -> Controller ()
setStateOfItem feedItem state =
case FI.state feedItem of
Deleted -> return ()
_ -> lift $ DB.upsertFeedItem $ feedItem { FI.state = state }
setStateAndSeeFeed :: String -> User -> FeedItemState -> Controller Response
setStateAndSeeFeed feedItemId user state = do
Just feedItem <- lift $ DB.feedItemById user feedItemId
setStateOfItem feedItem state
seeFeed $ FI.feedId feedItem