packages feed

lucienne-0.0.1: Lucienne/Controller/AddNewFeed.hs

module Lucienne.Controller.AddNewFeed
  (addNewFeed,doAddNewFeed)
where

import           Control.Monad.Trans (liftIO)
import           Lucienne.Controller.Imports
import qualified Lucienne.View.AddNewFeed as View
import qualified Lucienne.Database as DB
import           Lucienne.Fetch (fetchFeedByUrl)
import qualified Lucienne.Model.Feed as F
import qualified Lucienne.Model.FeedItem as FI
import qualified Lucienne.Url as Url

addNewFeed :: User -> Controller Response
addNewFeed _ = do
  msg <- getMessages
  ok $ toResponse $ View.addNewFeed msg

doAddNewFeed :: User -> Controller Response
doAddNewFeed user = do 
  decodeBody
  url <- look "url"
  alreadySubscribed <- lift $ DB.feedExists user url
  if alreadySubscribed 
   then seeOther $ withMessage AlreadySubscribed Url.addNewFeed
   else do
     result <- liftIO $ fetchFeedByUrl url
     case result of
       Left msg           -> badRequest $ toResponse $ msg
       Right (feed,items) -> do 
         feedId <- lift $ DB.addFeed $ F.setOwner user feed
         _ <- lift $ DB.addFeedItems $ map (FI.setOwner user . FI.setFeedId feedId) items
         seeFeed feedId