Scylla/src/Scylla/Http.elm

190 lines
7.3 KiB
Elm
Raw Normal View History

2018-12-08 13:49:30 -08:00
module Scylla.Http exposing (..)
import Scylla.Model exposing (..)
import Scylla.Api exposing (..)
import Scylla.Route exposing (RoomId)
2018-12-19 21:52:07 -08:00
import Scylla.Sync exposing (syncResponseDecoder, historyResponseDecoder)
2018-12-08 13:49:30 -08:00
import Scylla.Login exposing (loginResponseDecoder, Username, Password)
2018-12-13 02:15:14 -08:00
import Scylla.UserData exposing (userDataDecoder, UserData)
import Url.Builder
import Json.Encode exposing (object, string, int, bool, list)
2019-03-15 18:01:26 -07:00
import Json.Decode as Decode exposing (field)
2018-12-20 19:22:51 -08:00
import Http exposing (request, emptyBody, jsonBody, fileBody, expectJson, expectWhatever)
import File exposing (File, name, mime)
import Url.Builder as Builder
import Json.Decode
2018-12-08 13:49:30 -08:00
firstSyncFilter : Json.Decode.Value
firstSyncFilter = object
[ ("room", object
[ ("state", object
2019-05-15 20:27:06 -07:00
[ ("types", list string [ "m.room.name", "m.room.member" ])
])
])
]
firstSyncFilterString : String
firstSyncFilterString = Json.Encode.encode 0 firstSyncFilter
2018-12-13 19:45:55 -08:00
fullClientUrl : ApiUrl -> ApiUrl
fullClientUrl s = s ++ "/_matrix/client/r0"
fullMediaUrl : ApiUrl -> ApiUrl
fullMediaUrl s = s ++ "/_matrix/media/r0"
2018-12-08 15:06:14 -08:00
2018-12-08 13:49:30 -08:00
-- Http Requests
firstSync : ApiUrl -> ApiToken -> Cmd Msg
firstSync apiUrl token = request
{ method = "GET"
, headers = authenticatedHeaders token
, url = Url.Builder.crossOrigin (fullClientUrl apiUrl) [ "sync" ] [ Url.Builder.string "filter" firstSyncFilterString ]
2018-12-09 00:35:07 -08:00
, body = emptyBody
, expect = expectJson ReceiveFirstSyncResponse syncResponseDecoder
2018-12-09 00:35:07 -08:00
, timeout = Nothing
, tracker = Nothing
}
2018-12-19 21:52:07 -08:00
sync : ApiUrl -> ApiToken -> String -> Cmd Msg
sync apiUrl token nextBatch = request
2018-12-09 00:35:07 -08:00
{ method = "GET"
, headers = authenticatedHeaders token
2018-12-13 19:45:55 -08:00
, url = (fullClientUrl apiUrl) ++ "/sync" ++ "?since=" ++ (nextBatch) ++ "&timeout=10000"
2018-12-09 00:35:07 -08:00
, body = emptyBody
2018-12-08 13:49:30 -08:00
, expect = expectJson ReceiveSyncResponse syncResponseDecoder
, timeout = Nothing
, tracker = Nothing
}
uploadMediaFile : ApiUrl -> ApiToken -> (File -> Result Http.Error String -> Msg) -> File -> Cmd Msg
2018-12-20 19:22:51 -08:00
uploadMediaFile apiUrl token msg file = request
{ method = "POST"
, headers = authenticatedHeaders token
, url = Builder.crossOrigin (fullMediaUrl apiUrl) [ "upload" ] [ Builder.string "filename" (name file) ]
, body = fileBody file
, expect = expectJson (msg file) <| Json.Decode.field "content_uri" Json.Decode.string
2018-12-20 19:22:51 -08:00
, timeout = Nothing
, tracker = Nothing
}
2018-12-19 21:52:07 -08:00
getHistory : ApiUrl -> ApiToken -> RoomId -> String -> Cmd Msg
getHistory apiUrl token room prevBatch = request
{ method = "GET"
, headers = authenticatedHeaders token
, url = (fullClientUrl apiUrl) ++ "/rooms/" ++ room ++ "/messages" ++ "?from=" ++ prevBatch ++ "&dir=" ++ "b"
, body = emptyBody
, expect = expectJson (ReceiveHistoryResponse room) historyResponseDecoder
, timeout = Nothing
, tracker = Nothing
}
2019-03-15 18:01:26 -07:00
sendMessage : ApiUrl -> ApiToken -> Int -> RoomId -> (Result Http.Error String -> Msg) -> List (String, Json.Encode.Value) -> Cmd Msg
2018-12-20 19:22:51 -08:00
sendMessage apiUrl token transactionId room msg contents = request
2018-12-09 23:38:43 -08:00
{ method = "PUT"
, headers = authenticatedHeaders token
2018-12-13 19:45:55 -08:00
, url = (fullClientUrl apiUrl)
2018-12-09 23:38:43 -08:00
++ "/rooms/" ++ room
++ "/send/" ++ "m.room.message"
++ "/" ++ (String.fromInt transactionId)
2018-12-20 19:22:51 -08:00
, body = jsonBody <| object contents
2019-03-15 18:01:26 -07:00
, expect = expectJson msg (field "event_id" Decode.string)
2018-12-09 23:38:43 -08:00
, timeout = Nothing
, tracker = Nothing
}
2018-12-20 22:01:09 -08:00
sendMarkdownMessage : ApiUrl -> ApiToken -> Int -> RoomId -> String -> String -> Cmd Msg
2019-02-25 19:54:54 -08:00
sendMarkdownMessage apiUrl token transactionId room message md = sendMessage apiUrl token transactionId room (SendRoomTextResponse transactionId)
2018-12-20 22:01:09 -08:00
[ ("msgtype", string "m.text")
, ("body", string message)
, ("formatted_body", string md)
, ("format", string "org.matrix.custom.html")
]
2018-12-20 19:22:51 -08:00
sendTextMessage : ApiUrl -> ApiToken -> Int -> RoomId -> String -> Cmd Msg
2019-02-25 19:54:54 -08:00
sendTextMessage apiUrl token transactionId room message = sendMessage apiUrl token transactionId room (SendRoomTextResponse transactionId)
2018-12-20 19:22:51 -08:00
[ ("msgtype", string "m.text")
, ("body", string message)
]
sendImageMessage : ApiUrl -> ApiToken -> Int -> RoomId -> File -> String -> Cmd Msg
sendImageMessage apiUrl token transactionId room file message = sendMessage apiUrl token transactionId room SendImageResponse
2018-12-20 19:22:51 -08:00
[ ("msgtype", string "m.image")
, ("body", string <| name file)
2018-12-20 19:22:51 -08:00
, ("url", string message)
, ("info", object [ ("mimetype", string <| mime file) ])
2018-12-20 19:22:51 -08:00
]
sendFileMessage : ApiUrl -> ApiToken -> Int -> RoomId -> File -> String -> Cmd Msg
sendFileMessage apiUrl token transactionId room file message = sendMessage apiUrl token transactionId room SendFileResponse
2018-12-20 19:22:51 -08:00
[ ("msgtype", string "m.file")
, ("body", string <| name file)
2018-12-20 19:22:51 -08:00
, ("url", string message)
, ("info", object [ ("mimetype", string <| mime file) ])
2018-12-20 19:22:51 -08:00
]
2018-12-08 13:49:30 -08:00
login : ApiUrl -> Username -> Password -> Cmd Msg
login apiUrl username password = request
{ method = "POST"
, headers = basicHeaders
2018-12-13 19:45:55 -08:00
, url = (fullClientUrl apiUrl) ++ "/login"
2018-12-08 13:49:30 -08:00
, body = jsonBody <| object
[ ("type", string "m.login.password")
, ("identifier", object
[ ("type", string "m.id.user")
, ("user", string username)
] )
, ("password", string password)
]
, expect = expectJson (ReceiveLoginResponse apiUrl) loginResponseDecoder
2018-12-08 13:49:30 -08:00
, timeout = Nothing
, tracker = Nothing
}
2018-12-13 02:15:14 -08:00
2019-09-12 15:56:21 -07:00
getUserData : ApiUrl -> ApiToken -> Username -> Cmd Msg
getUserData apiUrl token username = request
2018-12-13 02:15:14 -08:00
{ method = "GET"
, headers = authenticatedHeaders token
2018-12-13 19:45:55 -08:00
, url = (fullClientUrl apiUrl) ++ "/profile/" ++ username
2018-12-13 02:15:14 -08:00
, body = emptyBody
, expect = expectJson (ReceiveUserData username) userDataDecoder
, timeout = Nothing
, tracker = Nothing
}
setReadMarkers : ApiUrl -> ApiToken -> RoomId -> String -> Maybe String -> Cmd Msg
setReadMarkers apiUrl token roomId fullyRead readReceipt =
let
readReciptFields = case readReceipt of
Just s -> [ ("m.read", string s) ]
_ -> []
in
request
{ method = "POST"
, headers = authenticatedHeaders token
, url = (fullClientUrl apiUrl) ++ "/rooms/" ++ roomId ++ "/read_markers"
, body = jsonBody <| object <| [ ("m.fully_read", string fullyRead) ] ++ readReciptFields
, expect = expectWhatever ReceiveCompletedReadMarker
, timeout = Nothing
, tracker = Nothing
}
sendTypingIndicator : ApiUrl -> ApiToken -> RoomId -> Username -> Bool -> Int -> Cmd Msg
sendTypingIndicator apiUrl token room user isTyping timeout = request
{ method = "PUT"
, headers = authenticatedHeaders token
, url = (fullClientUrl apiUrl) ++ "/rooms/" ++ room ++ "/typing/" ++ user
, body = jsonBody <| object [ ("timeout", int timeout), ("typing", bool isTyping) ]
, expect = expectWhatever ReceiveCompletedTypingIndicator
, timeout = Nothing
, tracker = Nothing
}
setRoomAccountData : ApiUrl -> ApiToken -> Username -> RoomId -> String -> Decode.Value -> Msg -> Cmd Msg
setRoomAccountData apiUrl token user roomId key value msg = request
{ method = "PUT"
, headers = authenticatedHeaders token
, url = (fullClientUrl apiUrl) ++ "/user/" ++ user ++ "/rooms/" ++ roomId ++ "/account_data/" ++ key
, body = jsonBody value
, expect = expectWhatever (\_ -> msg)
, timeout = Nothing
, tracker = Nothing
}