module Controller.Category ( list , create , edit , delete ) where import Control.Monad.IO.Class (liftIO) import qualified Data.Text.Lazy as TL import Network.HTTP.Types.Status (badRequest400, ok200) import Web.Scotty hiding (delete) import Common.Model (CategoryId, CreateCategory (..), EditCategory (..)) import qualified Common.Msg as Msg import Json (jsonId) import qualified Model.Query as Query import qualified Persistence.Category as CategoryPersistence import qualified Secure list :: ActionM () list = Secure.loggedAction (\_ -> (liftIO . Query.run $ CategoryPersistence.list) >>= json ) create :: CreateCategory -> ActionM () create (CreateCategory name color) = Secure.loggedAction (\_ -> (liftIO . Query.run $ CategoryPersistence.create name color) >>= jsonId ) edit :: EditCategory -> ActionM () edit (EditCategory categoryId name color) = Secure.loggedAction (\_ -> do updated <- liftIO . Query.run $ CategoryPersistence.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 -- TODO: delete only if no payment has this category CategoryPersistence.delete categoryId if deleted then status ok200 else do status badRequest400 text . TL.fromStrict $ Msg.get Msg.Category_NotDeleted )