mirror of
https://github.com/Rain-kl/OpenFlare.git
synced 2026-09-29 22:06:38 +08:00
117 lines
3.0 KiB
TypeScript
117 lines
3.0 KiB
TypeScript
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<AuthUser>('/user/self');
|
|
}
|
|
|
|
export function login(payload: LoginPayload) {
|
|
const { cap_token, ...body } = payload;
|
|
const headers: Record<string, string> = {};
|
|
if (cap_token) {
|
|
headers['X-Cap-Token'] = cap_token;
|
|
}
|
|
return apiRequest<AuthUser>('/user/login', {
|
|
method: 'POST',
|
|
headers,
|
|
body: JSON.stringify(body),
|
|
}).then((user) => {
|
|
if (user.token) {
|
|
setStoredOpenFlareToken(user.token);
|
|
}
|
|
return user;
|
|
});
|
|
}
|
|
|
|
export function logout() {
|
|
return apiRequest<void>('/user/logout').finally(() => {
|
|
clearStoredOpenFlareToken();
|
|
});
|
|
}
|
|
|
|
export function register(payload: RegisterPayload) {
|
|
return apiRequest<void>('/user/register', {
|
|
method: 'POST',
|
|
body: JSON.stringify(payload),
|
|
});
|
|
}
|
|
|
|
export function sendEmailVerification(email: string) {
|
|
const searchParams = new URLSearchParams({ email });
|
|
|
|
return apiRequest<void>(`/verification?${searchParams.toString()}`);
|
|
}
|
|
|
|
export function sendPasswordResetEmail(email: string) {
|
|
const searchParams = new URLSearchParams({ email });
|
|
|
|
return apiRequest<void>(`/reset_password?${searchParams.toString()}`);
|
|
}
|
|
|
|
export function resetPassword(payload: PasswordResetRequestPayload) {
|
|
return apiRequest<string>('/user/reset', {
|
|
method: 'POST',
|
|
body: JSON.stringify(payload),
|
|
});
|
|
}
|
|
|
|
export function exchangeGitHubCode(code: string) {
|
|
return apiRequest<AuthUser>(
|
|
`/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<OAuthAuthorizeResult>(
|
|
`/oauth/${encodeURIComponent(String(source))}/authorize`,
|
|
);
|
|
}
|
|
|
|
export function exchangeOAuthCode(
|
|
source: number | string,
|
|
code: string,
|
|
state: string,
|
|
) {
|
|
const searchParams = new URLSearchParams({ code, state });
|
|
return apiRequest<OAuthCallbackResult>(
|
|
`/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<OAuthCallbackResult>('/oauth/link-existing', {
|
|
method: 'POST',
|
|
body: JSON.stringify(payload),
|
|
}).then((result) => {
|
|
if (result.user?.token) {
|
|
setStoredOpenFlareToken(result.user.token);
|
|
}
|
|
return result;
|
|
});
|
|
}
|