mirror of
https://github.com/jcreek/LivingDexTracker.git
synced 2026-07-12 18:43:45 +00:00
73 lines
2.3 KiB
TypeScript
73 lines
2.3 KiB
TypeScript
import { json } from '@sveltejs/kit';
|
|
import CombinedDataRepository from '$lib/repositories/CombinedDataRepository';
|
|
import PokedexRepository from '$lib/repositories/PokedexRepository';
|
|
import { getOptionalUserId } from '$lib/utils/auth';
|
|
import type { RequestEvent } from '@sveltejs/kit';
|
|
|
|
// GET: Get combined data (pokédex entries + catch records) for specific pokédex
|
|
export const GET = async (event: RequestEvent) => {
|
|
try {
|
|
const userId = await getOptionalUserId(event);
|
|
const { id: pokedexId } = event.params;
|
|
|
|
if (!pokedexId) {
|
|
return json({ error: 'Pokedex ID is required' }, { status: 400 });
|
|
}
|
|
|
|
// Parse query parameters
|
|
const url = new URL(event.request.url);
|
|
const page = parseInt(url.searchParams.get('page') || '1');
|
|
const limit = parseInt(url.searchParams.get('limit') || '20');
|
|
const enableForms = url.searchParams.get('enableForms') === 'true';
|
|
const region = url.searchParams.get('region') || '';
|
|
const game = url.searchParams.get('game') || '';
|
|
|
|
// If authenticated, verify user owns this pokédex and get its gameScope
|
|
let pokedex;
|
|
if (userId) {
|
|
const pokedexRepo = new PokedexRepository(event.locals.supabase, userId);
|
|
pokedex = await pokedexRepo.findById(pokedexId);
|
|
|
|
if (!pokedex) {
|
|
// User is authenticated but doesn't own this pokédex (or it doesn't exist)
|
|
return json({ error: 'Pokedex not found' }, { status: 404 });
|
|
}
|
|
} else {
|
|
// Anonymous users cannot view pokédexes
|
|
return json({ error: 'Unauthorized' }, { status: 401 });
|
|
}
|
|
|
|
// Use pokédex's gameScope as default filter if no manual game filter is set
|
|
const effectiveGame = game || pokedex.gameScope || '';
|
|
|
|
const repo = new CombinedDataRepository(event.locals.supabase, userId, pokedexId);
|
|
|
|
// Get paginated combined data
|
|
const combinedData = await repo.findCombinedData(
|
|
userId!,
|
|
page,
|
|
limit,
|
|
enableForms,
|
|
region,
|
|
effectiveGame
|
|
);
|
|
|
|
// Get total count for pagination
|
|
const totalCount = await repo.countCombinedData(enableForms, region, effectiveGame);
|
|
const totalPages = Math.ceil(totalCount / limit);
|
|
|
|
return json({
|
|
combinedData,
|
|
totalPages,
|
|
currentPage: page,
|
|
totalCount
|
|
});
|
|
} catch (err) {
|
|
console.error(err);
|
|
if (err && typeof err === 'object' && 'status' in err) {
|
|
throw err;
|
|
}
|
|
return json({ error: 'Internal Server Error' }, { status: 500 });
|
|
}
|
|
};
|