From ad2e04623f351cf2a7c5f244fb2154907d2d53d7 Mon Sep 17 00:00:00 2001 From: Justin Edmund Date: Tue, 16 Sep 2025 20:08:28 -0700 Subject: [PATCH] add parties list endpoint for explore page --- src/lib/api/resources/parties.ts | 104 ++++++++++++++++++++++- src/routes/teams/explore/+page.server.ts | 14 ++- 2 files changed, 113 insertions(+), 5 deletions(-) diff --git a/src/lib/api/resources/parties.ts b/src/lib/api/resources/parties.ts index 7af08ec5..13d381f1 100644 --- a/src/lib/api/resources/parties.ts +++ b/src/lib/api/resources/parties.ts @@ -166,6 +166,88 @@ export async function deleteParty( } } +/** + * List public parties for explore page + */ +export async function list( + fetch: FetchLike, + params?: { + page?: number + per_page?: number + raid_id?: string + element?: number + } +): Promise<{ + items: Party[] + total: number + totalPages: number + perPage: number +}> { + const searchParams = new URLSearchParams() + if (params?.page) searchParams.set('page', params.page.toString()) + if (params?.per_page) searchParams.set('per_page', params.per_page.toString()) + if (params?.raid_id) searchParams.set('raid_id', params.raid_id) + if (params?.element) searchParams.set('element', params.element.toString()) + + const url = buildUrl('/parties', searchParams) + console.log('[parties.list] Requesting URL:', url) + console.log('[parties.list] With params:', params) + + // Use fetch directly to get the Response object for better error handling + const res = await fetch(url, { + credentials: 'include', + headers: { 'Content-Type': 'application/json' } + }) + console.log('[parties.list] Response status:', res.status, res.statusText) + + if (!res.ok) { + const error = await parseError(res) + console.error('[parties.list] API error:', { + url, + status: res.status, + statusText: res.statusText, + message: error.message, + details: error.details + }) + throw error + } + + let json: any + try { + json = await res.json() + console.log('[parties.list] Raw response:', JSON.stringify(json, null, 2).substring(0, 500)) + } catch (e) { + console.error('[parties.list] Failed to parse JSON response:', e) + throw new Error(`Failed to parse JSON response from ${url}: ${e}`) + } + + const result = PaginatedPartiesSchema.safeParse(json) + + if (result.success) { + return { + items: result.data.results.map(parseParty), + total: result.data.meta?.count || 0, + totalPages: result.data.meta?.total_pages || 1, + perPage: result.data.meta?.per_page || 20 + } + } + + // Fallback for non-paginated response + const fallback = PartiesResponseSchema.safeParse(json) + if (fallback.success) { + return { + items: fallback.data.parties.map(parseParty), + total: fallback.data.total || fallback.data.parties.length, + totalPages: 1, + perPage: fallback.data.parties.length + } + } + + const errorMsg = `Invalid response format from API at ${url}. Response: ${JSON.stringify(json, null, 2).substring(0, 500)}` + console.error('[parties.list] Parse error:', errorMsg) + throw new Error(errorMsg) +} + export async function getUserParties( fetch: FetchLike, username: string, @@ -321,12 +403,22 @@ export async function updateCharacterGrid( } // Error parsing -async function parseError(res: Response): Promise { +async function parseError(res: Response): Promise { let message = 'Request failed' let details: any[] = [] + const url = res.url + + console.error('[parseError] Parsing error response:', { + url: res.url, + status: res.status, + statusText: res.statusText, + headers: res.headers ? Object.fromEntries(res.headers.entries()) : 'No headers' + }) try { const errorData = await res.json() + console.error('[parseError] Error response body:', errorData) + if (errorData.error) { message = errorData.error } else if (errorData.errors) { @@ -344,15 +436,19 @@ async function parseError(res: Response): Promise 0) { error.details = details } + if (url) { + error.url = url + } return error } \ No newline at end of file diff --git a/src/routes/teams/explore/+page.server.ts b/src/routes/teams/explore/+page.server.ts index 041d438a..ad40633f 100644 --- a/src/routes/teams/explore/+page.server.ts +++ b/src/routes/teams/explore/+page.server.ts @@ -8,11 +8,23 @@ export const load: PageServerLoad = async ({ fetch, url, depends }) => { const pageParam = url.searchParams.get('page') const page = pageParam ? Math.max(1, parseInt(pageParam, 10) || 1) : 1 + console.log('[explore/+page.server.ts] Loading explore page with page:', page) + console.log('[explore/+page.server.ts] Full URL:', url.toString()) + try { const { items, total, totalPages, perPage } = await parties.list(fetch, { page }) + console.log('[explore/+page.server.ts] Successfully loaded', items.length, 'parties') return { items, page, total, totalPages, perPage } } catch (e: any) { - throw error(e?.status || 502, e?.message || 'Failed to load teams') + console.error('[explore/+page.server.ts] Failed to load teams:', { + error: e, + message: e?.message, + status: e?.status, + stack: e?.stack, + details: e?.details + }) + const errorMessage = `Failed to load teams: ${e?.message || 'Unknown error'}. Status: ${e?.status || 'unknown'}` + throw error(e?.status || 502, errorMessage) } }