import { createHandler } from './_shared/middleware' import { update as adminUpdate, list as adminList } from './admin-data' function adminDataList(ctx: any, entity: string, filters: Record) { return adminList({ ...ctx, query: { ...(ctx.query || {}), entity, ...filters } } as any, {}) } function adminDataUpdate(ctx: any, entity: string, id: string, fields: Record) { return adminUpdate({ ...ctx, query: { ...(ctx.query || {}), entity, id } } as any, fields) } export const handler = createHandler(async (ctx, body) => { const { item_id, action } = (body || {}) as { item_id?: string; action?: 'claim' | 'release' } if (!item_id) { const e: any = new Error('item_id is required') e.statusCode = 400 throw e } if (!action || !['claim', 'release'].includes(action)) { const e: any = new Error("action must be 'claim' or 'release'") e.statusCode = 400 throw e } const itemResult = await adminDataList(ctx, 'items', { id: item_id, limit: '1' }) const item = Array.isArray(itemResult) ? itemResult[0] : (itemResult as any)?.data?.[0] if (!item) { const e: any = new Error('Work item not found') e.statusCode = 404 throw e } const principalId = ctx.principal?.id const currentData = item.data || {} if (action === 'claim') { if (item.assignee_id && item.assignee_id !== principalId) { const e: any = new Error('Work item is already claimed by another user') e.statusCode = 409 throw e } const updated = await adminDataUpdate(ctx, 'items', item_id, { status: 'assigned', assignee_id: principalId, data: { ...currentData, claimed_at: new Date().toISOString() }, }) return { ok: true, action, item: updated } } const updated = await adminDataUpdate(ctx, 'items', item_id, { status: 'backlog', assignee_id: null, data: { ...currentData, claimed_at: null }, }) return { ok: true, action, item: updated } })