aboutsummaryrefslogtreecommitdiff
path: root/src/client/elm/ServerCommunication.elm
blob: 1cabda5974806c9305660ba25f996b6a8633c076 (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 ServerCommunication
  ( sendRequest
  , initViewAction
  ) where

import Signal
import Task as Task exposing (Task)
import Http
import Json.Decode as Json exposing ((:=))
import Date
import Time exposing (Time)
import Debug

import SimpleHTTP exposing (..)

import Model.Communication exposing (..)
import Model.Action as U exposing (Action)
import Model.Action.LoggedInAction as UL
import Model.Action.MonthlyAction as UM
import Model.Action.AccountAction as UA
import Model.View.LoggedIn.AddPayment exposing (Frequency(..))
import Model.Payment exposing (PaymentId, paymentIdDecoder, Payments, paymentsDecoder)
import Model.Payer exposing (Payers, payersDecoder)
import Model.User exposing (Users, usersDecoder, UserId, userIdDecoder)

import Update.SignIn exposing (updateSignIn)

sendRequest : Communication -> Task Http.Error U.Action
sendRequest communication =
  case communication of

    SignIn assertion ->
      post ("/signIn?assertion=" ++ assertion)
        |> flip Task.andThen (always initViewAction)

    AddPayment name cost frequency ->
      post (addPaymentURL name cost frequency)
        |> flip Task.andThen (decodeHttpValue <| "id" := paymentIdDecoder)
        |> Task.map (\paymentId -> (U.UpdateLoggedIn (UL.AddPayment paymentId name cost frequency)))

    DeletePayment payment currentPage ->
      post (deletePaymentURL payment.id)
        |> Task.map (always (U.UpdateLoggedIn (UL.DeletePayment payment)))

    DeleteMonthlyPayment id ->
      post (deletePaymentURL id)
        |> Task.map (always (U.UpdateLoggedIn (UL.UpdateMonthly (UM.DeletePayment id))))

    SetIncome currentTime amount ->
      post ("/income?amount=" ++ (toString amount))
        |> Task.map (always (U.UpdateLoggedIn (UL.UpdateAccount (UA.UpdateIncome currentTime amount))))

    SignOut ->
      post "/signOut"
        |> Task.map (always U.GoSignInView)

addPaymentURL : String -> Int -> Frequency -> String
addPaymentURL name cost frequency =
  "/payment/add?name=" ++ name ++ "&cost=" ++ (toString cost) ++ "&frequency=" ++ (toString frequency)

deletePaymentURL : PaymentId -> String
deletePaymentURL id =
  "payment/delete?id=" ++ (toString id)

initViewAction = Task.onError loggedInView (always <| Task.succeed U.GoSignInView)

loggedInView : Task Http.Error Action
loggedInView =
  Task.map U.GoLoggedInView (Http.get usersDecoder "/users")
    `Task.andMap` (Http.get ("id" := userIdDecoder) "/whoAmI")
    `Task.andMap` (Http.get paymentsDecoder "/monthlyPayments")
    `Task.andMap` (Http.get paymentsDecoder "/payments")
    `Task.andMap` (Http.get ("number" := Json.int) "/payments/count")
    `Task.andMap` (Http.get payersDecoder "/payers")