import { BaseAdapter } from './base.adapter' import type { Party } from '$lib/types/api/party' export interface UserInfo { id: string username: string language: string private: boolean gender: number theme: string role: number avatar: { picture: string element: string } } export interface UserProfile extends UserInfo { parties?: Party[] } export interface UserProfileResponse { user: UserProfile items: Party[] page: number total?: number totalPages?: number perPage?: number } /** * Adapter for user-related API operations */ export class UserAdapter extends BaseAdapter { /** * Get user information */ async getInfo(username: string): Promise { return this.request(`/users/info/${encodeURIComponent(username)}`) } /** * Get user profile with their parties */ async getProfile(username: string, page = 1): Promise { const params = page > 1 ? { page } : undefined const response = await this.request<{ profile: UserProfile meta?: { count?: number; total_pages?: number; per_page?: number } }>(`/users/${encodeURIComponent(username)}`, { params }) const items = Array.isArray(response.profile?.parties) ? response.profile.parties : [] return { user: response.profile, items, page, total: response.meta?.count, totalPages: response.meta?.total_pages, perPage: response.meta?.per_page } } /** * Get user's favorite parties */ async getFavorites(options: { page?: number } = {}): Promise<{ items: Party[] page: number total: number totalPages: number perPage: number }> { const { page = 1 } = options const params = page > 1 ? { page } : undefined const response = await this.request<{ results: Party[] total: number total_pages: number per?: number }>('/parties/favorites', { params }) return { items: response.results, page, total: response.total, totalPages: response.total_pages, perPage: response.per || 20 } } /** * Check username availability */ async checkUsernameAvailability(username: string): Promise<{ available: boolean }> { return this.request<{ available: boolean }>(`/users/check-username`, { method: 'POST', body: JSON.stringify({ username }) }) } /** * Check email availability */ async checkEmailAvailability(email: string): Promise<{ available: boolean }> { return this.request<{ available: boolean }>(`/users/check-email`, { method: 'POST', body: JSON.stringify({ email }) }) } /** * Update user profile */ async updateProfile(updates: Partial): Promise { return this.request('/users/me', { method: 'PUT', body: JSON.stringify(updates) }) } /** * Get current user */ async getCurrentUser(): Promise { return this.request('/users/me') } } export const userAdapter = new UserAdapter()