aboutsummaryrefslogtreecommitdiff
path: root/server/src/Controller/Category.hs
blob: 8fbc8c8f0791f3120fb3051c65430f631ea1ab0d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
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
  )