- replace custom DB adapter with Drizzle setup (SQLite/Postgres schemas) and add `drizzle.config.ts` plus migrations in `drizzle/` and `drizzle_pg/` - switch better-auth to drizzleAdapter, add auth helpers (`getAuthContext`, `requireAuthContext`, `requireAudiobookOwned`), and make `useAuth`/`useAuthSession` safe no-ops when auth is disabled - persist documents/audiobooks in DB with ownership checks, unclaimed fallback, and ref-counted deletes; add FS scan helper for no-auth mode - gate docx-to-pdf, library, voices, whisper, and migration endpoints behind auth when enabled - add unclaimed data scan/claim flow with `/api/user/claim`, `ClaimDataModal`, and server-side scan/claim helpers - refactor rate limiting and account deletion to use Drizzle tables (`user_tts_chars`, `user`) - run migrations via `scripts/migrate-if-auth.mjs` (auto on `pnpm start` + `pnpm migrate`), remove Docker entrypoint and old better-auth migration file - update README and lockfile for the new migration workflow and dependencies
93 lines
2.8 KiB
SQL
93 lines
2.8 KiB
SQL
CREATE TABLE `account` (
|
|
`id` text PRIMARY KEY NOT NULL,
|
|
`account_id` text NOT NULL,
|
|
`provider_id` text NOT NULL,
|
|
`user_id` text NOT NULL,
|
|
`access_token` text,
|
|
`refresh_token` text,
|
|
`id_token` text,
|
|
`access_token_expires_at` integer,
|
|
`refresh_token_expires_at` integer,
|
|
`scope` text,
|
|
`password` text,
|
|
`created_at` integer NOT NULL,
|
|
`updated_at` integer NOT NULL,
|
|
FOREIGN KEY (`user_id`) REFERENCES `user`(`id`) ON UPDATE no action ON DELETE no action
|
|
);
|
|
--> statement-breakpoint
|
|
CREATE TABLE `audiobook_chapters` (
|
|
`id` text PRIMARY KEY NOT NULL,
|
|
`book_id` text NOT NULL,
|
|
`user_id` text,
|
|
`chapter_index` integer NOT NULL,
|
|
`title` text NOT NULL,
|
|
`duration` real DEFAULT 0,
|
|
`file_path` text NOT NULL,
|
|
`format` text NOT NULL,
|
|
FOREIGN KEY (`book_id`) REFERENCES `audiobooks`(`id`) ON UPDATE no action ON DELETE cascade
|
|
);
|
|
--> statement-breakpoint
|
|
CREATE TABLE `audiobooks` (
|
|
`id` text PRIMARY KEY NOT NULL,
|
|
`user_id` text,
|
|
`title` text NOT NULL,
|
|
`author` text,
|
|
`description` text,
|
|
`cover_path` text,
|
|
`duration` real DEFAULT 0,
|
|
`created_at` integer DEFAULT (cast(strftime('%s','now') as int) * 1000)
|
|
);
|
|
--> statement-breakpoint
|
|
CREATE TABLE `documents` (
|
|
`id` text,
|
|
`user_id` text NOT NULL,
|
|
`name` text NOT NULL,
|
|
`type` text NOT NULL,
|
|
`size` integer NOT NULL,
|
|
`last_modified` integer NOT NULL,
|
|
`file_path` text NOT NULL,
|
|
`created_at` integer DEFAULT (cast(strftime('%s','now') as int) * 1000),
|
|
PRIMARY KEY(`id`, `user_id`)
|
|
);
|
|
--> statement-breakpoint
|
|
CREATE TABLE `session` (
|
|
`id` text PRIMARY KEY NOT NULL,
|
|
`expires_at` integer NOT NULL,
|
|
`token` text NOT NULL,
|
|
`created_at` integer NOT NULL,
|
|
`updated_at` integer NOT NULL,
|
|
`ip_address` text,
|
|
`user_agent` text,
|
|
`user_id` text NOT NULL,
|
|
FOREIGN KEY (`user_id`) REFERENCES `user`(`id`) ON UPDATE no action ON DELETE no action
|
|
);
|
|
--> statement-breakpoint
|
|
CREATE UNIQUE INDEX `session_token_unique` ON `session` (`token`);--> statement-breakpoint
|
|
CREATE TABLE `user` (
|
|
`id` text PRIMARY KEY NOT NULL,
|
|
`name` text NOT NULL,
|
|
`email` text NOT NULL,
|
|
`email_verified` integer NOT NULL,
|
|
`image` text,
|
|
`created_at` integer NOT NULL,
|
|
`updated_at` integer NOT NULL,
|
|
`is_anonymous` integer
|
|
);
|
|
--> statement-breakpoint
|
|
CREATE UNIQUE INDEX `user_email_unique` ON `user` (`email`);--> statement-breakpoint
|
|
CREATE TABLE `user_tts_chars` (
|
|
`user_id` text NOT NULL,
|
|
`date` text NOT NULL,
|
|
`char_count` integer DEFAULT 0,
|
|
`created_at` integer DEFAULT (cast(strftime('%s','now') as int) * 1000),
|
|
`updated_at` integer DEFAULT (cast(strftime('%s','now') as int) * 1000),
|
|
PRIMARY KEY(`user_id`, `date`)
|
|
);
|
|
--> statement-breakpoint
|
|
CREATE INDEX `idx_user_tts_chars_date` ON `user_tts_chars` (`date`);--> statement-breakpoint
|
|
CREATE TABLE `verification` (
|
|
`id` text PRIMARY KEY NOT NULL,
|
|
`identifier` text NOT NULL,
|
|
`value` text NOT NULL,
|
|
`updated_at` integer
|
|
);
|