Platform backbone (plan 2026-10-13-plattform-rueckgrat), reviewed tasks: - run roles api/worker/job/all with shared startup checks (Task 1) - schema and migration for DomainEvent, deliveries, JobRun, ThrottlerHit (Task 2) - audit, notifications and domain events written in the same transaction (Task 3) - dispatcher with SKIP LOCKED claims, retries and stale release (Task 4) - worker building blocks: tick, LISTEN/NOTIFY wake-up, health (Task 5) - worker process and entry points (Task 6) - throttler counters in Postgres (Task 19) - separate keys per purpose with key ring (Task 20) - public origin page without exact location (Task 22) - shop keys split into read and write (Task 23) - Kustomize base, components, overlay encry, CI validation (Task 26) Field capture T3 (plan 2026-10-13-t3-erfassung-am-stand), reviewed tasks: - brood frames, read endpoints, apiary overview and offline pack - network basics, offline queue v3, navigation sheets, form building blocks - new inspection with last-time hints and weather, varroa per day, treatment prefill, apiary page with round - inspection photo (Task 10) is implemented, review pending Not rolled out. Remaining tasks follow in later commits. Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
54 lines
1.5 KiB
TypeScript
54 lines
1.5 KiB
TypeScript
import { Injectable } from '@nestjs/common';
|
|
import { PrismaService } from '../prisma/prisma.service';
|
|
import { DbClient } from '../prisma/db-client';
|
|
import { AuditAction, AuditLog, Prisma } from '../../generated/prisma';
|
|
|
|
export interface RecordAuditLogInput {
|
|
entityType: string;
|
|
entityId: string;
|
|
action: AuditAction;
|
|
userId?: string;
|
|
beforeData?: unknown;
|
|
afterData?: unknown;
|
|
}
|
|
|
|
export interface AuditLogFilter {
|
|
entityType?: string;
|
|
entityId?: string;
|
|
}
|
|
|
|
@Injectable()
|
|
export class AuditLogService {
|
|
constructor(private readonly prisma: PrismaService) {}
|
|
|
|
/**
|
|
* With `tx` the entry commits or rolls back together with the change it
|
|
* describes - no audited change without its entry, and no entry for a
|
|
* change that never happened.
|
|
*/
|
|
async record(
|
|
input: RecordAuditLogInput,
|
|
tx?: Prisma.TransactionClient,
|
|
): Promise<void> {
|
|
const db: DbClient = tx ?? this.prisma;
|
|
await db.auditLog.create({
|
|
data: {
|
|
entityType: input.entityType,
|
|
entityId: input.entityId,
|
|
action: input.action,
|
|
userId: input.userId,
|
|
beforeData: input.beforeData as Prisma.InputJsonValue,
|
|
afterData: input.afterData as Prisma.InputJsonValue,
|
|
},
|
|
});
|
|
}
|
|
|
|
async findAll(filter: AuditLogFilter = {}): Promise<AuditLog[]> {
|
|
return this.prisma.auditLog.findMany({
|
|
where: { entityType: filter.entityType, entityId: filter.entityId },
|
|
orderBy: { timestamp: 'desc' },
|
|
take: 200,
|
|
});
|
|
}
|
|
}
|