All checks were successful
Test and deploy staging / staging (push) Successful in 11m52s
25 lines
1.2 KiB
TypeScript
25 lines
1.2 KiB
TypeScript
import { db } from '$lib/server/db';
|
|
import { sql } from 'drizzle-orm';
|
|
import { json } from '@sveltejs/kit';
|
|
import type { RequestHandler } from './$types';
|
|
|
|
export const GET: RequestHandler = async ({ url }) => {
|
|
const q = (url.searchParams.get('q') ?? '').trim().slice(0, 100);
|
|
const dimension = url.searchParams.get('dimension') ?? 'item';
|
|
const offset = Math.min(100_000, Math.max(0, Number(url.searchParams.get('offset') ?? 0) || 0));
|
|
const limit = Math.min(1000, Math.max(1, Number(url.searchParams.get('limit') ?? 50) || 50));
|
|
const pattern = `%${q.replaceAll('\\', '\\\\').replaceAll('%', '\\%').replaceAll('_', '\\_')}%`;
|
|
if (dimension === 'item') {
|
|
const rows = await db.execute(sql`SELECT id, name, market_hash_name, icon_url
|
|
FROM cs_market_items WHERE name ILIKE ${pattern} ESCAPE '\'
|
|
ORDER BY name, id LIMIT ${limit} OFFSET ${offset}`);
|
|
return json({ results: rows });
|
|
}
|
|
if (!/^[a-z][a-z0-9_]*$/.test(dimension))
|
|
return json({ error: 'Invalid dimension' }, { status: 400 });
|
|
const rows = await db.execute(sql`SELECT value, count(*)::int AS items
|
|
FROM cs_item_dimensions WHERE key = ${dimension} AND value ILIKE ${pattern} ESCAPE '\'
|
|
GROUP BY value ORDER BY value LIMIT ${limit} OFFSET ${offset}`);
|
|
return json({ results: rows });
|
|
};
|