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