fix: API adapters and type mapping

- transform job skills pagination meta to include page/perPage
- fix UserInfo avatar type (optional properties -> required when present)
- add visibility number-to-string mapping in party service (0=public, 1=private, 2=unlisted)
- change mapToApiPayload return type from Partial<Party> to CreatePartyParams
- fix raid/job mapping to use IDs instead of nested objects
- add generic type argument to RestDataProvider<any>
- add type assertion in optionalProps (value as T[keyof T])
This commit is contained in:
Justin Edmund 2025-11-28 21:04:51 -08:00
parent 073bed01d3
commit 009758a997
5 changed files with 26 additions and 13 deletions

View file

@ -131,7 +131,12 @@ export class JobAdapter extends BaseAdapter {
page: params.page || 1,
total: response.meta?.count || 0,
totalPages: response.meta?.total_pages || 1,
meta: response.meta
meta: response.meta ? {
count: response.meta.count ?? 0,
page: params.page || 1,
perPage: response.meta.per_page ?? 10,
totalPages: response.meta.total_pages ?? 1
} : undefined
}
}

View file

@ -31,7 +31,7 @@ export const users = {
gender?: number | undefined
language?: string | undefined
theme?: string | undefined
avatar?: { picture?: string | undefined; element?: string | undefined } | undefined
avatar?: { picture: string; element: string } | undefined
} = {}
if (params.gender !== undefined) updates.gender = params.gender
@ -39,10 +39,10 @@ export const users = {
if (params.theme !== undefined) updates.theme = params.theme
if (params.picture !== undefined || params.element !== undefined) {
const avatar: { picture?: string | undefined; element?: string | undefined } = {}
if (params.picture !== undefined) avatar.picture = params.picture
if (params.element !== undefined) avatar.element = params.element
updates.avatar = avatar
updates.avatar = {
picture: params.picture ?? '',
element: params.element ?? ''
}
}
const result = await userAdapter.updateProfile(updates)

View file

@ -17,7 +17,7 @@ interface APIResponse {
}
}
export class DatabaseProvider extends RestDataProvider {
export class DatabaseProvider extends RestDataProvider<any> {
private resource: 'weapons' | 'characters' | 'summons'
private pageSize: number
private currentPage: number = 1

View file

@ -1,5 +1,5 @@
import type { Party } from '$lib/types/api/party'
import { partyAdapter } from '$lib/api/adapters/party.adapter'
import { partyAdapter, type CreatePartyParams } from '$lib/api/adapters/party.adapter'
import { authStore } from '$lib/stores/auth.store'
import { browser } from '$app/environment'
@ -279,13 +279,13 @@ export class PartyService {
return headers
}
private mapToApiPayload(payload: PartyUpdatePayload): Partial<Party> {
private mapToApiPayload(payload: PartyUpdatePayload): CreatePartyParams {
const mapped: any = {}
if (payload.name !== undefined) mapped.name = payload.name
if (payload.description !== undefined) mapped.description = payload.description
if (payload.element !== undefined) mapped.element = payload.element
if (payload.raidId !== undefined) mapped.raid = { id: payload.raidId }
if (payload.raidId !== undefined) mapped.raidId = payload.raidId
if (payload.chargeAttack !== undefined) mapped.chargeAttack = payload.chargeAttack
if (payload.fullAuto !== undefined) mapped.fullAuto = payload.fullAuto
if (payload.autoGuard !== undefined) mapped.autoGuard = payload.autoGuard
@ -294,8 +294,16 @@ export class PartyService {
if (payload.buttonCount !== undefined) mapped.buttonCount = payload.buttonCount
if (payload.chainCount !== undefined) mapped.chainCount = payload.chainCount
if (payload.turnCount !== undefined) mapped.turnCount = payload.turnCount
if (payload.jobId !== undefined) mapped.job = { id: payload.jobId }
if (payload.visibility !== undefined) mapped.visibility = payload.visibility
if (payload.jobId !== undefined) mapped.jobId = payload.jobId
if (payload.visibility !== undefined) {
// Convert number visibility to string
const visibilityMap: Record<number, 'public' | 'private' | 'unlisted'> = {
0: 'public',
1: 'private',
2: 'unlisted'
}
mapped.visibility = visibilityMap[payload.visibility] || 'public'
}
if (payload.localId !== undefined) mapped.localId = payload.localId
return mapped

View file

@ -102,7 +102,7 @@ export function optionalProps<T extends Record<string, unknown>>(
const result: Partial<T> = {}
for (const [key, value] of Object.entries(obj)) {
if (value !== undefined) {
result[key as keyof T] = value
result[key as keyof T] = value as T[keyof T]
}
}
return result