{-# LANGUAGE OverloadedStrings #-} module Controller.Category ( create , edit , delete ) where import Control.Monad.IO.Class (liftIO) import Network.HTTP.Types.Status (ok200, badRequest400) import qualified Data.Text.Lazy as TL import Web.Scotty hiding (delete) import Common.Model.Category (CategoryId) import qualified Common.Message as Message import qualified Common.Message.Key as Key import qualified Common.Model.CreateCategory as Json import qualified Common.Model.EditCategory as Json import Json (jsonId) import qualified Model.Category as Category import qualified Model.PaymentCategory as PaymentCategory import qualified Model.Query as Query import qualified Secure create :: Json.CreateCategory -> ActionM () create (Json.CreateCategory name color) = Secure.loggedAction (\_ -> (liftIO . Query.run $ Category.create name color) >>= jsonId ) edit :: Json.EditCategory -> ActionM () edit (Json.EditCategory categoryId name color) = Secure.loggedAction (\_ -> do updated <- liftIO . Query.run $ Category.edit categoryId name color if updated then status ok200 else status badRequest400 ) delete :: CategoryId -> ActionM () delete categoryId = Secure.loggedAction (\_ -> do deleted <- liftIO . Query.run $ do paymentCategories <- PaymentCategory.listByCategory categoryId if null paymentCategories then Category.delete categoryId else return False if deleted then status ok200 else do status badRequest400 text . TL.fromStrict $ Message.get Key.Category_NotDeleted )