aboutsummaryrefslogtreecommitdiff
path: root/server/src/Main.hs
blob: db734744c5edf8a344c370d4f553e3b3773d765a (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
{-# LANGUAGE OverloadedStrings #-}

import Control.Applicative (liftA3)
import Control.Monad.IO.Class (liftIO)

import Network.Wai.Middleware.Static
import qualified Data.Text.Lazy as LT
import Web.Scotty

import qualified Conf
import qualified Controller.Category as Category
import qualified Controller.Income as Income
import qualified Controller.Index as Index
import qualified Controller.Payment as Payment
import qualified Controller.SignIn as SignIn
import Job.Daemon (runDaemons)
import Model.Payer (getOrderedExceedingPayers)
import qualified Data.Time as Time
import qualified Model.User as UserM
import qualified Model.Income as IncomeM
import qualified Model.Payment as PaymentM
import qualified Model.Query as Query

main :: IO ()
main = do
  conf <- Conf.get "application.conf"
  _ <- runDaemons conf
  scotty (Conf.port conf) $ do
    middleware . staticPolicy $ noDots >-> addBase "public"

    get "/exceedingPayer" $ do
      time <- liftIO Time.getCurrentTime
      (users, incomes, payments) <- liftIO . Query.run $
        liftA3 (,,) UserM.list IncomeM.list PaymentM.list
      let exceedingPayers = getOrderedExceedingPayers time users incomes payments
      text . LT.pack . show $ exceedingPayers

    get "/" $ do
      signInToken <- mbParam "signInToken"
      Index.get conf signInToken

    post "/signIn" $ do
      jsonData >>= SignIn.signIn conf

    post "/signOut" $
      Index.signOut conf

    post "/payment" $
      jsonData >>= Payment.create

    put "/payment" $
      jsonData >>= Payment.editOwn

    delete "/payment" $ do
      paymentId <- param "id"
      Payment.deleteOwn paymentId

    post "/income" $
      jsonData >>= Income.create

    put "/income" $
      jsonData >>= Income.editOwn

    delete "/income" $ do
      incomeId <- param "id"
      Income.deleteOwn incomeId

    post "/category" $
      jsonData >>= Category.create

    put "/category" $
      jsonData >>= Category.edit

    delete "/category" $ do
      categoryId <- param "id"
      Category.delete categoryId

mbParam :: Parsable a => LT.Text -> ActionM (Maybe a)
mbParam key = (Just <$> param key) `rescue` (const . return $ Nothing)