import { Injectable } from '@nestjs/common'; import { Prisma } from '@prisma/client'; import { PrismaService } from '../prisma/prisma.service'; export interface CreateOperationLogDto { tenantId?: string; userId?: string; action: string; resource: string; resourceId?: string; ipAddress?: string; userAgent?: string; detail?: Record; } @Injectable() export class AuditService { constructor(private readonly prisma: PrismaService) {} async list(tenantId?: string, pageInput?: number, pageSizeInput?: number) { const page = positiveInteger(pageInput, 1); const pageSize = Math.min(100, positiveInteger(pageSizeInput, 20)); const where = tenantId ? { tenantId } : undefined; const [items, total] = await Promise.all([ this.prisma.operationLog.findMany({ where, orderBy: [{ createdAt: 'desc' }, { id: 'desc' }], skip: (page - 1) * pageSize, take: pageSize, }), this.prisma.operationLog.count({ where }), ]); return { items, total, page, pageSize }; } create(data: CreateOperationLogDto) { const createData: Prisma.OperationLogUncheckedCreateInput = { tenantId: data.tenantId, userId: data.userId, action: data.action, resource: data.resource, resourceId: data.resourceId, ipAddress: data.ipAddress, userAgent: data.userAgent, detail: data.detail as Prisma.InputJsonValue | undefined, }; return this.prisma.operationLog.create({ data: createData }); } } function positiveInteger(value: number | undefined, fallback: number) { const normalized = Number(value); return Number.isInteger(normalized) && normalized > 0 ? normalized : fallback; }