aboutsummaryrefslogtreecommitdiff
path: root/src/server/Main.hs
blob: 71c4674b7f8838a26d48f3d7b597ef386ed2ace6 (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
75
76
77
78
{-# LANGUAGE OverloadedStrings #-}

import Web.Scotty

import Network.Wai.Middleware.Static

import Control.Concurrent (forkIO)
import MonthlyPaymentJob (monthlyPaymentJobListener)

import Data.Text (Text)
import qualified Data.Text.IO as TIO

import Controller.Index
import Controller.SignIn
import Controller.Payment
import Controller.User

import Model.Database (runMigrations)
import Model.Frequency

import Config

main :: IO ()
main = do
  runMigrations
  _ <- forkIO monthlyPaymentJobListener
  eitherConfig <- getConfig "config.txt"
  case eitherConfig of
    Left errorMessage ->
      TIO.putStrLn errorMessage
    Right config -> do
      scotty (port config) $ do
        middleware $
          staticPolicy (noDots >-> addBase "public")

        get  "/"        getIndex
        post "/signOut" signOut

        -- SignIn

        post "/signIn" $ do
          login <- param "login" :: ActionM Text
          signIn config login

        get "/validateSignIn" $ do
          token <- param "token" :: ActionM Text
          validateSignIn config token

        -- Users

        get  "/users"  getUsers
        get  "/whoAmI" whoAmI
        get  "/income" getIncome
        post "/income" $ do
          amount <- param "amount" :: ActionM Int
          setIncome amount

        -- Payments

        get "/payments" $ do
          page    <- param "page"    :: ActionM Int
          perPage <- param "perPage" :: ActionM Int
          getPayments page perPage

        get "/monthlyPayments" getMonthlyPayments

        post "/payment/add" $ do
          name <- param "name" :: ActionM Text
          cost <- param "cost" :: ActionM Int
          frequency <- param "frequency" :: ActionM Frequency
          createPayment name cost frequency

        post "/payment/delete" $ do
          paymentId <- param "id" :: ActionM Text
          deletePayment paymentId

        get "/payments/total" getTotalPayments
        get "/payments/count" getPaymentsCount