diff --git a/admin/main.go b/admin/main.go index d18d5d6..349acc9 100644 --- a/admin/main.go +++ b/admin/main.go @@ -59,7 +59,7 @@ func makeGetReq(url string) ([]byte, error) { return nil, err } - req.Header.Set("Authorization", token) + req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", token)) res, err := http.DefaultClient.Do(req) if err != nil { return nil, err @@ -84,7 +84,7 @@ func makePostReq(url string, body any) ([]byte, error) { return nil, err } - req.Header.Set("Authorization", token) + req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", token)) req.Header.Set("Content-Type", "application/json") res, err := http.DefaultClient.Do(req) if err != nil { diff --git a/web/.dockerignore b/web/.dockerignore new file mode 100644 index 0000000..9b09935 --- /dev/null +++ b/web/.dockerignore @@ -0,0 +1,10 @@ +.idea/ +.vscode/ + +node_modules/ +.output/ +.data/ +.nuxt/ +.cache/ + +.env* diff --git a/web/Dockerfile b/web/Dockerfile new file mode 100644 index 0000000..70acc9f --- /dev/null +++ b/web/Dockerfile @@ -0,0 +1,20 @@ +FROM oven/bun:1 AS build + +WORKDIR /app + +COPY package.json bun.lock . +RUN bun install --frozen-lockfile --production + +COPY . . +RUN bun run build + +FROM oven/bun:1 + +WORKDIR /app +COPY --from=build /app/.output . + +ENV PORT 3000 +ENV HOST 0.0.0.0 + +EXPOSE 3000 +CMD ["bun", "/app/server/index.mjs"] diff --git a/web/composables/useAPI.ts b/web/composables/useAPI.ts new file mode 100644 index 0000000..3a3dff1 --- /dev/null +++ b/web/composables/useAPI.ts @@ -0,0 +1,39 @@ +import type { FetchResponse } from "ofetch" + +export function useAPI(route: string = "/") { + return `https://api.door.svitan.dev${route}` +} + +export async function handleRequestError({ error }: { error: Error }) { + const toast = useToast() + toast.add({ + title: "Error occurred", + description: error.message, + color: "error", + }) +} + +export function handleResponse( + success: (response: FetchResponse) => Promise | void +) { + const token = useToken() + const toast = useToast() + + return async function ({ response }: { response: FetchResponse }) { + console.log(response) + // console.log(await response.text()) + if (response.status === 200) { + await success(response.clone()) + } else if (response.status === 401) { + toast.add({ title: "Token not valid", color: "error" }) + token.value = "" + navigateTo("/token") + } else { + toast.add({ + title: "Error occurred", + description: await response.text(), + color: "error", + }) + } + } +} diff --git a/web/composables/useToken.ts b/web/composables/useToken.ts index 34be5ae..feeb528 100644 --- a/web/composables/useToken.ts +++ b/web/composables/useToken.ts @@ -1,3 +1,10 @@ export function useToken() { - return useCookie("token"); + return useCookie("token") +} + +export function useHeaders() { + const token = useToken() + return { + Authorization: `Bearer ${token.value}` + } } diff --git a/web/pages/index.vue b/web/pages/index.vue index cd185d5..f1c8077 100644 --- a/web/pages/index.vue +++ b/web/pages/index.vue @@ -47,7 +47,7 @@ :color="locked ? 'primary' : 'secondary'" variant="solid" class="flex items-center justify-center w-full h-10" - @click="() => (locked = !locked)" + @click="toggleLock" > {{ locked ? "Unlock" : "Lock" }} @@ -87,14 +87,44 @@ diff --git a/web/pages/token.vue b/web/pages/token.vue index 906f9e2..ab29245 100644 --- a/web/pages/token.vue +++ b/web/pages/token.vue @@ -37,33 +37,17 @@ const toast = useToast() async function onSubmit(event: FormSubmitEvent) { const received = event.data.token - await $fetch("https://door.svitan.dev/open", { + await $fetch(useAPI("/open"), { method: "GET", headers: { Authorization: `Bearer ${received}`, }, - async onRequestError({ error }) { - toast.add({ - title: "Error occurred", - description: error.message, - color: "error", - }) - }, - async onResponse({ response }) { - if (response.status === 200) { - toast.add({ title: "Token saved", color: "success" }) - token.value = received - navigateTo("/") - } else if (response.status === 401) { - toast.add({ title: "Token not valid", color: "error" }) - } else { - toast.add({ - title: "Error occurred", - description: await response.text(), - color: "error", - }) - } - }, + onRequestError: handleRequestError, + onResponse: handleResponse(() => { + toast.add({ title: "Token saved", color: "success" }) + token.value = received + navigateTo("/") + }), }) }