blob: 3d857be55d1233841a2f2186ed94cb21310b5acc (
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
62
63
64
65
66
67
68
69
70
71
72
73
74
|
module Controller.Payment
( list
, create
, edit
, delete
) where
import Control.Monad.IO.Class (liftIO)
import qualified Network.HTTP.Types.Status as Status
import Web.Scotty hiding (delete)
import Common.Model (CreatePayment (..),
CreatedPayment (..),
EditPayment (..), Payment (..),
PaymentId, User (..))
import qualified Model.Query as Query
import qualified Persistence.Payment as PaymentPersistence
import qualified Persistence.PaymentCategory as PaymentCategoryPersistence
import qualified Secure
import qualified Validation.CreatePayment as CreatePaymentValidation
list :: ActionM ()
list =
Secure.loggedAction (\_ ->
(liftIO . Query.run $ PaymentPersistence.listActive) >>= json
)
create :: CreatePayment -> ActionM ()
create createPayment@(CreatePayment name cost date category frequency) =
Secure.loggedAction (\user ->
case CreatePaymentValidation.validate createPayment of
Nothing ->
(liftIO . Query.run $ do
pc <- PaymentCategoryPersistence.save name category
p <- PaymentPersistence.create (_user_id user) name cost date frequency
return $ CreatedPayment p pc
) >>= json
Just validationError ->
do
status Status.badRequest400
json validationError
)
edit :: EditPayment -> ActionM ()
edit (EditPayment paymentId name cost date category frequency) =
Secure.loggedAction (\user -> do
updated <- liftIO . Query.run $ do
edited <- PaymentPersistence.edit (_user_id user) paymentId name cost date frequency
_ <- if edited
then PaymentCategoryPersistence.save name category >> return ()
else return ()
return edited
if updated
then status Status.ok200
else status Status.badRequest400
)
delete :: PaymentId -> ActionM ()
delete paymentId =
Secure.loggedAction (\user -> do
deleted <- liftIO . Query.run $ do
payment <- PaymentPersistence.find paymentId
case payment of
Just p | _payment_user p == _user_id user -> do
PaymentPersistence.delete (_user_id user) paymentId
PaymentCategoryPersistence.deleteIfUnused (_payment_name p)
return True
_ ->
return False
if deleted then
status Status.ok200
else
status Status.badRequest400
)
|