55 lines
1.7 KiB
TypeScript
55 lines
1.7 KiB
TypeScript
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<string, unknown>;
|
|
}
|
|
|
|
@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;
|
|
}
|