diff options
| -rw-r--r-- | .dockerignore | 4 | ||||
| -rw-r--r-- | Dockerfile | 12 | ||||
| -rw-r--r-- | docker-compose.yml | 16 | ||||
| -rw-r--r-- | main.js | 11 | ||||
| -rw-r--r-- | src/Config.elm | 12 | ||||
| -rw-r--r-- | src/Main.elm | 45 | ||||
| -rw-r--r-- | src/Types.elm | 7 |
7 files changed, 76 insertions, 31 deletions
diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..e753a0d --- /dev/null +++ b/.dockerignore @@ -0,0 +1,4 @@ +.dockerignore +node_modules +dist/ +elm-stuff/ diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..48631fb --- /dev/null +++ b/Dockerfile @@ -0,0 +1,12 @@ +FROM node:17 AS builder + +WORKDIR /app + +COPY package.json package-lock.json ./ +RUN npm ci --only-prod +COPY . ./ +RUN npm run build + +FROM halverneus/static-file-server:latest AS server + +COPY --from=builder /app/dist /web diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..5904174 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,16 @@ +version: '3' + +services: + api: + image: williamyeh/json-server:latest + command: --watch -p 80 /data/db.json + volumes: + - ./db.json:/data/db.json + ports: + - "5678:80" + somebook: + build: + context: . + image: registry.digitalocean.com/jan-systems-registry/somebook:latest + ports: + - "1234:8080" @@ -97,10 +97,15 @@ window.onload = async() => { const runElmApp = async() => { try { const user = await auth0.getUser(); + + const isProd = location.host.endsWith("jan.systems"); const flags = { - email: user.email, - name: user.name, - pictureUrl: user.picture, + userData: { + email: user.email, + name: user.name, + pictureUrl: user.picture, + }, + apiURL: isProd ? "https://bookapi.jan.systems" : "http://localhost:5678", }; const app = Elm.Main.init({ diff --git a/src/Config.elm b/src/Config.elm index 397bc38..95a15dd 100644 --- a/src/Config.elm +++ b/src/Config.elm @@ -1,22 +1,18 @@ module Config exposing (ApiResource(..), makeApiUrl) +import Types exposing (Model) import Utils exposing (templ) -baseUrl : String -baseUrl = - "http://localhost:3000" - - type ApiResource = ApiPosts | ApiLikePost String | ApiCompose -makeApiUrl : ApiResource -> String -makeApiUrl res = - String.replace "{baseUrl}" baseUrl <| +makeApiUrl : Model -> ApiResource -> String +makeApiUrl model res = + String.replace "{baseUrl}" model.apiURL <| case res of ApiPosts -> "{baseUrl}/posts?_sort=createdAt&_order=desc" diff --git a/src/Main.elm b/src/Main.elm index 8182eb0..71cda11 100644 --- a/src/Main.elm +++ b/src/Main.elm @@ -12,12 +12,12 @@ import Pages.Feed exposing (feedView) import RemoteData import Task import Time -import Types exposing (Author, Model, Msg(..), Post, UserData) +import Types exposing (Author, Flags, Model, Msg(..), Post) import Url exposing (Url) import Utils exposing (httpErrorToString, listFlat) -main : Program UserData Model Msg +main : Program Flags Model Msg main = Browser.application { init = init @@ -43,16 +43,21 @@ port requestLogout : () -> Cmd msg -- INIT -init : UserData -> Url -> Key -> ( Model, Cmd Msg ) -init userData _ key = - ( { now = Time.millisToPosix 0 - , key = key - , userData = userData - , posts = RemoteData.Loading - , composeInputValue = "" - } +init : Flags -> Url -> Key -> ( Model, Cmd Msg ) +init flags _ key = + let + initModel = + { now = Time.millisToPosix 0 + , key = key + , userData = flags.userData + , apiURL = flags.apiURL + , posts = RemoteData.Loading + , composeInputValue = "" + } + in + ( initModel , Cmd.batch - [ getPosts + [ getPosts initModel , Task.perform SetNowPosix Time.now ] ) @@ -75,7 +80,7 @@ update msg model = ( model, requestLogout () ) GetPosts -> - ( model, getPosts ) + ( model, getPosts model ) GotPosts (Result.Ok posts) -> ( { model | posts = RemoteData.Success posts }, Cmd.none ) @@ -86,7 +91,7 @@ update msg model = ) LikePost post -> - ( model, likePost post ) + ( model, likePost model post ) LikedPost (Result.Ok post) -> ( { model | posts = RemoteData.map (replaceMatchingPost post) model.posts } @@ -137,20 +142,20 @@ replaceMatchingPost post posts = posts -getPosts : Cmd Msg -getPosts = +getPosts : Model -> Cmd Msg +getPosts model = Http.get - { url = makeApiUrl Config.ApiPosts + { url = makeApiUrl model Config.ApiPosts , expect = Http.expectJson GotPosts postsDecoder } -likePost : Post -> Cmd Msg -likePost post = +likePost : Model -> Post -> Cmd Msg +likePost model post = Http.request { method = "PATCH" , headers = [] - , url = makeApiUrl (Config.ApiLikePost post.id) + , url = makeApiUrl model (Config.ApiLikePost post.id) , body = Http.jsonBody (Json.Encode.object @@ -165,7 +170,7 @@ likePost post = composePost : Model -> Cmd Msg composePost model = Http.post - { url = makeApiUrl Config.ApiCompose + { url = makeApiUrl model Config.ApiCompose , expect = Http.expectJson ComposedPost postDecoder , body = Http.jsonBody diff --git a/src/Types.elm b/src/Types.elm index d5068d6..2438932 100644 --- a/src/Types.elm +++ b/src/Types.elm @@ -10,11 +10,18 @@ type alias Model = { now : Time.Posix , key : Key , userData : UserData + , apiURL : String , posts : RemoteData (List Post) , composeInputValue : String } +type alias Flags = + { userData : UserData + , apiURL : String + } + + type alias UserData = { name : String , email : String |
