aboutsummaryrefslogtreecommitdiff
path: root/src/server/Main.hs
blob: 3d61481dfc8c575643b02304cc70a068ad29f87c (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
79
80
81
82
{-# 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 Controller.Payer

import Model.Database (runMigrations)
import Model.Frequency

import qualified Config

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

        get  "/"             (getIndex config)
        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/count" getPaymentsCount

        -- Payers

        get "/payers" getPayers