packages feed

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