From 389dfc08f6d9bc69e2f1c1aebe40efd375e5940a Mon Sep 17 00:00:00 2001 From: icarus Date: Mon, 20 Oct 2025 07:54:50 +0800 Subject: [PATCH] feat(ocr): add filtering by registration status to provider list Add optional query parameter to filter OCR providers by registration status Prevent modification and deletion of built-in OCR providers --- packages/shared/data/api/apiSchemas.ts | 1 + src/main/data/api/handlers/index.ts | 4 ++-- src/main/services/ocr/OcrService.ts | 23 +++++++++++++---------- 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/packages/shared/data/api/apiSchemas.ts b/packages/shared/data/api/apiSchemas.ts index b1f07618b2..6089c24b96 100644 --- a/packages/shared/data/api/apiSchemas.ts +++ b/packages/shared/data/api/apiSchemas.ts @@ -360,6 +360,7 @@ export interface ApiSchemas { '/ocr/providers': { GET: { + query: { registered?: boolean } response: ListOcrProvidersResponse } POST: { diff --git a/src/main/data/api/handlers/index.ts b/src/main/data/api/handlers/index.ts index d0ea4f2447..9b524ea46c 100644 --- a/src/main/data/api/handlers/index.ts +++ b/src/main/data/api/handlers/index.ts @@ -212,8 +212,8 @@ export const apiHandlers: ApiImplementation = { }, '/ocr/providers': { - GET: async () => { - return ocrService.listProviders() + GET: async ({ query }) => { + return ocrService.listProviders(query.registered) }, POST: async ({ body }) => { return ocrService.createProvider(body) diff --git a/src/main/services/ocr/OcrService.ts b/src/main/services/ocr/OcrService.ts index 7128de03c4..e7faca6254 100644 --- a/src/main/services/ocr/OcrService.ts +++ b/src/main/services/ocr/OcrService.ts @@ -13,7 +13,7 @@ import type { PutOcrProviderResponse, SupportedOcrFile } from '@types' -import { BuiltinOcrProviderIdMap } from '@types' +import { BuiltinOcrProviderIdMap, BuiltinOcrProviderIds } from '@types' import { eq } from 'drizzle-orm' import { merge } from 'lodash' @@ -56,17 +56,17 @@ export class OcrService { this.registry.delete(providerId) } - public async listProviders(): Promise { - const registeredKeys = Array.from(this.registry.keys()) + public async listProviders(registered?: boolean): Promise { const providers = await dbService.getDb().select().from(ocrProviderTable) - - return { data: providers.filter((p) => registeredKeys.includes(p.id)) } + if (registered) { + const registeredKeys = Array.from(this.registry.keys()) + return { data: providers.filter((p) => registeredKeys.includes(p.id)) } + } else { + return { data: providers } + } } public async getProvider(providerId: string) { - if (!this.registry.has(providerId)) { - throw new Error(`OCR provider ${providerId} is not registered`) - } const providers = await dbService .getDb() .select() @@ -121,6 +121,9 @@ export class OcrService { } public async putProvider(update: PutOcrProviderRequest): Promise { + if (BuiltinOcrProviderIds.some((pid) => pid === update.id)) { + throw new Error('Builtin OCR providers cannot be modified with PUT method.') + } const providers = await dbService .getDb() .select() @@ -144,8 +147,8 @@ export class OcrService { } public async deleteProvider(providerId: string): Promise { - if (!this.registry.has(providerId)) { - throw new Error(`OCR provider ${providerId} is not registered`) + if (BuiltinOcrProviderIds.some((pid) => pid === providerId)) { + throw new Error('Builtin OCR providers cannot be deleted.') } const providers = await dbService .getDb()