module Controller.Income ( list , create , edit , delete ) where import Control.Monad.IO.Class (liftIO) import Data.Validation (Validation (Failure, Success)) import qualified Network.HTTP.Types.Status as Status import Web.Scotty hiding (delete) import Common.Model (CreateIncomeForm (..), EditIncomeForm (..), IncomeId, User (..)) import qualified Controller.Helper as ControllerHelper import Model.CreateIncome (CreateIncome (..)) import Model.EditIncome (EditIncome (..)) import qualified Model.Query as Query import qualified Persistence.Income as IncomePersistence import qualified Secure import qualified Validation.Income as IncomeValidation list :: ActionM () list = Secure.loggedAction (\_ -> (liftIO . Query.run $ IncomePersistence.list) >>= json ) create :: CreateIncomeForm -> ActionM () create form = Secure.loggedAction (\user -> (liftIO . Query.run $ do case IncomeValidation.createIncome form of Success (CreateIncome amount date) -> do Right <$> (IncomePersistence.create (_user_id user) date amount) Failure validationError -> return $ Left validationError ) >>= ControllerHelper.jsonOrBadRequest ) edit :: EditIncomeForm -> ActionM () edit form = Secure.loggedAction (\user -> (liftIO . Query.run $ do case IncomeValidation.editIncome form of Success (EditIncome incomeId amount date) -> do Right <$> (IncomePersistence.edit (_user_id user) incomeId date amount) Failure validationError -> return $ Left validationError ) >>= ControllerHelper.jsonOrBadRequest ) delete :: IncomeId -> ActionM () delete incomeId = Secure.loggedAction (\user -> do _ <- liftIO . Query.run $ IncomePersistence.delete (_user_id user) incomeId status Status.ok200 )