module ServerCommunication ( Communication(..) , sendRequest , serverCommunications ) where import Signal import Task as Task exposing (Task) import Http import Json.Decode exposing (..) import Date import Model.Message exposing (messageDecoder) import Model.Payment exposing (PaymentId, perPage, paymentsDecoder) import Update as U import Update.SignIn exposing (..) import Update.Payment as UP type Communication = NoCommunication | SignIn String | AddPayment String Int | DeletePayment PaymentId | UpdatePage Int | SignOut serverCommunications : Signal.Mailbox Communication serverCommunications = Signal.mailbox NoCommunication sendRequest : Communication -> Task Http.RawError U.Action sendRequest communication = case getRequest communication of Nothing -> Task.succeed U.NoOp Just request -> Http.send Http.defaultSettings request |> Task.map (communicationToAction communication) getRequest : Communication -> Maybe Http.Request getRequest communication = case communication of NoCommunication -> Nothing SignIn login -> Just (simple "post" ("/signIn?login=" ++ login)) AddPayment name cost -> Just (simple "post" ("/payment/add?name=" ++ name ++ "&cost=" ++ (toString cost))) DeletePayment paymentId -> Just (simple "post" ("payment/delete?id=" ++ paymentId)) UpdatePage page -> Just (simple "get" ("payments?page=" ++ toString page ++ "&perPage=" ++ toString perPage)) SignOut -> Just (simple "post" "/signOut") simple : String -> String -> Http.Request simple method url = { verb = method , headers = [] , url = url , body = Http.empty } communicationToAction : Communication -> Http.Response -> U.Action communicationToAction communication response = if response.status == 200 then case communication of NoCommunication -> U.NoOp SignIn login -> U.UpdateSignIn (ValidLogin login) AddPayment name cost -> decodeResponse response messageDecoder (\id -> U.UpdatePayment (UP.AddPayment id name cost)) DeletePayment id -> U.UpdatePayment (UP.Remove id) UpdatePage page -> decodeResponse response paymentsDecoder (\payments -> U.UpdatePayment (UP.UpdatePage page payments)) SignOut -> U.GoSignInView else decodeResponse response messageDecoder (\error -> case communication of SignIn _ -> U.UpdateSignIn (ErrorLogin error) _ -> U.NoOp ) decodeResponse : Http.Response -> Decoder a -> (a -> U.Action) -> U.Action decodeResponse response decoder responseToAction = case response.value of Http.Text text -> case decodeString decoder text of Ok x -> responseToAction x Err _ -> U.NoOp Http.Blob _ -> U.NoOp