V13-FE-006: consolidate approved UI and contract hardening
deploy / deploy (push) Successful in 1m52s
deploy / notify (push) Successful in 1s

This commit is contained in:
2026-08-13 02:41:00 +09:00
parent d79edae546
commit 3f293d8aa8
1278 changed files with 14384 additions and 1664 deletions
@@ -0,0 +1,33 @@
import { isKbxProblem, type KbxLookupProvider } from '@kbx/contracts'
import { kbxApi } from '../http/generated/kbxApiClient'
const lookupOperations = {
customer: { search: 'lookup.customers.search', byId: 'lookup.customers.resolveById', byCode: 'lookup.customers.resolveByCode' },
item: { search: 'lookup.items.search', byId: 'lookup.items.resolveById', byCode: 'lookup.items.resolveByCode' },
warehouse: { search: 'lookup.warehouses.search', byId: 'lookup.warehouses.resolveById', byCode: 'lookup.warehouses.resolveByCode' },
} as const
type LookupEntity = keyof typeof lookupOperations
function provider(entity: LookupEntity): KbxLookupProvider<string> {
const ops = lookupOperations[entity]
return {
search(request) {
return kbxApi.request(ops.search, { query: request })
},
async resolveById(id) {
try { return await kbxApi.request(ops.byId, { path: { id } }) }
catch (error) { if (isKbxProblem(error) && error.type === 'not-found') return null; throw error }
},
async resolveByCode(code) {
try { return await kbxApi.request(ops.byCode, { path: { code } }) }
catch (error) { if (isKbxProblem(error) && error.type === 'not-found') return null; throw error }
},
} as KbxLookupProvider<string>
}
export const lookupRegistry = {
customer: provider('customer'),
item: provider('item'),
warehouse: provider('warehouse'),
}