60 lines
1.6 KiB
TypeScript
60 lines
1.6 KiB
TypeScript
import { z } from 'zod'
|
|
|
|
const PatchSchema = z.object({
|
|
nom: z.string().min(2).max(50).trim(),
|
|
besoin: z.string().min(5).max(300).trim(),
|
|
offre: z.string().min(5).max(300).trim(),
|
|
hashtags: z.array(z.string().max(30)).max(3).default([]),
|
|
})
|
|
|
|
export default defineEventHandler(async (event) => {
|
|
const config = useRuntimeConfig()
|
|
const tableId = config.codevTableId
|
|
const baseId = config.codevBaseId || 'pipilvsi7dibo80'
|
|
const id = getRouterParam(event, 'id')
|
|
const body = await readBody(event)
|
|
|
|
if (!tableId || !id) {
|
|
throw createError({ statusCode: 400, message: 'Parametre manquant' })
|
|
}
|
|
|
|
const parsed = PatchSchema.safeParse(body)
|
|
if (!parsed.success) {
|
|
throw createError({
|
|
statusCode: 422,
|
|
statusMessage: 'Validation echouee',
|
|
data: parsed.error.flatten().fieldErrors,
|
|
})
|
|
}
|
|
|
|
const payload = {
|
|
nom: parsed.data.nom,
|
|
besoin: parsed.data.besoin,
|
|
offre: parsed.data.offre,
|
|
hashtags: parsed.data.hashtags
|
|
.map((h) => h.trim().toLowerCase().replace(/^#/, ''))
|
|
.filter(Boolean)
|
|
.slice(0, 3)
|
|
.join(','),
|
|
}
|
|
|
|
// NocoDB v1 PATCH par Id
|
|
const url = `${config.nocodbUrl}/api/v1/db/data/noco/${baseId}/${tableId}/${id}`
|
|
|
|
try {
|
|
await $fetch(url, {
|
|
method: 'PATCH',
|
|
headers: {
|
|
'xc-token': config.nocodbToken,
|
|
'Content-Type': 'application/json',
|
|
},
|
|
body: JSON.stringify(payload),
|
|
})
|
|
} catch (e: any) {
|
|
console.error('[codev/fiches.patch] NocoDB patch error:', e?.message ?? e)
|
|
throw createError({ statusCode: 502, statusMessage: 'Erreur serveur' })
|
|
}
|
|
|
|
return { status: 200, ok: true }
|
|
})
|