- Created new UserAdapter for user profile and favorites operations - Updated routes/teams/explore and routes/[username] to use adapters directly - Deleted resource facade files (parties.ts, grid.ts, users.ts) - All services and initial routes now use adapters without backward compatibility - Updated migration plan to track completed work
131 lines
No EOL
3 KiB
TypeScript
131 lines
No EOL
3 KiB
TypeScript
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<UserInfo> {
|
|
return this.request<UserInfo>(`/users/info/${encodeURIComponent(username)}`)
|
|
}
|
|
|
|
/**
|
|
* Get user profile with their parties
|
|
*/
|
|
async getProfile(username: string, page = 1): Promise<UserProfileResponse> {
|
|
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<UserInfo>): Promise<UserInfo> {
|
|
return this.request<UserInfo>('/users/me', {
|
|
method: 'PUT',
|
|
body: JSON.stringify(updates)
|
|
})
|
|
}
|
|
|
|
/**
|
|
* Get current user
|
|
*/
|
|
async getCurrentUser(): Promise<UserInfo> {
|
|
return this.request<UserInfo>('/users/me')
|
|
}
|
|
}
|
|
|
|
export const userAdapter = new UserAdapter() |