aboutsummaryrefslogtreecommitdiff
path: root/src/server/Controller/Payment.hs
blob: d71b451eade09fa1892b1badb871d0e18171bd1d (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
56
57
58
59
60
61
{-# LANGUAGE OverloadedStrings #-}

module Controller.Payment
  ( list
  , create
  , editOwn
  , deleteOwn
  ) where

import Control.Monad.IO.Class (liftIO)
import Network.HTTP.Types.Status (ok200, badRequest400)
import Web.Scotty

import Json (jsonId)
import Model.Payment (PaymentId)
import qualified Model.Json.CreatePayment as Json
import qualified Model.Json.EditPayment as Json
import qualified Model.Json.Payment as Json
import qualified Model.Payment as Payment
import qualified Model.PaymentCategory as PaymentCategory
import qualified Model.Query as Query
import qualified Model.User as User
import qualified Secure

list :: ActionM ()
list =
  Secure.loggedAction (\_ ->
    (liftIO . Query.run $ map Json.fromPayment <$> Payment.list) >>= json
  )

create :: Json.CreatePayment -> ActionM ()
create (Json.CreatePayment name cost date category frequency) =
  Secure.loggedAction (\user ->
    (liftIO . Query.run $ do
      PaymentCategory.save name category
      Payment.create (User.id user) name cost date frequency
    ) >>= jsonId
  )

editOwn :: Json.EditPayment -> ActionM ()
editOwn (Json.EditPayment paymentId name cost date category frequency) =
  Secure.loggedAction (\user -> do
    updated <- liftIO . Query.run $ do
      edited <- Payment.editOwn (User.id user) paymentId name cost date frequency
      _ <- if edited
        then PaymentCategory.save name category >> return ()
        else return ()
      return edited
    if updated
      then status ok200
      else status badRequest400
  )

deleteOwn :: PaymentId -> ActionM ()
deleteOwn paymentId =
  Secure.loggedAction (\user -> do
    deleted <- liftIO . Query.run $ Payment.deleteOwn (User.id user) paymentId
    if deleted
      then status ok200
      else status badRequest400
  )