Fix bugs for MVP
This version now officially works. I have tested it and I will publish an example soon.pull/24/head
							parent
							
								
									12c919b071
								
							
						
					
					
						commit
						2b9370f0c2
					
				|  | @ -287,7 +287,7 @@ fullBody value _ = | ||||||
|     FullBody value |     FullBody value | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| getBody : List ContextAttr -> Json.Value | getBody : List ContextAttr -> Maybe Json.Value | ||||||
| getBody attributes = | getBody attributes = | ||||||
|     attributes |     attributes | ||||||
|         |> List.filterMap |         |> List.filterMap | ||||||
|  | @ -301,8 +301,14 @@ getBody attributes = | ||||||
|             ) |             ) | ||||||
|         |> List.reverse |         |> List.reverse | ||||||
|         |> List.head |         |> List.head | ||||||
|         |> Maybe.withDefault |         |> (\fb -> | ||||||
|             (List.filterMap |                 case fb of | ||||||
|  |                     Just _ -> | ||||||
|  |                         fb | ||||||
|  | 
 | ||||||
|  |                     Nothing -> | ||||||
|  |                         case | ||||||
|  |                             List.filterMap | ||||||
|                 (\attr -> |                 (\attr -> | ||||||
|                     case attr of |                     case attr of | ||||||
|                         BodyParam key value -> |                         BodyParam key value -> | ||||||
|  | @ -312,7 +318,12 @@ getBody attributes = | ||||||
|                             Nothing |                             Nothing | ||||||
|                 ) |                 ) | ||||||
|                 attributes |                 attributes | ||||||
|                 |> E.object |                         of | ||||||
|  |                             [] -> | ||||||
|  |                                 Nothing | ||||||
|  | 
 | ||||||
|  |                             head :: tail -> | ||||||
|  |                                 Just <| E.object (head :: tail) | ||||||
|             ) |             ) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -479,21 +490,21 @@ rawApiCallResolver decoder statusCodeErrors = | ||||||
|                     Http.BadUrl s |                     Http.BadUrl s | ||||||
|                         |> InternetException |                         |> InternetException | ||||||
|                         |> Tuple.pair |                         |> Tuple.pair | ||||||
|                         |> (|>) [] |                         |> (|>) [ log.error ("Encountered bad URL " ++ s) ] | ||||||
|                         |> Err |                         |> Err | ||||||
| 
 | 
 | ||||||
|                 Http.Timeout_ -> |                 Http.Timeout_ -> | ||||||
|                     Http.Timeout |                     Http.Timeout | ||||||
|                         |> InternetException |                         |> InternetException | ||||||
|                         |> Tuple.pair |                         |> Tuple.pair | ||||||
|                         |> (|>) [] |                         |> (|>) [ log.error "Encountered timeout - maybe the server is down?" ] | ||||||
|                         |> Err |                         |> Err | ||||||
| 
 | 
 | ||||||
|                 Http.NetworkError_ -> |                 Http.NetworkError_ -> | ||||||
|                     Http.NetworkError |                     Http.NetworkError | ||||||
|                         |> InternetException |                         |> InternetException | ||||||
|                         |> Tuple.pair |                         |> Tuple.pair | ||||||
|                         |> (|>) [] |                         |> (|>) [ log.error "Encountered a network error - the user might be offline" ] | ||||||
|                         |> Err |                         |> Err | ||||||
| 
 | 
 | ||||||
|                 Http.BadStatus_ metadata body -> |                 Http.BadStatus_ metadata body -> | ||||||
|  | @ -534,7 +545,10 @@ toChain data apiContext = | ||||||
|                         { method = call.method |                         { method = call.method | ||||||
|                         , headers = getHeaders call.attributes |                         , headers = getHeaders call.attributes | ||||||
|                         , url = getUrl call |                         , url = getUrl call | ||||||
|                         , body = Http.jsonBody (getBody call.attributes) |                         , body = | ||||||
|  |                             getBody call.attributes | ||||||
|  |                                 |> Maybe.map Http.jsonBody | ||||||
|  |                                 |> Maybe.withDefault Http.emptyBody | ||||||
|                         , resolver = rawApiCallResolver (Json.decode data.coder) (getStatusCodes call.attributes) |                         , resolver = rawApiCallResolver (Json.decode data.coder) (getStatusCodes call.attributes) | ||||||
|                         , timeout = getTimeout call.attributes |                         , timeout = getTimeout call.attributes | ||||||
|                         } |                         } | ||||||
|  | @ -544,7 +558,10 @@ toChain data apiContext = | ||||||
|                         { method = call.method |                         { method = call.method | ||||||
|                         , headers = getHeaders call.attributes |                         , headers = getHeaders call.attributes | ||||||
|                         , url = getUrl call |                         , url = getUrl call | ||||||
|                         , body = Http.jsonBody (getBody call.attributes) |                         , body = | ||||||
|  |                             getBody call.attributes | ||||||
|  |                                 |> Maybe.map Http.jsonBody | ||||||
|  |                                 |> Maybe.withDefault Http.emptyBody | ||||||
|                         , resolver = |                         , resolver = | ||||||
|                             rawApiCallResolver |                             rawApiCallResolver | ||||||
|                                 (Json.decode data.coder |                                 (Json.decode data.coder | ||||||
|  |  | ||||||
|  | @ -84,7 +84,7 @@ type alias SendMessageEventOutputV2 = | ||||||
| sendMessageEventV1 : SendMessageEventInputV1 i -> A.TaskChain (PhantomV1 a) (PhantomV1 a) | sendMessageEventV1 : SendMessageEventInputV1 i -> A.TaskChain (PhantomV1 a) (PhantomV1 a) | ||||||
| sendMessageEventV1 { content, eventType, roomId, transactionId } = | sendMessageEventV1 { content, eventType, roomId, transactionId } = | ||||||
|     A.request |     A.request | ||||||
|         { attributes = [ R.fullBody content ] |         { attributes = [ R.accessToken, R.fullBody content ] | ||||||
|         , coder = coderV1 |         , coder = coderV1 | ||||||
|         , contextChange = always identity |         , contextChange = always identity | ||||||
|         , method = "PUT" |         , method = "PUT" | ||||||
|  | @ -105,7 +105,7 @@ sendMessageEventV1 { content, eventType, roomId, transactionId } = | ||||||
| sendMessageEventV2 : SendMessageEventInputV1 i -> A.TaskChain (PhantomV1 a) (PhantomV1 a) | sendMessageEventV2 : SendMessageEventInputV1 i -> A.TaskChain (PhantomV1 a) (PhantomV1 a) | ||||||
| sendMessageEventV2 { content, eventType, roomId, transactionId } = | sendMessageEventV2 { content, eventType, roomId, transactionId } = | ||||||
|     A.request |     A.request | ||||||
|         { attributes = [ R.fullBody content ] |         { attributes = [ R.accessToken, R.fullBody content ] | ||||||
|         , coder = coderV2 |         , coder = coderV2 | ||||||
|         , contextChange = always identity |         , contextChange = always identity | ||||||
|         , method = "PUT" |         , method = "PUT" | ||||||
|  | @ -124,7 +124,7 @@ sendMessageEventV2 { content, eventType, roomId, transactionId } = | ||||||
| sendMessageEventV3 : SendMessageEventInputV1 i -> A.TaskChain (PhantomV1 a) (PhantomV1 a) | sendMessageEventV3 : SendMessageEventInputV1 i -> A.TaskChain (PhantomV1 a) (PhantomV1 a) | ||||||
| sendMessageEventV3 { content, eventType, roomId, transactionId } = | sendMessageEventV3 { content, eventType, roomId, transactionId } = | ||||||
|     A.request |     A.request | ||||||
|         { attributes = [ R.fullBody content ] |         { attributes = [ R.accessToken, R.fullBody content ] | ||||||
|         , coder = coderV2 |         , coder = coderV2 | ||||||
|         , contextChange = always identity |         , contextChange = always identity | ||||||
|         , method = "PUT" |         , method = "PUT" | ||||||
|  | @ -165,7 +165,7 @@ coderV1 = | ||||||
|         (Json.field.optional.value |         (Json.field.optional.value | ||||||
|             { fieldName = "event_id" |             { fieldName = "event_id" | ||||||
|             , toField = .eventId |             , toField = .eventId | ||||||
|             , description = Debug.todo "Needs docs" |             , description = [ "A unique identifier for the event." ] | ||||||
|             , coder = Json.string |             , coder = Json.string | ||||||
|             } |             } | ||||||
|         ) |         ) | ||||||
|  | @ -196,7 +196,7 @@ coderV2 = | ||||||
|         (Json.field.required |         (Json.field.required | ||||||
|             { fieldName = "event_id" |             { fieldName = "event_id" | ||||||
|             , toField = .eventId |             , toField = .eventId | ||||||
|             , description = Debug.todo "Needs docs" |             , description = [ "A unique identifier for the event." ] | ||||||
|             , coder = Json.string |             , coder = Json.string | ||||||
|             } |             } | ||||||
|         ) |         ) | ||||||
|  |  | ||||||
|  | @ -318,23 +318,28 @@ init sn = | ||||||
| -} | -} | ||||||
| mostPopularToken : Context -> Maybe String | mostPopularToken : Context -> Maybe String | ||||||
| mostPopularToken c = | mostPopularToken c = | ||||||
|     c.accessTokens |     case c.suggestedAccessToken of | ||||||
|         |> Hashdict.values |         Just _ -> | ||||||
|         |> List.sortBy |             c.suggestedAccessToken | ||||||
|             (\token -> |  | ||||||
|                 case token.expiryMs of |  | ||||||
|                     Nothing -> |  | ||||||
|                         ( 0, Timestamp.toMs token.created ) |  | ||||||
| 
 | 
 | ||||||
|                     Just e -> |         Nothing -> | ||||||
|                         ( 1 |             c.accessTokens | ||||||
|                         , token.created |                 |> Hashdict.values | ||||||
|                             |> Timestamp.add e |                 |> List.sortBy | ||||||
|                             |> Timestamp.toMs |                     (\token -> | ||||||
|                         ) |                         case token.expiryMs of | ||||||
|             ) |                             Nothing -> | ||||||
|         |> List.head |                                 ( 0, Timestamp.toMs token.created ) | ||||||
|         |> Maybe.map .value | 
 | ||||||
|  |                             Just e -> | ||||||
|  |                                 ( 1 | ||||||
|  |                                 , token.created | ||||||
|  |                                     |> Timestamp.add e | ||||||
|  |                                     |> Timestamp.toMs | ||||||
|  |                                 ) | ||||||
|  |                     ) | ||||||
|  |                 |> List.head | ||||||
|  |                 |> Maybe.map .value | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| {-| Reset the phantom type of the Context, effectively forgetting all values. | {-| Reset the phantom type of the Context, effectively forgetting all values. | ||||||
|  |  | ||||||
|  | @ -1,7 +1,7 @@ | ||||||
| module Matrix exposing | module Matrix exposing | ||||||
|     ( Vault |     ( Vault, fromUserId | ||||||
|     , VaultUpdate, update |     , VaultUpdate, update | ||||||
|     , sendMessageEvent, fromUserId, addAccessToken |     , addAccessToken, sendMessageEvent | ||||||
|     ) |     ) | ||||||
| 
 | 
 | ||||||
| {-| | {-| | ||||||
|  | @ -35,10 +35,10 @@ support a monolithic public registry. (: | ||||||
| 
 | 
 | ||||||
| import Internal.Api.Main as Api | import Internal.Api.Main as Api | ||||||
| import Internal.Values.Envelope as Envelope | import Internal.Values.Envelope as Envelope | ||||||
|  | import Internal.Values.User as User | ||||||
| import Internal.Values.Vault as Internal | import Internal.Values.Vault as Internal | ||||||
| import Json.Encode as E | import Json.Encode as E | ||||||
| import Types exposing (Vault(..), VaultUpdate(..)) | import Types exposing (Vault(..), VaultUpdate(..)) | ||||||
| import Internal.Values.User as User |  | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| {-| The Vault type stores all relevant information about the Matrix API. | {-| The Vault type stores all relevant information about the Matrix API. | ||||||
|  | @ -56,19 +56,22 @@ type alias Vault = | ||||||
| type alias VaultUpdate = | type alias VaultUpdate = | ||||||
|     Types.VaultUpdate |     Types.VaultUpdate | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| addAccessToken : String -> Vault -> Vault | addAccessToken : String -> Vault -> Vault | ||||||
| addAccessToken token (Vault vault) = | addAccessToken token (Vault vault) = | ||||||
|     Envelope.mapContext (\c -> { c | suggestedAccessToken = Just token }) vault |     Envelope.mapContext (\c -> { c | suggestedAccessToken = Just token }) vault | ||||||
|         |> Vault |         |> Vault | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| {-| Use a fully-fledged Matrix ID to connect. | {-| Use a fully-fledged Matrix ID to connect. | ||||||
| 
 | 
 | ||||||
|     case Matrix.fromUserId "@alice:example.org" of |     case Matrix.fromUserId "@alice:example.org" of | ||||||
|         Just vault -> |         Just vault -> | ||||||
|             "We got a vault!" |             "We got a vault!" | ||||||
|          | 
 | ||||||
|         Nothing -> |         Nothing -> | ||||||
|             "Invalid username" |             "Invalid username" | ||||||
|  | 
 | ||||||
| -} | -} | ||||||
| fromUserId : String -> Maybe Vault | fromUserId : String -> Maybe Vault | ||||||
| fromUserId = | fromUserId = | ||||||
|  | @ -76,12 +79,13 @@ fromUserId = | ||||||
|         >> Maybe.map |         >> Maybe.map | ||||||
|             (\u -> |             (\u -> | ||||||
|                 Envelope.init |                 Envelope.init | ||||||
|                     { serverName = User.domain u |                     { serverName = "https://" ++ User.domain u | ||||||
|                     , content = Internal.init u |                     , content = Internal.init u | ||||||
|                     } |                     } | ||||||
|             ) |             ) | ||||||
|         >> Maybe.map Vault |         >> Maybe.map Vault | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| {-| Send a message event to a room. | {-| Send a message event to a room. | ||||||
| 
 | 
 | ||||||
| This function can be used in a scenario where the user does not want to sync | This function can be used in a scenario where the user does not want to sync | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue