add parties list endpoint for explore page
This commit is contained in:
parent
16e18525da
commit
ad2e04623f
2 changed files with 113 additions and 5 deletions
|
|
@ -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(
|
export async function getUserParties(
|
||||||
fetch: FetchLike,
|
fetch: FetchLike,
|
||||||
username: string,
|
username: string,
|
||||||
|
|
@ -321,12 +403,22 @@ export async function updateCharacterGrid(
|
||||||
}
|
}
|
||||||
|
|
||||||
// Error parsing
|
// Error parsing
|
||||||
async function parseError(res: Response): Promise<Error & { status: number; details?: any[] }> {
|
async function parseError(res: Response): Promise<Error & { status: number; details?: any[]; url?: string }> {
|
||||||
let message = 'Request failed'
|
let message = 'Request failed'
|
||||||
let details: any[] = []
|
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 {
|
try {
|
||||||
const errorData = await res.json()
|
const errorData = await res.json()
|
||||||
|
console.error('[parseError] Error response body:', errorData)
|
||||||
|
|
||||||
if (errorData.error) {
|
if (errorData.error) {
|
||||||
message = errorData.error
|
message = errorData.error
|
||||||
} else if (errorData.errors) {
|
} else if (errorData.errors) {
|
||||||
|
|
@ -344,15 +436,19 @@ async function parseError(res: Response): Promise<Error & { status: number; deta
|
||||||
details = Object.entries(errorData.errors)
|
details = Object.entries(errorData.errors)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch {
|
} catch (e) {
|
||||||
// If JSON parsing fails, use status text
|
// If JSON parsing fails, use status text
|
||||||
message = res.statusText || message
|
console.error('[parseError] Failed to parse error JSON:', e)
|
||||||
|
message = `${res.status} ${res.statusText || 'Request failed'} at ${url}`
|
||||||
}
|
}
|
||||||
|
|
||||||
const error = new Error(message) as Error & { status: number; details?: any[] }
|
const error = new Error(message) as Error & { status: number; details?: any[]; url?: string }
|
||||||
error.status = res.status
|
error.status = res.status
|
||||||
if (details.length > 0) {
|
if (details.length > 0) {
|
||||||
error.details = details
|
error.details = details
|
||||||
}
|
}
|
||||||
|
if (url) {
|
||||||
|
error.url = url
|
||||||
|
}
|
||||||
return error
|
return error
|
||||||
}
|
}
|
||||||
|
|
@ -8,11 +8,23 @@ export const load: PageServerLoad = async ({ fetch, url, depends }) => {
|
||||||
const pageParam = url.searchParams.get('page')
|
const pageParam = url.searchParams.get('page')
|
||||||
const page = pageParam ? Math.max(1, parseInt(pageParam, 10) || 1) : 1
|
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 {
|
try {
|
||||||
const { items, total, totalPages, perPage } = await parties.list(fetch, { page })
|
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 }
|
return { items, page, total, totalPages, perPage }
|
||||||
} catch (e: any) {
|
} 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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue