refactor: introduce domain model classes and mapper layer
Replace ad-hoc inline row casting (snake_case → camelCase) spread across services, routes, and the indexing pipeline with explicit model classes (Repository, IndexingJob, RepositoryVersion, Snippet, SearchResult) and dedicated mapper classes that own the DB → domain conversion. - Add src/lib/server/models/ with typed model classes for all domain entities - Add src/lib/server/mappers/ with mapper classes per entity - Remove duplicated RawRow interfaces and inline map functions from job-queue, repository.service, indexing.pipeline, and all API routes - Add dtoJsonResponse helper to standardise JSON responses via SvelteKit json() - Add api-contract.integration.test.ts as a regression baseline Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -281,9 +281,9 @@ describe('RepositoryService.add()', () => {
|
||||
const repo = service.add({
|
||||
source: 'github',
|
||||
sourceUrl: 'https://github.com/facebook/react'
|
||||
}) as unknown as RawRepo;
|
||||
expect(repo.total_snippets).toBe(0);
|
||||
expect(repo.total_tokens).toBe(0);
|
||||
});
|
||||
expect(repo.totalSnippets).toBe(0);
|
||||
expect(repo.totalTokens).toBe(0);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -443,9 +443,9 @@ describe('RepositoryService.createIndexingJob()', () => {
|
||||
});
|
||||
|
||||
it('creates a queued indexing job', () => {
|
||||
const job = service.createIndexingJob('/facebook/react') as unknown as RawJob;
|
||||
const job = service.createIndexingJob('/facebook/react');
|
||||
expect(job.id).toBeTruthy();
|
||||
expect(job.repository_id).toBe('/facebook/react');
|
||||
expect(job.repositoryId).toBe('/facebook/react');
|
||||
expect(job.status).toBe('queued');
|
||||
expect(job.progress).toBe(0);
|
||||
});
|
||||
@@ -467,10 +467,7 @@ describe('RepositoryService.createIndexingJob()', () => {
|
||||
});
|
||||
|
||||
it('accepts an optional versionId', () => {
|
||||
const job = service.createIndexingJob(
|
||||
'/facebook/react',
|
||||
'/facebook/react/v18.3.0'
|
||||
) as unknown as RawJob;
|
||||
expect(job.version_id).toBe('/facebook/react/v18.3.0');
|
||||
const job = service.createIndexingJob('/facebook/react', '/facebook/react/v18.3.0');
|
||||
expect(job.versionId).toBe('/facebook/react/v18.3.0');
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user