/** * HTTP route handlers for Project Operations. * * Routes: * - GET /api/projects - List all projects * - GET /api/repository-groups - List projects grouped by git repository * - GET /api/worktrees/:id/sessions - List sessions for a worktree */ import { createLogger } from '@shared/utils/logger'; import { validateProjectId } from '../ipc/guards'; import type { HttpServices } from './index';import type { FastifyInstance } from 'fastify'; const logger = createLogger('HTTP:projects'); export function registerProjectRoutes(app: FastifyInstance, services: HttpServices): void { app.get('/api/projects', async () => { try { const projects = await services.projectScanner.scan(); return projects; } catch (error) { logger.error('Error in GET /api/projects:', error); return []; } }); app.get('/api/repository-groups', async () => { try { const groups = await services.projectScanner.scanWithWorktreeGrouping(); return groups; } catch (error) { logger.error('Error in GET /api/repository-groups:', error); return []; } }); app.get<{ Params: { id: string } }>('/api/worktrees/:id/sessions', async (request) => { try { const validated = validateProjectId(request.params.id); if (!validated.valid) { logger.error(`GET /api/worktrees/:id/sessions rejected: ${validated.error ?? 'unknown'}`); return []; } const sessions = await services.projectScanner.listWorktreeSessions(validated.value!); return sessions; } catch (error) { logger.error(`Error in GET /api/worktrees/${request.params.id}/sessions:`, error); return []; } });}
/**
* HTTP route handlers for Project Operations.
*
* Routes:
* - GET /api/projects - List all projects
* - GET /api/repository-groups - List projects grouped by git repository
* - GET /api/worktrees/:id/sessions - List sessions for a worktree
*/
import { createLogger } from '@shared/utils/logger';
import { validateProjectId } from '../ipc/guards';
import type { HttpServices } from './index';
import type { FastifyInstance } from 'fastify';
const logger = createLogger('HTTP:projects');
export function registerProjectRoutes(app: FastifyInstance, services: HttpServices): void {
app.get('/api/projects', async () => {
try {
const projects = await services.projectScanner.scan();
return projects;
} catch (error) {
logger.error('Error in GET /api/projects:', error);
return [];
}
});
app.get('/api/repository-groups', async () => {
try {
const groups = await services.projectScanner.scanWithWorktreeGrouping();
return groups;
} catch (error) {
logger.error('Error in GET /api/repository-groups:', error);
return [];
}
});
app.get<{ Params: { id: string } }>('/api/worktrees/:id/sessions', async (request) => {
try {
const validated = validateProjectId(request.params.id);
if (!validated.valid) {
logger.error(`GET /api/worktrees/:id/sessions rejected: ${validated.error ?? 'unknown'}`);
return [];
}
const sessions = await services.projectScanner.listWorktreeSessions(validated.value!);
return sessions;
} catch (error) {
logger.error(`Error in GET /api/worktrees/${request.params.id}/sessions:`, error);
return [];
}
});
}