Add part2, clean up part1 some

This commit is contained in:
Richard Feldman
2018-08-05 07:19:09 -04:00
parent c247c24a23
commit 2163df4cb3
53 changed files with 5419 additions and 72 deletions

View File

@@ -0,0 +1,60 @@
module Viewer.Cred exposing (Cred, addHeader, addHeaderIfAvailable, decoder, encodeToken)
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)
-- TYPES
type alias Cred =
-- 👉 TODO make Cred an opaque type, then fix the resulting compiler errors.
-- Afterwards, it should no longer be possible for any other module to access
-- this `token` vale directly!
--
-- 💡 HINT: Other modules still depend on being able to access the
-- `username` value. Expand this module's API to expose a new way for them
-- to access the `username` without also giving them access to `token`.
{ username : Username
, token : String
}
-- SERIALIZATION
decoder : Decoder Cred
decoder =
Decode.succeed Cred
|> required "username" Username.decoder
|> required "token" Decode.string
-- TRANSFORM
encodeToken : Cred -> Value
encodeToken cred =
Encode.string cred.token
addHeader : Cred -> RequestBuilder a -> RequestBuilder a
addHeader cred builder =
builder
|> withHeader "authorization" ("Token " ++ cred.token)
addHeaderIfAvailable : Maybe Cred -> RequestBuilder a -> RequestBuilder a
addHeaderIfAvailable maybeCred builder =
case maybeCred of
Just cred ->
addHeader cred builder
Nothing ->
builder