Logbuch Überarbeitung
This commit is contained in:
@@ -12,6 +12,8 @@ import {
|
||||
|
||||
import { resourceConfig } from "../../utils/resource.config";
|
||||
import { useNextNumberRangeNumber } from "../../utils/functions";
|
||||
import { insertHistoryItem } from "../../utils/history";
|
||||
import { diffObjects } from "../../utils/diff";
|
||||
import { recalculateServicePricesForTenant } from "../../modules/service-price-recalculation.service";
|
||||
|
||||
// -------------------------------------------------------------
|
||||
@@ -31,6 +33,42 @@ function buildSearchCondition(columns: any[], search: string) {
|
||||
return or(...conditions)
|
||||
}
|
||||
|
||||
function formatDiffValue(value: any): string {
|
||||
if (value === null || value === undefined) return "-"
|
||||
if (typeof value === "boolean") return value ? "Ja" : "Nein"
|
||||
if (typeof value === "object") {
|
||||
try {
|
||||
return JSON.stringify(value)
|
||||
} catch {
|
||||
return "[Objekt]"
|
||||
}
|
||||
}
|
||||
return String(value)
|
||||
}
|
||||
|
||||
const TECHNICAL_HISTORY_KEYS = new Set([
|
||||
"id",
|
||||
"tenant",
|
||||
"tenant_id",
|
||||
"createdAt",
|
||||
"created_at",
|
||||
"createdBy",
|
||||
"created_by",
|
||||
"updatedAt",
|
||||
"updated_at",
|
||||
"updatedBy",
|
||||
"updated_by",
|
||||
"archived",
|
||||
])
|
||||
|
||||
function getUserVisibleChanges(oldRecord: Record<string, any>, updated: Record<string, any>) {
|
||||
return diffObjects(oldRecord, updated).filter((c) => !TECHNICAL_HISTORY_KEYS.has(c.key))
|
||||
}
|
||||
|
||||
function buildFieldUpdateHistoryText(resource: string, label: string, oldValue: any, newValue: any) {
|
||||
return `${resource}: ${label} geändert von "${formatDiffValue(oldValue)}" zu "${formatDiffValue(newValue)}"`
|
||||
}
|
||||
|
||||
export default async function resourceRoutes(server: FastifyInstance) {
|
||||
|
||||
// -------------------------------------------------------------
|
||||
@@ -349,6 +387,23 @@ export default async function resourceRoutes(server: FastifyInstance) {
|
||||
await recalculateServicePricesForTenant(server, req.user.tenant_id, req.user?.user_id || null);
|
||||
}
|
||||
|
||||
if (created) {
|
||||
try {
|
||||
await insertHistoryItem(server, {
|
||||
tenant_id: req.user.tenant_id,
|
||||
created_by: req.user?.user_id || null,
|
||||
entity: resource,
|
||||
entityId: created.id,
|
||||
action: "created",
|
||||
oldVal: null,
|
||||
newVal: created,
|
||||
text: `Neuer Eintrag in ${resource} erstellt`,
|
||||
})
|
||||
} catch (historyError) {
|
||||
server.log.warn({ err: historyError, resource }, "Failed to write create history entry")
|
||||
}
|
||||
}
|
||||
|
||||
return created;
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
@@ -369,6 +424,12 @@ export default async function resourceRoutes(server: FastifyInstance) {
|
||||
const table = resourceConfig[resource].table
|
||||
const normalizeDate = (val: any) => { const d = new Date(val); return isNaN(d.getTime()) ? null : d; }
|
||||
|
||||
const [oldRecord] = await server.db
|
||||
.select()
|
||||
.from(table)
|
||||
.where(and(eq(table.id, id), eq(table.tenant, tenantId)))
|
||||
.limit(1)
|
||||
|
||||
let data = { ...body, updated_at: new Date().toISOString(), updated_by: userId }
|
||||
//@ts-ignore
|
||||
delete data.updatedBy; delete data.updatedAt;
|
||||
@@ -385,6 +446,39 @@ export default async function resourceRoutes(server: FastifyInstance) {
|
||||
await recalculateServicePricesForTenant(server, tenantId, userId);
|
||||
}
|
||||
|
||||
if (updated) {
|
||||
try {
|
||||
const changes = oldRecord ? getUserVisibleChanges(oldRecord, updated) : []
|
||||
if (!changes.length) {
|
||||
await insertHistoryItem(server, {
|
||||
tenant_id: tenantId,
|
||||
created_by: userId,
|
||||
entity: resource,
|
||||
entityId: updated.id,
|
||||
action: "updated",
|
||||
oldVal: oldRecord || null,
|
||||
newVal: updated,
|
||||
text: `Eintrag in ${resource} geändert`,
|
||||
})
|
||||
} else {
|
||||
for (const change of changes) {
|
||||
await insertHistoryItem(server, {
|
||||
tenant_id: tenantId,
|
||||
created_by: userId,
|
||||
entity: resource,
|
||||
entityId: updated.id,
|
||||
action: "updated",
|
||||
oldVal: change.oldValue,
|
||||
newVal: change.newValue,
|
||||
text: buildFieldUpdateHistoryText(resource, change.label, change.oldValue, change.newValue),
|
||||
})
|
||||
}
|
||||
}
|
||||
} catch (historyError) {
|
||||
server.log.warn({ err: historyError, resource, id }, "Failed to write update history entry")
|
||||
}
|
||||
}
|
||||
|
||||
return updated
|
||||
} catch (err) {
|
||||
console.error(err)
|
||||
|
||||
Reference in New Issue
Block a user