module Controller.Category ( listAll , list , create , edit , delete ) where import Control.Monad.IO.Class (liftIO) import qualified Data.Text.Lazy as TL import Data.Validation (Validation (..)) import Network.HTTP.Types.Status (badRequest400, ok200) import Web.Scotty hiding (delete) import Common.Model (CategoryId, CategoryPage (..), CreateCategoryForm (..), EditCategoryForm (..)) import qualified Common.Msg as Msg import qualified Controller.Helper as ControllerHelper import Model.CreateCategory (CreateCategory (..)) import Model.EditCategory (EditCategory (..)) import qualified Model.Query as Query import qualified Persistence.Category as CategoryPersistence import qualified Persistence.Payment as PaymentPersistence import qualified Secure import qualified Validation.Category as CategoryValidation listAll :: ActionM () listAll = Secure.loggedAction (\_ -> (liftIO . Query.run $ CategoryPersistence.listAll) >>= json ) list :: Int -> Int -> ActionM () list page perPage = Secure.loggedAction (\_ -> (liftIO . Query.run $ do categories <- CategoryPersistence.list page perPage usedCategories <- PaymentPersistence.usedCategories count <- CategoryPersistence.count return $ CategoryPage page categories usedCategories count ) >>= json ) create :: CreateCategoryForm -> ActionM () create form = Secure.loggedAction (\_ -> (liftIO . Query.run $ do case CategoryValidation.createCategory form of Success (CreateCategory name color) -> do Right <$> (CategoryPersistence.create name color) Failure validationError -> return $ Left validationError ) >>= ControllerHelper.okOrBadRequest ) edit :: EditCategoryForm -> ActionM () edit form = Secure.loggedAction (\_ -> (liftIO . Query.run $ do case CategoryValidation.editCategory form of Success (EditCategory categoryId name color) -> do isSuccess <- CategoryPersistence.edit categoryId name color return $ if isSuccess then Right () else Left $ Msg.get Msg.Error_CategoryEdit Failure validationError -> return $ Left validationError ) >>= ControllerHelper.okOrBadRequest ) delete :: CategoryId -> ActionM () delete categoryId = Secure.loggedAction (\_ -> do deleted <- liftIO . Query.run $ do CategoryPersistence.delete categoryId if deleted then status ok200 else do status badRequest400 text . TL.fromStrict $ Msg.get Msg.Category_NotDeleted )