diff options
| author | ivarlovlie <git@ivarlovlie.no> | 2022-12-09 03:57:12 +0100 |
|---|---|---|
| committer | ivarlovlie <git@ivarlovlie.no> | 2022-12-09 03:57:12 +0100 |
| commit | 4dbef3fcd7a14437d55c555cf10d50de8e50d7d1 (patch) | |
| tree | 632589ecfcfb4dfddeafb71d0077257584b5e7ec /code/app/src/lib/api | |
| parent | 914c75e0ceeb3e11ddd55e94bb461c26b0db5b7a (diff) | |
| download | greatoffice-4dbef3fcd7a14437d55c555cf10d50de8e50d7d1.tar.xz greatoffice-4dbef3fcd7a14437d55c555cf10d50de8e50d7d1.zip | |
feat: Move everything out of $lib
Diffstat (limited to 'code/app/src/lib/api')
| -rw-r--r-- | code/app/src/lib/api/_fetch.ts | 95 | ||||
| -rw-r--r-- | code/app/src/lib/api/account/index.ts | 39 | ||||
| -rw-r--r-- | code/app/src/lib/api/api-tokens/index.ts | 23 | ||||
| -rw-r--r-- | code/app/src/lib/api/projects/index.ts | 12 |
4 files changed, 0 insertions, 169 deletions
diff --git a/code/app/src/lib/api/_fetch.ts b/code/app/src/lib/api/_fetch.ts deleted file mode 100644 index c29d262..0000000 --- a/code/app/src/lib/api/_fetch.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { Temporal } from "temporal-polyfill"; -import { clear_session_data } from "$lib/session"; -import { redirect } from "@sveltejs/kit"; -import { browser } from "$app/environment"; -import { goto } from "$app/navigation"; -import { SignInPageMessage, signInPageMessageQueryKey } from "$routes/(main)/(public)/sign-in"; -import { log_error } from "$lib/logger"; - -export async function http_post_async(url: string, body?: object | string, timeout = -1, skip_401_check = false, abort_signal?: AbortSignal): Promise<Response> { - const init = make_request_init("post", body, abort_signal); - const response = await internal_fetch_async({ url, init, timeout }); - if (!skip_401_check && await redirect_if_401_async(response)) throw new Error("Server returned 401"); - return response; -} - -export async function http_get_async(url: string, timeout = -1, skip_401_check = false, abort_signal?: AbortSignal): Promise<Response> { - const init = make_request_init("get", undefined, abort_signal); - const response = await internal_fetch_async({ url, init, timeout }); - if (!skip_401_check && await redirect_if_401_async(response)) throw new Error("Server returned 401"); - return response; -} - -export async function http_delete_async(url: string, body?: object | string, timeout = -1, skip_401_check = false, abort_signal?: AbortSignal): Promise<Response> { - const init = make_request_init("delete", body, abort_signal); - const response = await internal_fetch_async({ url, init, timeout }); - if (!skip_401_check && await redirect_if_401_async(response)) throw new Error("Server returned 401"); - return response; -} - -async function internal_fetch_async(request: InternalFetchRequest): Promise<Response> { - if (!request.init) throw new Error("request.init is required"); - const fetch_request = new Request(request.url, request.init); - let response: any; - - try { - if (request.timeout && request.timeout > 500) { - response = await Promise.race([ - fetch(fetch_request), - new Promise((_, reject) => setTimeout(() => reject(new Error("Timeout")), request.timeout)), - ]); - } else { - response = await fetch(fetch_request); - } - } catch (error: any) { - log_error(error); - if (error.message === "Timeout") { - console.error("Request timed out"); - } else if (error.message === "Network request failed") { - console.error("No internet connection"); - } else { - throw error; - } - } - - return response; -} - -async function redirect_if_401_async(response: Response): Promise<boolean> { - if (response.status === 401) { - const redirectUrl = `/sign-in?${signInPageMessageQueryKey}=${SignInPageMessage.LOGGED_OUT}`; - clear_session_data(); - if (browser) { - await goto(redirectUrl); - } else { - throw redirect(307, redirectUrl); - } - } - return false; -} - -function make_request_init(method: string, body?: any, signal?: AbortSignal): RequestInit { - const init = { - method, - credentials: "include", - signal, - headers: { - "X-TimeZone": Temporal.Now.timeZone().id, - }, - } as RequestInit; - - if (body) { - init.body = JSON.stringify(body); - init.headers["Content-Type"] = "application/json;charset=UTF-8"; - } - - return init; -} - - -export type InternalFetchRequest = { - url: string, - init: RequestInit, - timeout?: number - retry_count?: number, -}
\ No newline at end of file diff --git a/code/app/src/lib/api/account/index.ts b/code/app/src/lib/api/account/index.ts deleted file mode 100644 index 6dbcdc8..0000000 --- a/code/app/src/lib/api/account/index.ts +++ /dev/null @@ -1,39 +0,0 @@ -import {api_base} from "$lib/configuration"; -import {http_delete_async, http_get_async, http_post_async} from "../_fetch"; - -export const http_account = { - login_async(payload: LoginPayload): Promise<Response> { - return http_post_async(api_base("_/account/login"), payload); - }, - logout_async(): Promise<Response> { - return http_get_async(api_base("_/account/logout")); - }, - delete_account_async(): Promise<Response> { - return http_delete_async(api_base("_/account/delete")); - }, - update_profile_async(payload: UpdateProfilePayload): Promise<Response> { - return http_post_async(api_base("_/account/update"), payload); - }, - create_account_async(payload: CreateAccountPayload): Promise<Response> { - return http_post_async(api_base("_/account/create"), payload); - }, - get_profile_async(suppress_401: boolean): Promise<Response> { - return http_get_async(api_base("_/account"), 0, suppress_401); - }, -}; - -export interface CreateAccountPayload { - username: string, - password: string -} - -export interface LoginPayload { - username: string, - password: string, - persist: boolean -} - -export interface UpdateProfilePayload { - username?: string, - password?: string, -} diff --git a/code/app/src/lib/api/api-tokens/index.ts b/code/app/src/lib/api/api-tokens/index.ts deleted file mode 100644 index 77bfd91..0000000 --- a/code/app/src/lib/api/api-tokens/index.ts +++ /dev/null @@ -1,23 +0,0 @@ -import {http_delete_async, http_get_async, http_post_async} from "src/lib/api/_fetch"; -import {api_base} from "src/lib/configuration"; -import type {Temporal} from "temporal-polyfill"; - -export const http_api_tokens = { - create_token_async(payload: CreateTokenPayload): Promise<Response> { - return http_post_async(api_base("v1/api-tokens/create"), payload); - }, - delete_token_async(id: string): Promise<Response> { - return http_delete_async(api_base("v1/api-tokens/delete?id=" + id)); - }, - get_tokens_async(): Promise<Response> { - return http_get_async(api_base("v1/api-tokens")) - }, -}; - -export type CreateTokenPayload = { - expiryDate: Temporal.PlainDateTime, - allowRead: boolean, - allowCreate: boolean, - allowUpdate: boolean, - allowDelete: boolean -}
\ No newline at end of file diff --git a/code/app/src/lib/api/projects/index.ts b/code/app/src/lib/api/projects/index.ts deleted file mode 100644 index ea49631..0000000 --- a/code/app/src/lib/api/projects/index.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { api_base } from "$lib/configuration"; -import { http_post_async } from "../_fetch"; - -export const http_projects = { - create_async(payload: CreateProjectPayload): Promise<Response> { - return http_post_async(api_base("projects/create", true), payload); - } -}; - -export type CreateProjectPayload = { - name: "" -}
\ No newline at end of file |
