53 lines
2.4 KiB
TypeScript
53 lines
2.4 KiB
TypeScript
import {
|
|
authResultSchema,
|
|
userSchema,
|
|
publicUserSchema,
|
|
sessionListSchema,
|
|
centrifugoTokenSchema,
|
|
} from '../schemas/index';
|
|
import type { RegisterBody, LoginBody, UpdateMeBody } from '../schemas/index';
|
|
import type { AuthResult, CentrifugoToken, Session, User, PublicUser } from '../types/index';
|
|
import { compileValidator, parse, requestJson } from './http';
|
|
import type { ApiClientConfig } from './http';
|
|
|
|
const authResultV = compileValidator<AuthResult>(authResultSchema);
|
|
const userV = compileValidator<User>(userSchema);
|
|
const publicUserV = compileValidator<PublicUser>(publicUserSchema);
|
|
const sessionsV = compileValidator<Session[]>(sessionListSchema);
|
|
const centrifugoTokenV = compileValidator<CentrifugoToken>(centrifugoTokenSchema);
|
|
|
|
export const register = async (config: ApiClientConfig, body: RegisterBody): Promise<AuthResult> =>
|
|
parse(authResultV, await requestJson(config, 'POST', '/auth/register', body));
|
|
|
|
export const login = async (config: ApiClientConfig, body: LoginBody): Promise<AuthResult> =>
|
|
parse(authResultV, await requestJson(config, 'POST', '/auth/login', body));
|
|
|
|
// Uses the httpOnly refresh cookie — no body.
|
|
export const refresh = async (config: ApiClientConfig): Promise<AuthResult> =>
|
|
parse(authResultV, await requestJson(config, 'POST', '/auth/refresh'));
|
|
|
|
export const logout = async (config: ApiClientConfig): Promise<void> => {
|
|
await requestJson(config, 'POST', '/auth/logout');
|
|
};
|
|
|
|
export const logoutAll = async (config: ApiClientConfig): Promise<void> => {
|
|
await requestJson(config, 'POST', '/auth/logout-all');
|
|
};
|
|
|
|
export const getMe = async (config: ApiClientConfig): Promise<User> =>
|
|
parse(userV, await requestJson(config, 'GET', '/me'));
|
|
|
|
export const updateMe = async (config: ApiClientConfig, body: UpdateMeBody): Promise<User> =>
|
|
parse(userV, await requestJson(config, 'PATCH', '/me', body));
|
|
|
|
export const getPublicProfile = async (
|
|
config: ApiClientConfig,
|
|
username: string,
|
|
): Promise<PublicUser> =>
|
|
parse(publicUserV, await requestJson(config, 'GET', `/users/${encodeURIComponent(username)}`));
|
|
|
|
export const listSessions = async (config: ApiClientConfig): Promise<Session[]> =>
|
|
parse(sessionsV, await requestJson(config, 'GET', '/auth/sessions'));
|
|
|
|
export const getCentrifugoToken = async (config: ApiClientConfig): Promise<CentrifugoToken> =>
|
|
parse(centrifugoTokenV, await requestJson(config, 'POST', '/auth/centrifugo-token'));
|