From 4dbef3fcd7a14437d55c555cf10d50de8e50d7d1 Mon Sep 17 00:00:00 2001 From: ivarlovlie Date: Fri, 9 Dec 2022 11:57:12 +0900 Subject: feat: Move everything out of $lib --- code/app/src/services/account-service.ts | 116 +++++++++++++++++++++++++++++++ 1 file changed, 116 insertions(+) create mode 100644 code/app/src/services/account-service.ts (limited to 'code/app/src/services/account-service.ts') diff --git a/code/app/src/services/account-service.ts b/code/app/src/services/account-service.ts new file mode 100644 index 0000000..9d45950 --- /dev/null +++ b/code/app/src/services/account-service.ts @@ -0,0 +1,116 @@ +import {http_delete_async, http_get_async, http_post_async} from "$api/_fetch"; +import {api_base, CookieNames, StorageKeys} from "$configuration"; +import {is_known_problem} from "$models/internal/KnownProblem"; +import {log_debug} from "$help/logger"; +import {StoreType, writable_persistent} from "$help/persistent-store"; +import {get} from "svelte/store"; +import type {Writable} from "svelte/store"; +import {Temporal} from "temporal-polyfill"; +import type { + CreateAccountPayload, + CreateAccountResponse, + DeleteAccountResponse, + IAccountService, + LoginPayload, + LoginResponse, + Session, + UpdateAccountPayload, + UpdateAccountResponse, +} from "./abstractions/IAccountService"; + +export class AccountService implements IAccountService { + session: Writable; + private sessionCooldown = 3600; + + constructor() { + this.session = writable_persistent({ + name: StorageKeys.session, + initialState: {} as Session, + options: { + store: StoreType.LOCAL, + }, + }); + this.refresh_session(); + } + + async refresh_session(forceRefresh: boolean = false): Promise { + const currentValue = get(this.session); + const currentEpoch = Temporal.Now.instant().epochSeconds; + if (currentValue?._lastUpdated + this.sessionCooldown < currentEpoch) { + log_debug("Session is not stale yet", { + currentEpoch, + staleEpoch: currentValue?._lastUpdated + this.sessionCooldown, + }); + return; + } + const sessionResponse = await http_get_async(api_base("_/account/session")); + if (sessionResponse.ok) { + + } + } + + async end_session(callback: Function): Promise { + await this.logout_async(); + this.session.set(null); + if (typeof callback === "function") callback(); + return; + } + + async login_async(payload: LoginPayload): Promise { + const response = await http_post_async(api_base("_/account/login"), payload); + if (response.ok) return {isLoggedIn: true}; + if (is_known_problem(response)) return { + isLoggedIn: false, + knownProblem: await response.json(), + }; + return { + isLoggedIn: false, + }; + } + + async logout_async(): Promise { + const response = await http_get_async(api_base("_/account/logout")); + + if (!response.ok) { + const deleteCookieResponse = await fetch("/delete-cookie?key=" + CookieNames.session); + if (!deleteCookieResponse.ok) { + throw new Error("Could neither logout nor delete session cookie."); + } + } + + return; + } + + async create_account_async(payload: CreateAccountPayload): Promise { + const response = await http_post_async(api_base("_/account/create"), payload); + if (response.ok) return {isCreated: true}; + if (is_known_problem(response)) return { + isCreated: false, + knownProblem: await response.json(), + }; + + return { + isCreated: false, + }; + } + + async delete_current_async(): Promise { + const response = await http_delete_async(api_base("_/account/delete")); + return { + isDeleted: response.ok, + }; + } + + async update_current_async(payload: UpdateAccountPayload): Promise { + const response = await http_post_async(api_base("_/account/update"), payload); + if (response.ok) return {isUpdated: true}; + if (is_known_problem(response)) return { + isUpdated: false, + knownProblem: await response.json(), + }; + + return { + isUpdated: false, + }; + } +} \ No newline at end of file -- cgit v1.3