50 lines · 1.6 KB · TypeScript
RawDownload
/** * HTTP route handlers for Search Operations. * * Routes: * - GET /api/projects/:projectId/search - Search sessions in a project */ import { createLogger } from '@shared/utils/logger'; import { coerceSearchMaxResults, validateProjectId, validateSearchQuery } from '../ipc/guards'; import type { HttpServices } from './index';import type { FastifyInstance } from 'fastify'; const logger = createLogger('HTTP:search'); export function registerSearchRoutes(app: FastifyInstance, services: HttpServices): void {  app.get<{    Params: { projectId: string };    Querystring: { q?: string; maxResults?: string };  }>('/api/projects/:projectId/search', async (request) => {    const query = request.query.q ?? '';     try {      const validatedProject = validateProjectId(request.params.projectId);      const validatedQuery = validateSearchQuery(query);      if (!validatedProject.valid || !validatedQuery.valid) {        logger.error(          `GET search rejected: ${validatedProject.error ?? validatedQuery.error ?? 'Invalid inputs'}`        );        return { results: [], totalMatches: 0, sessionsSearched: 0, query };      }       const maxResults = coerceSearchMaxResults(        request.query.maxResults ? Number(request.query.maxResults) : undefined,        50      );       const result = await services.projectScanner.searchSessions(        validatedProject.value!,        validatedQuery.value!,        maxResults      );      return result;    } catch (error) {      logger.error(`Error in GET search for ${request.params.projectId}:`, error);      return { results: [], totalMatches: 0, sessionsSearched: 0, query };    }  });}