35 lines
1.2 KiB
TypeScript
35 lines
1.2 KiB
TypeScript
import type { PageServerLoad } from './$types';
|
|
import { requireUser } from '#lib/server/auth.js';
|
|
import { listGlobalSearchFacets, searchWorkspace } from '#lib/server/global-search.js';
|
|
import type { GlobalSearchFilters } from '#lib/server/global-search.js';
|
|
|
|
export const load: PageServerLoad = ({ locals, url }) => {
|
|
requireUser(locals.user);
|
|
const query = (url.searchParams.get('q') ?? '').trim().slice(0, 200);
|
|
const rawType = url.searchParams.get('type');
|
|
const filters: GlobalSearchFilters & {
|
|
type: NonNullable<GlobalSearchFilters['type']>;
|
|
status: string;
|
|
topicId: string;
|
|
formatId: string;
|
|
} = {
|
|
type: rawType === 'pieces' || rawType === 'shows' ? rawType : ('all' as const),
|
|
status: (url.searchParams.get('status') ?? '').slice(0, 30),
|
|
topicId: (url.searchParams.get('topic') ?? '').slice(0, 100),
|
|
formatId: (url.searchParams.get('format') ?? '').slice(0, 100)
|
|
};
|
|
const results = searchWorkspace(query, filters);
|
|
const countResults =
|
|
filters.type === 'all' ? results : searchWorkspace(query, { ...filters, type: 'all' });
|
|
return {
|
|
query,
|
|
filters,
|
|
facets: listGlobalSearchFacets(),
|
|
results,
|
|
counts: {
|
|
pieces: countResults.pieces.length,
|
|
shows: countResults.shows.length
|
|
}
|
|
};
|
|
};
|