86 lines
1.9 KiB
Elm
86 lines
1.9 KiB
Elm
module Viewer.Cred exposing (Cred, addHeader, addHeaderIfAvailable, decoder, encodeToken, username)
|
|
|
|
{-| The authentication credentials for the Viewer (that is, the currently logged-in user.)
|
|
|
|
This includes:
|
|
|
|
- The cred's Username
|
|
- The cred's authentication token
|
|
|
|
By design, there is no way to access the token directly as a String.
|
|
It can be encoded for persistence, and it can be added to a header
|
|
to a HttpBuilder for a request, but that's it.
|
|
|
|
This token should never be rendered to the end user, and with this API, it
|
|
can't be!
|
|
|
|
-}
|
|
|
|
import HttpBuilder exposing (RequestBuilder, withHeader)
|
|
import Json.Decode as Decode exposing (Decoder)
|
|
import Json.Decode.Pipeline exposing (required)
|
|
import Json.Encode as Encode exposing (Value)
|
|
import Username exposing (Username)
|
|
|
|
|
|
{-| The authentication token for the currently logged-in user.
|
|
|
|
The token records the username associated with this token, which you can ask it for.
|
|
|
|
By design, there is no way to access the token directly as a String. You can encode it for persistence, and you can add it to a header to a HttpBuilder for a request, but that's it.
|
|
|
|
-}
|
|
|
|
|
|
|
|
-- TYPES
|
|
|
|
|
|
type Cred
|
|
= Cred Username String
|
|
|
|
|
|
|
|
-- INFO
|
|
|
|
|
|
username : Cred -> Username
|
|
username (Cred val _) =
|
|
val
|
|
|
|
|
|
|
|
-- SERIALIZATION
|
|
|
|
|
|
decoder : Decoder Cred
|
|
decoder =
|
|
Decode.succeed Cred
|
|
|> required "username" Username.decoder
|
|
|> required "token" Decode.string
|
|
|
|
|
|
|
|
-- TRANSFORM
|
|
|
|
|
|
encodeToken : Cred -> Value
|
|
encodeToken (Cred _ str) =
|
|
Encode.string str
|
|
|
|
|
|
addHeader : Cred -> RequestBuilder a -> RequestBuilder a
|
|
addHeader (Cred _ str) builder =
|
|
builder
|
|
|> withHeader "authorization" ("Token " ++ str)
|
|
|
|
|
|
addHeaderIfAvailable : Maybe Cred -> RequestBuilder a -> RequestBuilder a
|
|
addHeaderIfAvailable maybeCred builder =
|
|
case maybeCred of
|
|
Just cred ->
|
|
addHeader cred builder
|
|
|
|
Nothing ->
|
|
builder
|