Skip to content

Commit 6fffc6e

Browse files
committed
some more experiments
1 parent c757fd6 commit 6fffc6e

File tree

8 files changed

+153
-11
lines changed

8 files changed

+153
-11
lines changed

web/elm.json

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,11 @@
99
"elm/browser": "1.0.2",
1010
"elm/core": "1.0.5",
1111
"elm/html": "1.0.0",
12-
"elm/http": "2.0.0",
12+
"elm/http": "1.0.0",
1313
"elm/json": "1.1.3",
1414
"elm/time": "1.0.0",
1515
"elm/url": "1.0.0",
1616
"hmsk/elm-vite-plugin-helper": "1.0.1",
17-
"lukewestby/elm-http-builder": "8.0.0",
18-
"matheus23/elm-tailwind-modules-base": "1.0.0",
1917
"rtfeldman/elm-css": "18.0.0"
2018
},
2119
"indirect": {

web/src/Api.elm

Lines changed: 57 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,59 @@
1-
module Api exposing (Response)
1+
module Api exposing (..)
22

3+
import Api.Endpoint as Endpoint exposing (Endpoint)
4+
import Http
5+
import Json.Decode exposing (Decoder)
36

4-
type Response
5-
= NoteCreated String
6-
| NoteCreateFailed String
7-
| NoteRead String
8-
| NoteNotFound
7+
8+
{-| The authentication credentials for the Viewer (that is, the currently logged-in user.)
9+
This simply includes the JWT token.
10+
-}
11+
type Cred
12+
= Cred String
13+
14+
15+
credHeader : Cred -> Http.Header
16+
credHeader (Cred c) =
17+
Http.header "Authorization" ("Bearer " ++ c)
18+
19+
20+
21+
-- http
22+
23+
24+
get : Endpoint -> Maybe Cred -> Decoder a -> Http.Request a
25+
get url cred decoder =
26+
Endpoint.request
27+
{ method = "GET"
28+
, url = url
29+
, expect = Http.expectJson decoder
30+
, headers =
31+
case cred of
32+
Just c ->
33+
[ credHeader c ]
34+
35+
Nothing ->
36+
[]
37+
, body = Http.emptyBody
38+
, timeout = Nothing
39+
, withCredentials = False
40+
}
41+
42+
43+
post : Endpoint -> Maybe Cred -> Http.Body -> Decoder a -> Http.Request a
44+
post url cred body decoder =
45+
Endpoint.request
46+
{ method = "POST"
47+
, url = url
48+
, expect = Http.expectJson decoder
49+
, headers =
50+
case cred of
51+
Just c ->
52+
[ credHeader c ]
53+
54+
Nothing ->
55+
[]
56+
, body = body
57+
, timeout = Nothing
58+
, withCredentials = False
59+
}

web/src/Api/Endpoint.elm

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
module Api.Endpoint exposing (..)
2+
3+
import Http
4+
import Url.Builder exposing (QueryParameter)
5+
6+
7+
type Endpoint
8+
= Endpoint String
9+
10+
11+
unwrap : Endpoint -> String
12+
unwrap (Endpoint e) =
13+
e
14+
15+
16+
url : List String -> List QueryParameter -> Endpoint
17+
url paths params =
18+
Endpoint <|
19+
Url.Builder.crossOrigin "http://localhost:8000" ("api" :: "v1" :: paths) params
20+
21+
22+
request :
23+
{ body : Http.Body
24+
, expect : Http.Expect a
25+
, headers : List Http.Header
26+
, method : String
27+
, timeout : Maybe Float
28+
, url : Endpoint
29+
, withCredentials : Bool
30+
}
31+
-> Http.Request a
32+
request c =
33+
Http.request
34+
{ body = c.body
35+
, expect = c.expect
36+
, headers = c.headers
37+
, method = c.method
38+
, timeout = c.timeout
39+
, url = unwrap c.url
40+
, withCredentials = c.withCredentials
41+
}

web/src/Data/Note.elm

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
module Data.Note exposing (..)
2+
3+
import Url.Parser as P exposing (Parser)
4+
5+
6+
type Slug
7+
= Slug String
8+
9+
10+
urlSlugParser : Parser (Slug -> a) a
11+
urlSlugParser =
12+
P.custom "SLUG" (\s -> Just (Slug s))

web/src/Model.elm

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
module Model exposing (Model, Page(..))
22

3-
import Api
43
import Browser.Navigation exposing (Key)
4+
import Viewer exposing (Viewer)
55

66

77
type alias Model =
8-
{ apiResponse : Maybe Api.Response
8+
{ viewer : Viewer
99
, curPage : Page
1010
, navKey : Key
1111
}

web/src/Route.elm

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
module Route exposing (..)
2+
3+
import Data.Note
4+
import Url.Parser as Parser exposing ((</>), Parser)
5+
6+
7+
type Route
8+
= Home
9+
| SignIn
10+
| SignUp
11+
| Logout
12+
| Note Data.Note.Slug
13+
14+
15+
parser : Parser (Route -> a) a
16+
parser =
17+
Parser.oneOf
18+
[ Parser.map Home Parser.top
19+
, Parser.map SignIn (Parser.s "sign-in")
20+
, Parser.map SignUp (Parser.s "sign-up")
21+
, Parser.map Logout (Parser.s "logout")
22+
, Parser.map Note (Parser.s "n" </> Data.Note.urlSlugParser)
23+
]

web/src/Session.elm

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
module Session exposing (..)
2+
3+
4+
type Session
5+
= LoggedIn
6+
| Guest

web/src/Viewer.elm

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
module Viewer exposing (..)
2+
3+
import Api exposing (Cred)
4+
5+
6+
{-| The logged-in user currently viewing this page. It stores enough data to
7+
be able to render the menu bar, along with Cred so it's impossible to have a
8+
Viewer if you aren't logged in.
9+
-}
10+
type Viewer
11+
= Viewer Cred

0 commit comments

Comments
 (0)