feat(TRUEREF-0001): implement complete database schema and core data models

Define all SQLite tables via Drizzle ORM (repositories, repository_versions,
documents, snippets, snippet_embeddings, indexing_jobs, repository_configs,
settings), generate the initial migration, create FTS5 virtual table and
sync triggers in fts.sql, add shared TypeScript types in src/lib/types.ts,
and write 21 unit tests covering insertions, cascade deletes, FK constraints,
blob storage, JSON fields, and FTS5 trigger behaviour.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Giancarmine Salucci
2026-03-22 17:18:01 +01:00
parent 18437dfa7c
commit f57b622505
9 changed files with 1676 additions and 6 deletions

View File

@@ -0,0 +1,104 @@
CREATE TABLE `documents` (
`id` text PRIMARY KEY NOT NULL,
`repository_id` text NOT NULL,
`version_id` text,
`file_path` text NOT NULL,
`title` text,
`language` text,
`token_count` integer DEFAULT 0,
`checksum` text NOT NULL,
`indexed_at` integer NOT NULL,
FOREIGN KEY (`repository_id`) REFERENCES `repositories`(`id`) ON UPDATE no action ON DELETE cascade,
FOREIGN KEY (`version_id`) REFERENCES `repository_versions`(`id`) ON UPDATE no action ON DELETE cascade
);
--> statement-breakpoint
CREATE TABLE `indexing_jobs` (
`id` text PRIMARY KEY NOT NULL,
`repository_id` text NOT NULL,
`version_id` text,
`status` text DEFAULT 'queued' NOT NULL,
`progress` integer DEFAULT 0,
`total_files` integer DEFAULT 0,
`processed_files` integer DEFAULT 0,
`error` text,
`started_at` integer,
`completed_at` integer,
`created_at` integer NOT NULL,
FOREIGN KEY (`repository_id`) REFERENCES `repositories`(`id`) ON UPDATE no action ON DELETE cascade
);
--> statement-breakpoint
CREATE TABLE `repositories` (
`id` text PRIMARY KEY NOT NULL,
`title` text NOT NULL,
`description` text,
`source` text NOT NULL,
`source_url` text NOT NULL,
`branch` text DEFAULT 'main',
`state` text DEFAULT 'pending' NOT NULL,
`total_snippets` integer DEFAULT 0,
`total_tokens` integer DEFAULT 0,
`trust_score` real DEFAULT 0,
`benchmark_score` real DEFAULT 0,
`stars` integer,
`github_token` text,
`last_indexed_at` integer,
`created_at` integer NOT NULL,
`updated_at` integer NOT NULL
);
--> statement-breakpoint
CREATE TABLE `repository_configs` (
`repository_id` text PRIMARY KEY NOT NULL,
`project_title` text,
`description` text,
`folders` text,
`exclude_folders` text,
`exclude_files` text,
`rules` text,
`previous_versions` text,
`updated_at` integer NOT NULL,
FOREIGN KEY (`repository_id`) REFERENCES `repositories`(`id`) ON UPDATE no action ON DELETE cascade
);
--> statement-breakpoint
CREATE TABLE `repository_versions` (
`id` text PRIMARY KEY NOT NULL,
`repository_id` text NOT NULL,
`tag` text NOT NULL,
`title` text,
`state` text DEFAULT 'pending' NOT NULL,
`total_snippets` integer DEFAULT 0,
`indexed_at` integer,
`created_at` integer NOT NULL,
FOREIGN KEY (`repository_id`) REFERENCES `repositories`(`id`) ON UPDATE no action ON DELETE cascade
);
--> statement-breakpoint
CREATE TABLE `settings` (
`key` text PRIMARY KEY NOT NULL,
`value` text,
`updated_at` integer NOT NULL
);
--> statement-breakpoint
CREATE TABLE `snippet_embeddings` (
`snippet_id` text PRIMARY KEY NOT NULL,
`model` text NOT NULL,
`dimensions` integer NOT NULL,
`embedding` blob NOT NULL,
`created_at` integer NOT NULL,
FOREIGN KEY (`snippet_id`) REFERENCES `snippets`(`id`) ON UPDATE no action ON DELETE cascade
);
--> statement-breakpoint
CREATE TABLE `snippets` (
`id` text PRIMARY KEY NOT NULL,
`document_id` text NOT NULL,
`repository_id` text NOT NULL,
`version_id` text,
`type` text NOT NULL,
`title` text,
`content` text NOT NULL,
`language` text,
`breadcrumb` text,
`token_count` integer DEFAULT 0,
`created_at` integer NOT NULL,
FOREIGN KEY (`document_id`) REFERENCES `documents`(`id`) ON UPDATE no action ON DELETE cascade,
FOREIGN KEY (`repository_id`) REFERENCES `repositories`(`id`) ON UPDATE no action ON DELETE cascade,
FOREIGN KEY (`version_id`) REFERENCES `repository_versions`(`id`) ON UPDATE no action ON DELETE cascade
);