Add send message event API endpoint
							parent
							
								
									50b10c64ca
								
							
						
					
					
						commit
						4f08dd1176
					
				| 
						 | 
					@ -1,7 +1,7 @@
 | 
				
			||||||
module Internal.Api.Request exposing
 | 
					module Internal.Api.Request exposing
 | 
				
			||||||
    ( ApiCall, ApiPlan, Attribute, callAPI, withAttributes, toChain
 | 
					    ( ApiCall, ApiPlan, Attribute, callAPI, withAttributes, toChain
 | 
				
			||||||
    , Request, Error(..)
 | 
					    , Request, Error(..)
 | 
				
			||||||
    , accessToken, withTransactionId, timeout, onStatusCode
 | 
					    , accessToken, timeout, onStatusCode
 | 
				
			||||||
    , fullBody, bodyBool, bodyInt, bodyString, bodyValue, bodyOpBool, bodyOpInt, bodyOpString, bodyOpValue
 | 
					    , fullBody, bodyBool, bodyInt, bodyString, bodyValue, bodyOpBool, bodyOpInt, bodyOpString, bodyOpValue
 | 
				
			||||||
    , queryBool, queryInt, queryString, queryOpBool, queryOpInt, queryOpString
 | 
					    , queryBool, queryInt, queryString, queryOpBool, queryOpInt, queryOpString
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
| 
						 | 
					@ -28,7 +28,7 @@ Sometimes, APIs might fail. As a result, you may receive an error.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### General attributes
 | 
					### General attributes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@docs accessToken, withTransactionId, timeout, onStatusCode
 | 
					@docs accessToken, timeout, onStatusCode
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### Body
 | 
					### Body
 | 
				
			||||||
| 
						 | 
					@ -89,7 +89,6 @@ type ContextAttr
 | 
				
			||||||
    | Header Http.Header
 | 
					    | Header Http.Header
 | 
				
			||||||
    | NoAttr
 | 
					    | NoAttr
 | 
				
			||||||
    | QueryParam UrlBuilder.QueryParameter
 | 
					    | QueryParam UrlBuilder.QueryParameter
 | 
				
			||||||
    | ReplaceInUrl String String
 | 
					 | 
				
			||||||
    | StatusCodeResponse Int ( Error, List Log )
 | 
					    | StatusCodeResponse Int ( Error, List Log )
 | 
				
			||||||
    | Timeout Float
 | 
					    | Timeout Float
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -376,27 +375,7 @@ getUrl : ApiCall a -> String
 | 
				
			||||||
getUrl { attributes, baseUrl, path } =
 | 
					getUrl { attributes, baseUrl, path } =
 | 
				
			||||||
    UrlBuilder.crossOrigin
 | 
					    UrlBuilder.crossOrigin
 | 
				
			||||||
        baseUrl
 | 
					        baseUrl
 | 
				
			||||||
        (path
 | 
					        (List.map Url.percentEncode path)
 | 
				
			||||||
            |> List.map
 | 
					 | 
				
			||||||
                (\p ->
 | 
					 | 
				
			||||||
                    List.foldl
 | 
					 | 
				
			||||||
                        (\attr cp ->
 | 
					 | 
				
			||||||
                            case attr of
 | 
					 | 
				
			||||||
                                ReplaceInUrl from to ->
 | 
					 | 
				
			||||||
                                    if from == cp then
 | 
					 | 
				
			||||||
                                        to
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                                    else
 | 
					 | 
				
			||||||
                                        cp
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                                _ ->
 | 
					 | 
				
			||||||
                                    cp
 | 
					 | 
				
			||||||
                        )
 | 
					 | 
				
			||||||
                        p
 | 
					 | 
				
			||||||
                        attributes
 | 
					 | 
				
			||||||
                )
 | 
					 | 
				
			||||||
            |> List.map Url.percentEncode
 | 
					 | 
				
			||||||
        )
 | 
					 | 
				
			||||||
        (getQueryParams attributes)
 | 
					        (getQueryParams attributes)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -615,10 +594,3 @@ withAttributes attrs f context =
 | 
				
			||||||
                            |> List.append data.attributes
 | 
					                            |> List.append data.attributes
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
           )
 | 
					           )
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
{-| Attribute that requires a transaction id to be present.
 | 
					 | 
				
			||||||
-}
 | 
					 | 
				
			||||||
withTransactionId : Attribute { a | transaction : () }
 | 
					 | 
				
			||||||
withTransactionId =
 | 
					 | 
				
			||||||
    Context.getTransaction >> ReplaceInUrl "txnId"
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,198 @@
 | 
				
			||||||
 | 
					module Internal.Api.SendMessageEvent.Api exposing (..)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{-|
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Send message event
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This module helps send message events to rooms on the Matrix API.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@docs Phantom
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					-}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import Internal.Api.Api as A
 | 
				
			||||||
 | 
					import Internal.Api.Request as R
 | 
				
			||||||
 | 
					import Internal.Config.Leaks as L
 | 
				
			||||||
 | 
					import Internal.Config.Log exposing (log)
 | 
				
			||||||
 | 
					import Internal.Tools.Json as Json
 | 
				
			||||||
 | 
					import Internal.Values.Envelope as E
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					sendMessageEvent : SendMessageEventInput -> A.TaskChain (Phantom a) (Phantom a)
 | 
				
			||||||
 | 
					sendMessageEvent =
 | 
				
			||||||
 | 
					    A.startWithVersion "r0.0.0" sendMessageEventV1
 | 
				
			||||||
 | 
					        |> A.sameForVersion "r0.0.1"
 | 
				
			||||||
 | 
					        |> A.sameForVersion "r0.1.0"
 | 
				
			||||||
 | 
					        |> A.sameForVersion "r0.2.0"
 | 
				
			||||||
 | 
					        |> A.sameForVersion "r0.3.0"
 | 
				
			||||||
 | 
					        |> A.sameForVersion "r0.4.0"
 | 
				
			||||||
 | 
					        |> A.sameForVersion "r0.5.0"
 | 
				
			||||||
 | 
					        |> A.sameForVersion "r0.6.0"
 | 
				
			||||||
 | 
					        |> A.forVersion "r0.6.1" sendMessageEventV2
 | 
				
			||||||
 | 
					        |> A.forVersion "v1.1" sendMessageEventV3
 | 
				
			||||||
 | 
					        |> A.sameForVersion "v1.2"
 | 
				
			||||||
 | 
					        |> A.sameForVersion "v1.3"
 | 
				
			||||||
 | 
					        |> A.sameForVersion "v1.4"
 | 
				
			||||||
 | 
					        |> A.sameForVersion "v1.5"
 | 
				
			||||||
 | 
					        |> A.sameForVersion "v1.6"
 | 
				
			||||||
 | 
					        |> A.sameForVersion "v1.7"
 | 
				
			||||||
 | 
					        |> A.sameForVersion "v1.8"
 | 
				
			||||||
 | 
					        |> A.sameForVersion "v1.9"
 | 
				
			||||||
 | 
					        |> A.sameForVersion "v1.10"
 | 
				
			||||||
 | 
					        |> A.sameForVersion "v1.11"
 | 
				
			||||||
 | 
					        |> A.versionChain
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type alias Phantom a =
 | 
				
			||||||
 | 
					    a
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type alias PhantomV1 a =
 | 
				
			||||||
 | 
					    { a | accessToken : (), baseUrl : () }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type alias SendMessageEventInput =
 | 
				
			||||||
 | 
					    { content : Json.Value
 | 
				
			||||||
 | 
					    , eventType : String
 | 
				
			||||||
 | 
					    , roomId : String
 | 
				
			||||||
 | 
					    , transactionId : String
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type alias SendMessageEventInputV1 a =
 | 
				
			||||||
 | 
					    { a
 | 
				
			||||||
 | 
					        | content : Json.Value
 | 
				
			||||||
 | 
					        , eventType : String
 | 
				
			||||||
 | 
					        , roomId : String
 | 
				
			||||||
 | 
					        , transactionId : String
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type alias SendMessageEventOutputV1 =
 | 
				
			||||||
 | 
					    { eventId : Maybe String }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type alias SendMessageEventOutputV2 =
 | 
				
			||||||
 | 
					    { eventId : String }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					sendMessageEventV1 : SendMessageEventInputV1 i -> A.TaskChain (PhantomV1 a) (PhantomV1 a)
 | 
				
			||||||
 | 
					sendMessageEventV1 { content, eventType, roomId, transactionId } =
 | 
				
			||||||
 | 
					    A.request
 | 
				
			||||||
 | 
					        { attributes = [ R.fullBody content ]
 | 
				
			||||||
 | 
					        , coder = coderV1
 | 
				
			||||||
 | 
					        , contextChange = always identity
 | 
				
			||||||
 | 
					        , method = "PUT"
 | 
				
			||||||
 | 
					        , path = [ "_matrix", "client", "r0", "rooms", roomId, "send", eventType, transactionId ]
 | 
				
			||||||
 | 
					        , toUpdate =
 | 
				
			||||||
 | 
					            \out ->
 | 
				
			||||||
 | 
					                ( E.More []
 | 
				
			||||||
 | 
					                , out.eventId
 | 
				
			||||||
 | 
					                    |> Maybe.map ((++) ", received event id ")
 | 
				
			||||||
 | 
					                    |> Maybe.withDefault ""
 | 
				
			||||||
 | 
					                    |> (++) "Sent event"
 | 
				
			||||||
 | 
					                    |> log.debug
 | 
				
			||||||
 | 
					                    |> List.singleton
 | 
				
			||||||
 | 
					                )
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					sendMessageEventV2 : SendMessageEventInputV1 i -> A.TaskChain (PhantomV1 a) (PhantomV1 a)
 | 
				
			||||||
 | 
					sendMessageEventV2 { content, eventType, roomId, transactionId } =
 | 
				
			||||||
 | 
					    A.request
 | 
				
			||||||
 | 
					        { attributes = [ R.fullBody content ]
 | 
				
			||||||
 | 
					        , coder = coderV2
 | 
				
			||||||
 | 
					        , contextChange = always identity
 | 
				
			||||||
 | 
					        , method = "PUT"
 | 
				
			||||||
 | 
					        , path = [ "_matrix", "client", "r0", "rooms", roomId, "send", eventType, transactionId ]
 | 
				
			||||||
 | 
					        , toUpdate =
 | 
				
			||||||
 | 
					            \out ->
 | 
				
			||||||
 | 
					                ( E.More []
 | 
				
			||||||
 | 
					                , out.eventId
 | 
				
			||||||
 | 
					                    |> (++) "Sent event, received event id "
 | 
				
			||||||
 | 
					                    |> log.debug
 | 
				
			||||||
 | 
					                    |> List.singleton
 | 
				
			||||||
 | 
					                )
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					sendMessageEventV3 : SendMessageEventInputV1 i -> A.TaskChain (PhantomV1 a) (PhantomV1 a)
 | 
				
			||||||
 | 
					sendMessageEventV3 { content, eventType, roomId, transactionId } =
 | 
				
			||||||
 | 
					    A.request
 | 
				
			||||||
 | 
					        { attributes = [ R.fullBody content ]
 | 
				
			||||||
 | 
					        , coder = coderV2
 | 
				
			||||||
 | 
					        , contextChange = always identity
 | 
				
			||||||
 | 
					        , method = "PUT"
 | 
				
			||||||
 | 
					        , path = [ "_matrix", "client", "v3", "rooms", roomId, "send", eventType, transactionId ]
 | 
				
			||||||
 | 
					        , toUpdate =
 | 
				
			||||||
 | 
					            \out ->
 | 
				
			||||||
 | 
					                ( E.More []
 | 
				
			||||||
 | 
					                , out.eventId
 | 
				
			||||||
 | 
					                    |> (++) "Sent event, received event id "
 | 
				
			||||||
 | 
					                    |> log.debug
 | 
				
			||||||
 | 
					                    |> List.singleton
 | 
				
			||||||
 | 
					                )
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					coderV1 : Json.Coder SendMessageEventOutputV1
 | 
				
			||||||
 | 
					coderV1 =
 | 
				
			||||||
 | 
					    Json.object2
 | 
				
			||||||
 | 
					        { name = "EventResponse"
 | 
				
			||||||
 | 
					        , description =
 | 
				
			||||||
 | 
					            [ "This endpoint is used to send a message event to a room. Message events allow access to historical events and pagination, making them suited for \"once-off\" activity in a room."
 | 
				
			||||||
 | 
					            , "The body of the request should be the content object of the event; the fields in this object will vary depending on the type of event."
 | 
				
			||||||
 | 
					            , "https://spec.matrix.org/legacy/r0.0.0/client_server.html#put-matrix-client-r0-rooms-roomid-send-eventtype-txnid"
 | 
				
			||||||
 | 
					            ]
 | 
				
			||||||
 | 
					        , init = always SendMessageEventOutputV1
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        (Json.field.optional.value
 | 
				
			||||||
 | 
					            { fieldName = L.field
 | 
				
			||||||
 | 
					            , toField = always Nothing
 | 
				
			||||||
 | 
					            , description =
 | 
				
			||||||
 | 
					                [ "The Elm SDK always expects objects to have at least two fields."
 | 
				
			||||||
 | 
					                , "Otherwise, what's the point of hiding the value in an object?"
 | 
				
			||||||
 | 
					                , "For this reason, this empty placeholder key will always be ignored."
 | 
				
			||||||
 | 
					                ]
 | 
				
			||||||
 | 
					            , coder = Json.value
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					        (Json.field.optional.value
 | 
				
			||||||
 | 
					            { fieldName = "event_id"
 | 
				
			||||||
 | 
					            , toField = .eventId
 | 
				
			||||||
 | 
					            , description = Debug.todo "Needs docs"
 | 
				
			||||||
 | 
					            , coder = Json.string
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					coderV2 : Json.Coder SendMessageEventOutputV2
 | 
				
			||||||
 | 
					coderV2 =
 | 
				
			||||||
 | 
					    Json.object2
 | 
				
			||||||
 | 
					        { name = "EventResponse"
 | 
				
			||||||
 | 
					        , description =
 | 
				
			||||||
 | 
					            [ "This endpoint is used to send a message event to a room. Message events allow access to historical events and pagination, making them suited for \"once-off\" activity in a room."
 | 
				
			||||||
 | 
					            , "The body of the request should be the content object of the event; the fields in this object will vary depending on the type of event."
 | 
				
			||||||
 | 
					            , "https://spec.matrix.org/legacy/r0.0.0/client_server.html#put-matrix-client-r0-rooms-roomid-send-eventtype-txnid"
 | 
				
			||||||
 | 
					            ]
 | 
				
			||||||
 | 
					        , init = always SendMessageEventOutputV2
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        (Json.field.optional.value
 | 
				
			||||||
 | 
					            { fieldName = L.field
 | 
				
			||||||
 | 
					            , toField = always Nothing
 | 
				
			||||||
 | 
					            , description =
 | 
				
			||||||
 | 
					                [ "The Elm SDK always expects objects to have at least two fields."
 | 
				
			||||||
 | 
					                , "Otherwise, what's the point of hiding the value in an object?"
 | 
				
			||||||
 | 
					                , "For this reason, this empty placeholder key will always be ignored."
 | 
				
			||||||
 | 
					                ]
 | 
				
			||||||
 | 
					            , coder = Json.value
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					        (Json.field.required
 | 
				
			||||||
 | 
					            { fieldName = "event_id"
 | 
				
			||||||
 | 
					            , toField = .eventId
 | 
				
			||||||
 | 
					            , description = Debug.todo "Needs docs"
 | 
				
			||||||
 | 
					            , coder = Json.string
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
		Loading…
	
		Reference in New Issue