refactor(ocr): simplify response handling by removing wrapper objects

Remove unnecessary response wrapper objects ({ data: ... }) from OCR service methods and update types accordingly
Update API handlers to maintain consistent response structure
This commit is contained in:
icarus 2025-10-20 20:58:08 +08:00
parent e0781e1bb0
commit 74e7979764
4 changed files with 39 additions and 28 deletions

View File

@ -213,28 +213,33 @@ export const apiHandlers: ApiImplementation = {
'/ocr/providers': {
GET: async ({ query }) => {
return ocrService.listProviders(query)
const result = await ocrService.listProviders(query)
return { data: result }
},
POST: async ({ body }) => {
return ocrService.createProvider(body)
const result = await ocrService.createProvider(body)
return { data: result }
}
},
'/ocr/providers/:id': {
GET: async ({ params }) => {
return ocrService.getProvider(params.id)
const result = await ocrService.getProvider(params.id)
return { data: result }
},
PATCH: async ({ params, body }) => {
if (params.id !== body.id) {
throw new Error('Provider ID in path does not match ID in body')
}
return ocrService.updateProvider(params.id, body)
const result = await ocrService.updateProvider(params.id, body)
return { data: result }
},
PUT: async ({ params, body }) => {
if (params.id !== body.id) {
throw new Error('Provider ID in path does not match ID in body')
}
return ocrService.replaceProvider(body)
const result = await ocrService.replaceProvider(body)
return { data: result }
},
DELETE: async ({ params }) => {
return ocrService.deleteProvider(params.id)

View File

@ -6,8 +6,7 @@ import type {
DbOcrProviderCreate,
DbOcrProviderReplace,
DbOcrProviderUpdate,
OcrProviderId,
UpdateOcrProviderResponse
OcrProviderId
} from '@types'
import { BuiltinOcrProviderIds, isDbOcrProvider } from '@types'
import dayjs from 'dayjs'
@ -112,7 +111,7 @@ export class OcrProviderRepository {
/**
* Update OCR provider (partial update)
*/
public async update(id: OcrProviderId, update: DbOcrProviderUpdate): Promise<UpdateOcrProviderResponse> {
public async update(id: OcrProviderId, update: DbOcrProviderUpdate): Promise<DbOcrProvider> {
try {
const existing = await this.findById(id)
@ -134,7 +133,7 @@ export class OcrProviderRepository {
.returning()
logger.info(`Updated OCR provider: ${id}`)
return { data: updated }
return updated
} catch (error) {
logger.error(`Failed to update OCR provider ${id}`, error as Error)
throw error

View File

@ -1,21 +1,17 @@
import { loggerService } from '@logger'
import { ocrProviderRepository } from '@main/data/repositories/OcrProviderRepository'
import type {
CreateOcrProviderRequest,
CreateOcrProviderResponse,
DbOcrProvider,
GetOcrProviderResponse,
ListOcrProvidersQuery,
ListOcrProvidersResponse,
OcrParams,
OcrProvider,
OcrProviderBusiness,
OcrProviderCreateBusiness,
OcrProviderKeyBusiness,
OcrProviderReplaceBusiness,
OcrProviderUpdateBusiness,
OcrResult,
ReplaceOcrProviderRequest,
ReplaceOcrProviderResponse,
SupportedOcrFile,
UpdateOcrProviderRequest,
UpdateOcrProviderResponse
SupportedOcrFile
} from '@types'
import { BuiltinOcrProviderIdMap } from '@types'
@ -119,7 +115,7 @@ class OcrService {
/**
* Get list of OCR providers
*/
public async listProviders(query?: ListOcrProvidersQuery): Promise<ListOcrProvidersResponse> {
public async listProviders(query?: ListOcrProvidersQuery): Promise<OcrProviderBusiness[]> {
try {
await this.ensureInitialized()
const providers = await ocrProviderRepository.findAll()
@ -132,7 +128,7 @@ class OcrService {
}
logger.debug(`Listed ${result.length} OCR providers`)
return { data: result }
return result
} catch (error) {
logger.error('Failed to list OCR providers', error as Error)
throw error
@ -142,12 +138,12 @@ class OcrService {
/**
* Get OCR provider by ID
*/
public async getProvider(providerId: OcrProviderKeyBusiness): Promise<GetOcrProviderResponse> {
public async getProvider(providerId: OcrProviderKeyBusiness): Promise<OcrProviderBusiness> {
try {
await this.ensureInitialized()
const provider = await ocrProviderRepository.findById(providerId)
logger.debug(`Retrieved OCR provider: ${providerId}`)
return { data: provider }
return provider
} catch (error) {
logger.error(`Failed to get OCR provider ${providerId}`, error as Error)
throw error
@ -157,12 +153,12 @@ class OcrService {
/**
* Create new OCR provider
*/
public async createProvider(data: CreateOcrProviderRequest): Promise<CreateOcrProviderResponse> {
public async createProvider(data: OcrProviderCreateBusiness): Promise<OcrProviderBusiness> {
try {
await this.ensureInitialized()
const result = await ocrProviderRepository.create(data)
logger.info(`Created OCR provider: ${data.id}`)
return { data: result }
return result
} catch (error) {
logger.error(`Failed to create OCR provider ${data.id}`, error as Error)
throw error
@ -174,8 +170,8 @@ class OcrService {
*/
public async updateProvider(
id: OcrProviderKeyBusiness,
data: UpdateOcrProviderRequest
): Promise<UpdateOcrProviderResponse> {
data: OcrProviderUpdateBusiness
): Promise<OcrProviderBusiness> {
try {
await this.ensureInitialized()
const result = await ocrProviderRepository.update(id, data)
@ -190,7 +186,7 @@ class OcrService {
/**
* Replace OCR provider (full update)
*/
public async replaceProvider(data: ReplaceOcrProviderRequest): Promise<ReplaceOcrProviderResponse> {
public async replaceProvider(data: OcrProviderReplaceBusiness): Promise<OcrProviderBusiness> {
try {
await this.ensureInitialized()
const result = await ocrProviderRepository.replace(data)
@ -285,7 +281,7 @@ class OcrService {
const availableProviders: DbOcrProvider[] = []
const capFilter = (provider: OcrProvider) => provider.capabilities.image
for (const provider of providers.data.filter(capFilter)) {
for (const provider of providers.filter(capFilter)) {
if (await this._isProviderAvailable(provider)) {
availableProviders.push(provider)
}

View File

@ -33,20 +33,31 @@ export const UpdateOcrProviderRequestSchema = z.object({
name: OcrProviderNameSchema.optional(),
config: OcrProviderConfigSchema.partial().optional()
})
export type UpdateOcrProviderRequest = z.infer<typeof UpdateOcrProviderRequestSchema>
export const UpdateOcrProviderResponseSchema = z.object({
data: DbOcrProviderSchema
})
export type UpdateOcrProviderResponse = z.infer<typeof UpdateOcrProviderResponseSchema>
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 ReplaceOcrProviderRequestSchema = OcrProviderSchema
export type ReplaceOcrProviderRequest = z.infer<typeof ReplaceOcrProviderRequestSchema>
export const ReplaceOcrProviderResponseSchema = z.object({
data: DbOcrProviderSchema
})
export type ReplaceOcrProviderResponse = z.infer<typeof ReplaceOcrProviderResponseSchema>