mirror of
https://github.com/CherryHQ/cherry-studio.git
synced 2025-12-31 16:49:07 +08:00
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:
parent
b67b4c8178
commit
a042892250
@ -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
|
||||
|
||||
@ -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')
|
||||
|
||||
@ -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) {
|
||||
|
||||
@ -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>
|
||||
|
||||
Loading…
Reference in New Issue
Block a user