Files
wanderer/web/src/lib/stores/user_store.ts
2025-01-03 18:05:25 +01:00

176 lines
4.6 KiB
TypeScript

import type { User, UserAnonymous } from "$lib/models/user";
import { pb } from "$lib/pocketbase";
import { APIError } from "$lib/util/api_util";
import { type AuthMethodsList } from "pocketbase";
import { writable, type Writable } from "svelte/store";
export const currentUser: Writable<User | null> = writable<User | null>()
export async function users_create(user: User) {
let r = await fetch('/api/v1/user', {
method: 'PUT',
body: JSON.stringify({ ...user, passwordConfirm: user.password })
})
if (!r.ok) {
const response = await r.json();
throw new APIError(r.status, response.message, response.detail)
}
const createdUser: User = await r.json();
return createdUser;
}
export async function users_search(q: string, includeSelf: boolean = true) {
let r = await fetch('/api/v1/user/anonymous?' + new URLSearchParams({
"filter": `username~"${q}"${includeSelf ? '' : `&&id!="${pb.authStore.model?.id}"`}`,
}), {
method: 'GET',
})
if (!r.ok) {
const response = await r.json();
throw new APIError(r.status, response.message, response.detail)
}
const response = await r.json()
return response.items;
}
export async function users_show(id: string, f: (url: RequestInfo | URL, config?: RequestInit) => Promise<Response> = fetch) {
let r = await f(`/api/v1/user/anonymous/${id}`, {
method: 'GET',
})
const response: UserAnonymous = await r.json()
if (!r.ok) {
const response = await r.json();
throw new APIError(r.status, response.message, response.detail)
}
return response;
}
export async function users_auth_methods(f: (url: RequestInfo | URL, config?: RequestInit) => Promise<Response> = fetch): Promise<AuthMethodsList> {
const r = await f('/api/v1/auth/oauth', {
method: 'GET',
})
if (!r.ok) {
const response = await r.json();
throw new APIError(r.status, response.message, response.detail)
}
return await r.json()
}
export async function login(user: User) {
const r = await fetch('/api/v1/auth/login', {
method: 'POST',
body: JSON.stringify(user),
})
if (!r.ok) {
const response = await r.json();
throw new APIError(r.status, response.message, response.detail)
}
pb.authStore.loadFromCookie(document.cookie)
}
export async function oauth_login(data: { name: string, code: string, codeVerifier: string }) {
const r = await fetch('/api/v1/auth/oauth', {
method: 'POST',
body: JSON.stringify(data)
})
if (!r.ok) {
const response = await r.json();
throw new APIError(r.status, response.message, response.detail)
}
pb.authStore.loadFromCookie(document.cookie)
}
export async function logout() {
pb.authStore.clear();
}
export async function users_update(user: User | { [K in keyof User]?: User[K] }, avatar?: File) {
let r = await fetch('/api/v1/user/' + user.id, {
method: 'POST',
body: JSON.stringify(user)
})
if (!r.ok) {
const response = await r.json();
throw new APIError(r.status, response.message, response.detail)
}
if (avatar) {
const formData = new FormData();
formData.append("avatar", avatar);
r = await fetch(`/api/v1/user/${user.id!}/file`, {
method: 'POST',
body: formData,
})
if (!r.ok) {
const response = await r.json();
throw new APIError(r.status, response.message, response.detail)
}
}
const model: User = await r.json();
currentUser.set(model);
}
export async function users_delete(user: User) {
const r = await fetch('/api/v1/user/' + user.id, {
method: 'DELETE',
})
if (!r.ok) {
const response = await r.json();
throw new APIError(r.status, response.message, response.detail)
}
}
export async function users_reset_password(reset: { email: string }) {
const r = await fetch('/api/v1/auth/reset', {
method: 'POST',
body: JSON.stringify(reset),
})
if (!r.ok) {
const response = await r.json();
throw new APIError(r.status, response.message, response.detail)
}
return await r.json();
}
export async function users_confirm_reset(reset: { password: string, passwordConfirm: string, token: string }) {
const r = await fetch('/api/v1/auth/confirm-reset', {
method: 'POST',
body: JSON.stringify(reset),
})
if (!r.ok) {
const response = await r.json();
throw new APIError(r.status, response.message, response.detail)
}
return await r.json();
}