feat(ocr): implement create and update provider endpoints

add POST handler for creating new OCR providers
add PUT handler for updating existing OCR providers
add required request/response types and schemas
This commit is contained in:
icarus 2025-10-20 07:35:03 +08:00
parent b67b4c8178
commit a042892250
4 changed files with 77 additions and 9 deletions

View File

@ -1,11 +1,15 @@
// NOTE: Types are defined inline in the schema for simplicity
// If needed, specific types can be imported from './apiModels'
import type {
CreateOcrProviderRequest,
CreateOcrProviderResponse,
GetOcrProviderResponse,
ListOcrProvidersResponse,
OcrProviderId,
PatchOcrProviderRequest,
PatchOcrProviderResponse
PatchOcrProviderResponse,
PutOcrProviderRequest,
PutOcrProviderResponse
} from '@types'
import type { BodyForPath, ConcreteApiPaths, QueryParamsForPath, ResponseForPath } from './apiPaths'
@ -359,9 +363,8 @@ export interface ApiSchemas {
response: ListOcrProvidersResponse
}
POST: {
body: {
// TODO
}
body: CreateOcrProviderRequest
response: CreateOcrProviderResponse
}
}
@ -375,7 +378,8 @@ export interface ApiSchemas {
response: PatchOcrProviderResponse
}
PUT: {
// TODO
body: PutOcrProviderRequest
response: PutOcrProviderResponse
}
DELETE: {
// TODO

View File

@ -215,8 +215,8 @@ export const apiHandlers: ApiImplementation = {
GET: async () => {
return ocrService.listProviders()
},
POST: async () => {
throw new Error('Not implemented')
POST: async ({ body }) => {
return ocrService.createProvider(body)
}
},
@ -227,8 +227,8 @@ export const apiHandlers: ApiImplementation = {
PATCH: async ({ body }) => {
return ocrService.patchProvider(body)
},
PUT: async () => {
throw new Error('Not implemented')
PUT: async ({ body }) => {
return ocrService.putProvider(body)
},
DELETE: async () => {
throw new Error('Not implemented')

View File

@ -2,11 +2,15 @@ import { dbService } from '@data/db/DbService'
import { ocrProviderTable } from '@data/db/schemas/ocr/provider'
import { loggerService } from '@logger'
import type {
CreateOcrProviderRequest,
CreateOcrProviderResponse,
ListOcrProvidersResponse,
OcrParams,
OcrResult,
PatchOcrProviderRequest,
PatchOcrProviderResponse,
PutOcrProviderRequest,
PutOcrProviderResponse,
SupportedOcrFile
} from '@types'
import { BuiltinOcrProviderIds } from '@types'
@ -99,6 +103,46 @@ export class OcrService {
return { data: updated }
}
public async createProvider(create: CreateOcrProviderRequest): Promise<CreateOcrProviderResponse> {
const providers = await dbService
.getDb()
.select()
.from(ocrProviderTable)
.where(eq(ocrProviderTable.id, create.id))
.limit(1)
if (providers.length > 0) {
throw new Error(`OCR provider ${create.id} already exists`)
}
const [created] = await dbService.getDb().insert(ocrProviderTable).values(create).returning()
return { data: created }
}
public async putProvider(update: PutOcrProviderRequest): Promise<PutOcrProviderResponse> {
const providers = await dbService
.getDb()
.select()
.from(ocrProviderTable)
.where(eq(ocrProviderTable.id, update.id))
.limit(1)
if (providers.length === 0) {
const [created] = await dbService.getDb().insert(ocrProviderTable).values(update).returning()
return { data: created }
}
const [updated] = await dbService
.getDb()
.update(ocrProviderTable)
.set(update)
.where(eq(ocrProviderTable.id, update.id))
.returning()
return { data: updated }
}
public async ocr(file: SupportedOcrFile, params: OcrParams): Promise<OcrResult> {
const service = this.registry.get(params.providerId)
if (!service) {

View File

@ -291,3 +291,23 @@ export const PatchOcrProviderResponseSchema = z.object({
})
export type PatchOcrProviderResponse = z.infer<typeof PatchOcrProviderResponseSchema>
export const CreateOcrProviderRequestSchema = OcrProviderSchema
export type CreateOcrProviderRequest = z.infer<typeof CreateOcrProviderRequestSchema>
export const CreateOcrProviderResponseSchema = z.object({
data: DbOcrProviderSchema
})
export type CreateOcrProviderResponse = z.infer<typeof CreateOcrProviderResponseSchema>
export const PutOcrProviderRequestSchema = OcrProviderSchema
export type PutOcrProviderRequest = z.infer<typeof PutOcrProviderRequestSchema>
export const PutOcrProviderResponseSchema = z.object({
data: DbOcrProviderSchema
})
export type PutOcrProviderResponse = z.infer<typeof PutOcrProviderResponseSchema>