Add /whoami API endpoint
parent
4de93e9039
commit
c45ecd2da3
|
@ -0,0 +1,47 @@
|
||||||
|
module Internal.Api.WhoAmI.Api exposing (..)
|
||||||
|
|
||||||
|
import Internal.Api.Request as R
|
||||||
|
import Internal.Api.WhoAmI.V1.SpecObjects as SO1
|
||||||
|
import Internal.Api.WhoAmI.V2.SpecObjects as SO2
|
||||||
|
import Internal.Api.WhoAmI.V3.SpecObjects as SO3
|
||||||
|
import Internal.Tools.Context exposing (Context)
|
||||||
|
import Internal.Tools.Exceptions as X
|
||||||
|
import Internal.Tools.SpecEnums as Enums
|
||||||
|
import Task exposing (Task)
|
||||||
|
|
||||||
|
|
||||||
|
type alias WhoAmIInputV1 =
|
||||||
|
()
|
||||||
|
|
||||||
|
|
||||||
|
type alias WhoAmIOutputV1 =
|
||||||
|
SO1.WhoAmIResponse
|
||||||
|
|
||||||
|
|
||||||
|
type alias WhoAmIOutputV2 =
|
||||||
|
SO2.WhoAmIResponse
|
||||||
|
|
||||||
|
|
||||||
|
type alias WhoAmIOutputV3 =
|
||||||
|
SO3.WhoAmIResponse
|
||||||
|
|
||||||
|
|
||||||
|
whoAmIV1 : WhoAmIInputV1 -> Context { a | accessToken : (), baseUrl : () } -> Task X.Error WhoAmIOutputV1
|
||||||
|
whoAmIV1 _ =
|
||||||
|
R.callApi "GET" "/_matrix/client/r0/account/whoami"
|
||||||
|
>> R.withAttributes [ R.accessToken ]
|
||||||
|
>> R.toTask SO1.whoAmIResponseDecoder
|
||||||
|
|
||||||
|
|
||||||
|
whoAmIV2 : WhoAmIInputV1 -> Context { a | accessToken : (), baseUrl : () } -> Task X.Error WhoAmIOutputV2
|
||||||
|
whoAmIV2 _ =
|
||||||
|
R.callApi "GET" "/_matrix/client/v3/account/whoami"
|
||||||
|
>> R.withAttributes [ R.accessToken ]
|
||||||
|
>> R.toTask SO2.whoAmIResponseDecoder
|
||||||
|
|
||||||
|
|
||||||
|
whoAmIV3 : WhoAmIInputV1 -> Context { a | accessToken : (), baseUrl : () } -> Task X.Error WhoAmIOutputV3
|
||||||
|
whoAmIV3 _ =
|
||||||
|
R.callApi "GET" "/_matrix/client/v3/account/whoami"
|
||||||
|
>> R.withAttributes [ R.accessToken ]
|
||||||
|
>> R.toTask SO3.whoAmIResponseDecoder
|
|
@ -0,0 +1,49 @@
|
||||||
|
module Internal.Api.WhoAmI.Main exposing (..)
|
||||||
|
|
||||||
|
import Internal.Api.WhoAmI.Api as Api
|
||||||
|
import Internal.Api.WhoAmI.V2.Upcast as U2
|
||||||
|
import Internal.Api.WhoAmI.V3.Upcast as U3
|
||||||
|
import Internal.Tools.Context as Context exposing (Context, VBA)
|
||||||
|
import Internal.Tools.Exceptions as X
|
||||||
|
import Internal.Tools.VersionControl as VC
|
||||||
|
import Task exposing (Task)
|
||||||
|
|
||||||
|
|
||||||
|
whoAmI : Context (VBA a) -> WhoAmIInput -> Task X.Error WhoAmIOutput
|
||||||
|
whoAmI context input =
|
||||||
|
VC.withBottomLayer
|
||||||
|
{ current = Api.whoAmIV1
|
||||||
|
, version = "r0.3.0"
|
||||||
|
}
|
||||||
|
|> VC.sameForVersion "r0.4.0"
|
||||||
|
|> VC.sameForVersion "r0.5.0"
|
||||||
|
|> VC.sameForVersion "r0.6.0"
|
||||||
|
|> VC.sameForVersion "r0.6.1"
|
||||||
|
|> VC.addMiddleLayer
|
||||||
|
{ downcast = identity
|
||||||
|
, current = Api.whoAmIV2
|
||||||
|
, upcast = \f c -> Task.map U2.upcastWhoAmIResponse (f c)
|
||||||
|
, version = "v1.1"
|
||||||
|
}
|
||||||
|
|> VC.addMiddleLayer
|
||||||
|
{ downcast = identity
|
||||||
|
, current = Api.whoAmIV3
|
||||||
|
, upcast = \f c -> Task.map U3.upcastWhoAmIResponse (f c)
|
||||||
|
, version = "v1.2"
|
||||||
|
}
|
||||||
|
|> VC.sameForVersion "v1.3"
|
||||||
|
|> VC.sameForVersion "v1.4"
|
||||||
|
|> VC.sameForVersion "v1.5"
|
||||||
|
|> VC.sameForVersion "v1.6"
|
||||||
|
|> VC.mostRecentFromVersionList (Context.getVersions context)
|
||||||
|
|> Maybe.withDefault (always <| always <| Task.fail X.UnsupportedSpecVersion)
|
||||||
|
|> (|>) input
|
||||||
|
|> (|>) context
|
||||||
|
|
||||||
|
|
||||||
|
type alias WhoAmIInput =
|
||||||
|
Api.WhoAmIInputV1
|
||||||
|
|
||||||
|
|
||||||
|
type alias WhoAmIOutput =
|
||||||
|
Api.WhoAmIOutputV3
|
|
@ -0,0 +1,38 @@
|
||||||
|
module Internal.Api.WhoAmI.V1.SpecObjects exposing
|
||||||
|
( WhoAmIResponse
|
||||||
|
, encodeWhoAmIResponse
|
||||||
|
, whoAmIResponseDecoder
|
||||||
|
)
|
||||||
|
|
||||||
|
{-| Automatically generated 'SpecObjects'
|
||||||
|
|
||||||
|
Last generated at Unix time 1679665928
|
||||||
|
|
||||||
|
-}
|
||||||
|
|
||||||
|
import Internal.Tools.EncodeExtra exposing (maybeObject)
|
||||||
|
import Json.Decode as D
|
||||||
|
import Json.Encode as E
|
||||||
|
|
||||||
|
|
||||||
|
{-| Response telling the user to whom their access token belongs.
|
||||||
|
-}
|
||||||
|
type alias WhoAmIResponse =
|
||||||
|
{ userId : String
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
encodeWhoAmIResponse : WhoAmIResponse -> E.Value
|
||||||
|
encodeWhoAmIResponse data =
|
||||||
|
maybeObject
|
||||||
|
[ ( "user_id", Just <| E.string data.userId )
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
whoAmIResponseDecoder : D.Decoder WhoAmIResponse
|
||||||
|
whoAmIResponseDecoder =
|
||||||
|
D.map
|
||||||
|
(\a ->
|
||||||
|
{ userId = a }
|
||||||
|
)
|
||||||
|
(D.field "user_id" D.string)
|
|
@ -0,0 +1,9 @@
|
||||||
|
version: v1
|
||||||
|
name: SpecObjects
|
||||||
|
objects:
|
||||||
|
WhoAmIResponse:
|
||||||
|
description: Response telling the user to whom their access token belongs.
|
||||||
|
fields:
|
||||||
|
user_id:
|
||||||
|
type: string
|
||||||
|
required: true
|
|
@ -0,0 +1,42 @@
|
||||||
|
module Internal.Api.WhoAmI.V2.SpecObjects exposing
|
||||||
|
( WhoAmIResponse
|
||||||
|
, encodeWhoAmIResponse
|
||||||
|
, whoAmIResponseDecoder
|
||||||
|
)
|
||||||
|
|
||||||
|
{-| Automatically generated 'SpecObjects'
|
||||||
|
|
||||||
|
Last generated at Unix time 1679665928
|
||||||
|
|
||||||
|
-}
|
||||||
|
|
||||||
|
import Internal.Tools.DecodeExtra exposing (opField)
|
||||||
|
import Internal.Tools.EncodeExtra exposing (maybeObject)
|
||||||
|
import Json.Decode as D
|
||||||
|
import Json.Encode as E
|
||||||
|
|
||||||
|
|
||||||
|
{-| Response telling the user to whom their access token belongs.
|
||||||
|
-}
|
||||||
|
type alias WhoAmIResponse =
|
||||||
|
{ deviceId : Maybe String
|
||||||
|
, userId : String
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
encodeWhoAmIResponse : WhoAmIResponse -> E.Value
|
||||||
|
encodeWhoAmIResponse data =
|
||||||
|
maybeObject
|
||||||
|
[ ( "device_id", Maybe.map E.string data.deviceId )
|
||||||
|
, ( "user_id", Just <| E.string data.userId )
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
whoAmIResponseDecoder : D.Decoder WhoAmIResponse
|
||||||
|
whoAmIResponseDecoder =
|
||||||
|
D.map2
|
||||||
|
(\a b ->
|
||||||
|
{ deviceId = a, userId = b }
|
||||||
|
)
|
||||||
|
(opField "device_id" D.string)
|
||||||
|
(D.field "user_id" D.string)
|
|
@ -0,0 +1,12 @@
|
||||||
|
version: v1
|
||||||
|
name: SpecObjects
|
||||||
|
objects:
|
||||||
|
WhoAmIResponse:
|
||||||
|
description: Response telling the user to whom their access token belongs.
|
||||||
|
fields:
|
||||||
|
user_id:
|
||||||
|
type: string
|
||||||
|
required: true
|
||||||
|
device_id:
|
||||||
|
type: string
|
||||||
|
required: false
|
|
@ -0,0 +1,9 @@
|
||||||
|
module Internal.Api.WhoAmI.V2.Upcast exposing (..)
|
||||||
|
|
||||||
|
import Internal.Api.WhoAmI.V1.SpecObjects as PO
|
||||||
|
import Internal.Api.WhoAmI.V2.SpecObjects as SO
|
||||||
|
|
||||||
|
|
||||||
|
upcastWhoAmIResponse : PO.WhoAmIResponse -> SO.WhoAmIResponse
|
||||||
|
upcastWhoAmIResponse old =
|
||||||
|
{ userId = old.userId, deviceId = Nothing }
|
|
@ -0,0 +1,45 @@
|
||||||
|
module Internal.Api.WhoAmI.V3.SpecObjects exposing
|
||||||
|
( WhoAmIResponse
|
||||||
|
, encodeWhoAmIResponse
|
||||||
|
, whoAmIResponseDecoder
|
||||||
|
)
|
||||||
|
|
||||||
|
{-| Automatically generated 'SpecObjects'
|
||||||
|
|
||||||
|
Last generated at Unix time 1679665928
|
||||||
|
|
||||||
|
-}
|
||||||
|
|
||||||
|
import Internal.Tools.DecodeExtra exposing (opField, opFieldWithDefault)
|
||||||
|
import Internal.Tools.EncodeExtra exposing (maybeObject)
|
||||||
|
import Json.Decode as D
|
||||||
|
import Json.Encode as E
|
||||||
|
|
||||||
|
|
||||||
|
{-| Response telling the user to whom their access token belongs.
|
||||||
|
-}
|
||||||
|
type alias WhoAmIResponse =
|
||||||
|
{ deviceId : Maybe String
|
||||||
|
, isGuest : Bool
|
||||||
|
, userId : String
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
encodeWhoAmIResponse : WhoAmIResponse -> E.Value
|
||||||
|
encodeWhoAmIResponse data =
|
||||||
|
maybeObject
|
||||||
|
[ ( "device_id", Maybe.map E.string data.deviceId )
|
||||||
|
, ( "is_guest", Just <| E.bool data.isGuest )
|
||||||
|
, ( "user_id", Just <| E.string data.userId )
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
whoAmIResponseDecoder : D.Decoder WhoAmIResponse
|
||||||
|
whoAmIResponseDecoder =
|
||||||
|
D.map3
|
||||||
|
(\a b c ->
|
||||||
|
{ deviceId = a, isGuest = b, userId = c }
|
||||||
|
)
|
||||||
|
(opField "device_id" D.string)
|
||||||
|
(opFieldWithDefault "is_guest" False D.bool)
|
||||||
|
(D.field "user_id" D.string)
|
|
@ -0,0 +1,16 @@
|
||||||
|
version: v1
|
||||||
|
name: SpecObjects
|
||||||
|
objects:
|
||||||
|
WhoAmIResponse:
|
||||||
|
description: Response telling the user to whom their access token belongs.
|
||||||
|
fields:
|
||||||
|
user_id:
|
||||||
|
type: string
|
||||||
|
required: true
|
||||||
|
device_id:
|
||||||
|
type: string
|
||||||
|
required: false
|
||||||
|
is_guest:
|
||||||
|
type: bool
|
||||||
|
required: false
|
||||||
|
default: false
|
|
@ -0,0 +1,9 @@
|
||||||
|
module Internal.Api.WhoAmI.V3.Upcast exposing (..)
|
||||||
|
|
||||||
|
import Internal.Api.WhoAmI.V2.SpecObjects as PO
|
||||||
|
import Internal.Api.WhoAmI.V3.SpecObjects as SO
|
||||||
|
|
||||||
|
|
||||||
|
upcastWhoAmIResponse : PO.WhoAmIResponse -> SO.WhoAmIResponse
|
||||||
|
upcastWhoAmIResponse old =
|
||||||
|
{ deviceId = old.deviceId, isGuest = False, userId = old.userId }
|
Loading…
Reference in New Issue