From f10f0b21f93739f18ed865023e78645a791a7231 Mon Sep 17 00:00:00 2001 From: icarus Date: Mon, 20 Oct 2025 05:08:24 +0800 Subject: [PATCH] Revert "refactor(db): remove unused ocr provider schema table" This reverts commit 9c740f82ad58dc25d23a8ad688ab3d1cbb615dab. --- src/main/data/db/schemas/ocr/provider.ts | 50 ++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 src/main/data/db/schemas/ocr/provider.ts diff --git a/src/main/data/db/schemas/ocr/provider.ts b/src/main/data/db/schemas/ocr/provider.ts new file mode 100644 index 0000000000..75b2281ec2 --- /dev/null +++ b/src/main/data/db/schemas/ocr/provider.ts @@ -0,0 +1,50 @@ +import type { OcrProviderCapabilityRecord, OcrProviderConfig } from '@types' +import { index, sqliteTable, text } from 'drizzle-orm/sqlite-core' + +import { createUpdateTimestamps } from '../columnHelpers' + +export const ocrProviderTable = sqliteTable( + 'ocr_provider', + { + /** + * Unique identifier for the provider. + * For built-in providers, it's 'tesseract', 'system', etc. + * For custom providers, it can be any unique string (we typically use UUID v4). + * As the primary key, it ensures the uniqueness of each provider. + */ + id: text('id').primaryKey(), + + /** + * Display name of the provider, e.g., "Tesseract OCR". + * For built-in providers, this value is used internally and is not exposed to users; the display name shown in the UI is locale-based by i18n. + * Cannot be null. + */ + name: text('name').notNull(), + + /** + * Object describing the provider's capabilities, e.g., { image: true }. + * Stored as JSON in a text column. Drizzle's `mode: 'json'` handles + * serialization and deserialization automatically. `$type` provides strong typing. + * Cannot be null; should store an empty object `{}` even if no specific capabilities. + */ + capabilities: text('capabilities', { mode: 'json' }).$type().notNull(), + + /** + * Provider-specific configuration. This is a polymorphic field, its structure varies by provider type. + * For example, Tesseract's configuration is entirely different from PaddleOCR's. + * Storing it as JSON is the most flexible approach to accommodate any configuration structure. + * Since this is a polymorphic field, both frontend and backend must validate + * that the structure matches the expected schema for the corresponding provider type + * before saving. + * This field is nullable because `config` in the `OcrProvider` type is optional. + */ + config: text('config', { mode: 'json' }).$type(), + + /** Timestamps. May not useful. */ + ...createUpdateTimestamps + }, + (t) => [index('name').on(t.name)] +) + +export type OcrProviderInsert = typeof ocrProviderTable.$inferInsert +export type OcrProviderSelect = typeof ocrProviderTable.$inferSelect