import {apiRequest} from '@/lib/api/client'; import {clearStoredOpenFlareToken, setStoredOpenFlareToken,} from '@/lib/api/auth-token'; import type {AuthUser, LoginPayload, PasswordResetRequestPayload, RegisterPayload,} from '@/types/auth'; export function getCurrentUser() { return apiRequest('/user/self'); } export function login(payload: LoginPayload) { const { cap_token, ...body } = payload; const headers: Record = {}; if (cap_token) { headers['X-Cap-Token'] = cap_token; } return apiRequest('/user/login', { method: 'POST', headers, body: JSON.stringify(body), }).then((user) => { if (user.token) { setStoredOpenFlareToken(user.token); } return user; }); } export function logout() { return apiRequest('/user/logout').finally(() => { clearStoredOpenFlareToken(); }); } export function register(payload: RegisterPayload) { return apiRequest('/user/register', { method: 'POST', body: JSON.stringify(payload), }); } export function sendEmailVerification(email: string) { const searchParams = new URLSearchParams({ email }); return apiRequest(`/verification?${searchParams.toString()}`); } export function sendPasswordResetEmail(email: string) { const searchParams = new URLSearchParams({ email }); return apiRequest(`/reset_password?${searchParams.toString()}`); } export function resetPassword(payload: PasswordResetRequestPayload) { return apiRequest('/user/reset', { method: 'POST', body: JSON.stringify(payload), }); } export function exchangeGitHubCode(code: string) { return apiRequest( `/oauth/github?code=${encodeURIComponent(code)}`, ).then((user) => { if (user.token) { setStoredOpenFlareToken(user.token); } return user; }); } export interface OAuthAuthorizeResult { authorize_url: string; } export interface OAuthCallbackResult { status: 'logged_in' | 'registered' | 'linked' | 'link_required'; user?: AuthUser; } export interface LinkExistingOAuthPayload { username: string; password: string; } export function getOAuthAuthorizeUrl(source: number | string) { return apiRequest( `/oauth/${encodeURIComponent(String(source))}/authorize`, ); } export function exchangeOAuthCode( source: number | string, code: string, state: string, ) { const searchParams = new URLSearchParams({ code, state }); return apiRequest( `/oauth/${encodeURIComponent(String(source))}/callback?${searchParams.toString()}`, ).then((result) => { if (result.user?.token) { setStoredOpenFlareToken(result.user.token); } return result; }); } export function linkExistingOAuthAccount(payload: LinkExistingOAuthPayload) { return apiRequest('/oauth/link-existing', { method: 'POST', body: JSON.stringify(payload), }).then((result) => { if (result.user?.token) { setStoredOpenFlareToken(result.user.token); } return result; }); }