import { atom } from "jotai"; import { APIClient } from "./ApiClient"; const TokenStateKey = "auth-token"; export class AuthApi { /** * Check out whether user is signed in or not */ static get SignedIn(): boolean { return sessionStorage.getItem(TokenStateKey) !== null; } static authStatus = atom(this.SignedIn); /** * Get user auth token */ static get AuthToken(): string { if (!this.SignedIn) throw new Error("User is not authenticated!"); return sessionStorage.getItem(TokenStateKey)!; } /** * Start OpenID login * * @param id The ID of the OIDC provider to use */ static async StartOpenIDLogin(id: string): Promise<{ url: string }> { return ( await APIClient.exec({ uri: "/auth/start_openid_login", method: "POST", jsonData: { provider: id }, }) ).data; } /** * Finish OpenID login */ static async FinishOpenIDLogin(code: string, state: string): Promise { const res: { user_id: number; token: string } = ( await APIClient.exec({ uri: "/auth/finish_openid_login", method: "POST", jsonData: { code: code, state: state }, }) ).data; sessionStorage.setItem(TokenStateKey, res.token); } /** * Sign out */ static async SignOut(): Promise { await APIClient.exec({ uri: "/auth/logout", method: "GET", }); sessionStorage.removeItem(TokenStateKey); } /** * Request to reset password */ static async RequestResetPassword(mail: string): Promise { await APIClient.exec({ uri: "/auth/request_reset_password", method: "POST", jsonData: { mail: mail }, }); } }