aboutsummaryrefslogtreecommitdiff
path: root/server/src/Main.hs
blob: c8080dc89cbd6d3095d0d5cf845579ec3137f3ab (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
83
import           Control.Applicative           (liftA3)
import           Control.Monad.IO.Class        (liftIO)

import qualified Data.Text.Lazy                as LT
import           Network.Wai.Middleware.Gzip   (GzipFiles (GzipCompress))
import qualified Network.Wai.Middleware.Gzip   as W
import           Network.Wai.Middleware.Static
import           Web.Scotty

import           Common.Model                  (Frequency (..), Payment (..))
import qualified Common.Model                  as CM

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 qualified Data.Time                     as Time
import           Job.Daemon                    (runDaemons)
import qualified Model.Income                  as IncomeM
import qualified Model.Payment                 as PaymentM
import qualified Model.Query                   as Query
import qualified Model.User                    as UserM

main :: IO ()
main = do
  conf <- Conf.get "application.conf"
  _ <- runDaemons conf
  scotty (Conf.port conf) $ do
    middleware $ W.gzip $ W.def { W.gzipFiles = GzipCompress }
    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 punctualPayments = filter ((==) Punctual . _payment_frequency) payments
          exceedingPayers = CM.getExceedingPayers time users incomes punctualPayments
      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)