Merge branch 'orm' into 'main'

Orm

See merge request fedeo/backend!7
This commit is contained in:
2025-12-10 07:40:46 +00:00

View File

@@ -373,13 +373,13 @@ export default async function resourceRoutes(server: FastifyInstance) {
// ------------------------------------------------------------- // -------------------------------------------------------------
// DETAIL (mit JOINS) // DETAIL (mit JOINS)
// ------------------------------------------------------------- // -------------------------------------------------------------
server.get("/resource/:resource/:id", async (req, reply) => { server.get("/resource/:resource/:id/:no_relations?", async (req, reply) => {
try { try {
const { id } = req.params as { id: string } const { id } = req.params as { id: string }
const tenantId = req.user?.tenant_id const tenantId = req.user?.tenant_id
if (!tenantId) return reply.code(400).send({ error: "No tenant selected" }) if (!tenantId) return reply.code(400).send({ error: "No tenant selected" })
const {resource} = req.params as { resource: string } const {resource, no_relations} = req.params as { resource: string, no_relations?: boolean }
const table = resourceConfig[resource].table const table = resourceConfig[resource].table
const projRows = await server.db const projRows = await server.db
@@ -402,20 +402,24 @@ export default async function resourceRoutes(server: FastifyInstance) {
...projRows[0] ...projRows[0]
} }
if(resourceConfig[resource].mtoLoad) { if(!no_relations) {
for await (const relation of resourceConfig[resource].mtoLoad ) { if(resourceConfig[resource].mtoLoad) {
if(data[relation]) { for await (const relation of resourceConfig[resource].mtoLoad ) {
data[relation] = (await server.db.select().from(resourceConfig[relation + "s"].table).where(eq(resourceConfig[relation + "s"].table.id, data[relation])))[0] if(data[relation]) {
data[relation] = (await server.db.select().from(resourceConfig[relation + "s"].table).where(eq(resourceConfig[relation + "s"].table.id, data[relation])))[0]
}
}
}
if(resourceConfig[resource].mtmLoad) {
for await (const relation of resourceConfig[resource].mtmLoad ) {
console.log(relation)
data[relation] = await server.db.select().from(resourceConfig[relation].table).where(eq(resourceConfig[relation].table[resource.substring(0,resource.length - 1)],id))
} }
} }
} }
if(resourceConfig[resource].mtmLoad) {
for await (const relation of resourceConfig[resource].mtmLoad ) {
console.log(relation)
data[relation] = await server.db.select().from(resourceConfig[relation].table).where(eq(resourceConfig[relation].table[resource.substring(0,resource.length - 1)],id))
}
}
return data return data
@@ -477,58 +481,63 @@ export default async function resourceRoutes(server: FastifyInstance) {
// UPDATE (inkl. Soft-Delete/Archive) // UPDATE (inkl. Soft-Delete/Archive)
server.put("/resource/:resource/:id", async (req, reply) => { server.put("/resource/:resource/:id", async (req, reply) => {
const {resource, id} = req.params as { resource: string; id: string } try {
const body = req.body as Record<string, any> const {resource, id} = req.params as { resource: string; id: string }
const body = req.body as Record<string, any>
const tenantId = (req.user as any)?.tenant_id const tenantId = (req.user as any)?.tenant_id
const userId = (req.user as any)?.user_id const userId = (req.user as any)?.user_id
if (!tenantId || !userId) { if (!tenantId || !userId) {
return reply.code(401).send({error: "Unauthorized"}) return reply.code(401).send({error: "Unauthorized"})
}
const table = resourceConfig[resource].table
//TODO: HISTORY
const normalizeDate = (val: any) => {
const d = new Date(val)
return isNaN(d.getTime()) ? null : d
}
console.log(body)
Object.keys(body).forEach((key) => {
if(key.includes("_at") || key.includes("At")) {
body[key] = normalizeDate(body[key])
} }
})
const [updated] = await server.db const table = resourceConfig[resource].table
.update(table)
.set({...body, updated_at: new Date().toISOString(), updated_by: userId})
.where(and(
eq(table.id, id),
eq(table.tenant, tenantId)))
.returning()
//const diffs = diffObjects(oldItem, newItem); //TODO: HISTORY
const normalizeDate = (val: any) => {
const d = new Date(val)
return isNaN(d.getTime()) ? null : d
}
console.log(body)
Object.keys(body).forEach((key) => {
if(key.includes("_at") || key.includes("At")) {
body[key] = normalizeDate(body[key])
}
})
const [updated] = await server.db
.update(table)
.set({...body, updated_at: new Date().toISOString(), updated_by: userId})
.where(and(
eq(table.id, id),
eq(table.tenant, tenantId)))
.returning()
//const diffs = diffObjects(oldItem, newItem);
/*for (const d of diffs) { /*for (const d of diffs) {
await insertHistoryItem(server, { await insertHistoryItem(server, {
entity: resource, entity: resource,
entityId: id, entityId: id,
action: d.type, action: d.type,
created_by: userId, created_by: userId,
tenant_id: tenantId, tenant_id: tenantId,
oldVal: d.oldValue ? String(d.oldValue) : null, oldVal: d.oldValue ? String(d.oldValue) : null,
newVal: d.newValue ? String(d.newValue) : null, newVal: d.newValue ? String(d.newValue) : null,
text: `Feld "${d.label}" ${d.typeLabel}: ${d.oldValue ?? ""} → ${d.newValue ?? ""}`, text: `Feld "${d.label}" ${d.typeLabel}: ${d.oldValue ?? ""} → ${d.newValue ?? ""}`,
}); });
}*/ }*/
return updated
} catch (err) {
console.log("ERROR /resource/projects/:id", err)
}
return updated
}) })
} }