mirror of
https://github.com/BradNut/boredgame
synced 2025-09-08 17:40:22 +00:00
60 lines
1.6 KiB
TypeScript
60 lines
1.6 KiB
TypeScript
import { error, json } from '@sveltejs/kit';
|
|
import { ZodError } from 'zod';
|
|
import { BggClient } from 'boardgamegeekclient';
|
|
import type { ISearchRequest } from 'boardgamegeekclient/dist/esm/request/index.js';
|
|
import { search_schema } from '$lib/zodValidation.js';
|
|
|
|
export async function GET({ url }) {
|
|
const searchParams = Object.fromEntries(url.searchParams);
|
|
console.log('searchParams external', searchParams);
|
|
const q = searchParams?.q || '';
|
|
const exact = parseInt(searchParams.exact) || 0;
|
|
const limit = parseInt(searchParams?.limit) || 10;
|
|
const skip = parseInt(searchParams?.skip) || 0;
|
|
|
|
// TODO: Debounce and throttle
|
|
try {
|
|
search_schema.parse({
|
|
q,
|
|
limit,
|
|
skip
|
|
});
|
|
} catch (e) {
|
|
console.error(e);
|
|
if (e instanceof ZodError) {
|
|
error(400, { message: e.flatten().fieldErrors });
|
|
}
|
|
|
|
error(500, { message: 'Something went wrong' });
|
|
}
|
|
|
|
const client = BggClient.Create();
|
|
const request: ISearchRequest = {
|
|
query: q,
|
|
exact,
|
|
type: ['boardgame', 'boardgameaccessory', 'boardgameexpansion']
|
|
};
|
|
const response = await client.search.query(request);
|
|
|
|
if (!response || response.length === 0 || response[0]?.total === 0) {
|
|
console.log('No results found in external search', response);
|
|
error(404, { message: 'No results found in external search' });
|
|
}
|
|
|
|
const result = response[0];
|
|
const start = skip;
|
|
let end = start + limit;
|
|
|
|
if (end > result.total) {
|
|
end = result.total;
|
|
}
|
|
const games = result.items.slice(start, end);
|
|
const apiResponse = {
|
|
totalCount: response[0].total,
|
|
games
|
|
};
|
|
|
|
console.log('Response from BGG', JSON.stringify(result, null, 2));
|
|
|
|
return json(apiResponse);
|
|
}
|