boredgame/oldApis/external/search/+server.ts

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);
}