import { Controller, Get, Query, UseGuards } from '@nestjs/common'; import { IsInt, IsOptional, IsString, Max, Min } from 'class-validator'; import { Type } from 'class-transformer'; import { JwtAuthGuard } from '../auth/jwt-auth.guard'; import { CurrentUser } from '../auth/current-user.decorator'; import { Roles } from '../auth/roles.decorator'; import { RolesGuard } from '../auth/roles.guard'; import { OrgModuleGuard } from '../billing/org-module.guard'; import { RequireOrgModule } from '../billing/org-module.decorator'; import { AuditLogsService } from './audit-logs.service'; import { AttendanceService } from '../attendance/attendance.service'; class ListAuditQueryDto { @IsOptional() @IsString() q?: string; @IsOptional() @IsString() actorUserId?: string; @IsOptional() @IsString() entityType?: string; @IsOptional() @IsString() action?: string; @IsOptional() @Type(() => Number) @IsInt() @Min(1) page?: number; @IsOptional() @Type(() => Number) @IsInt() @Min(1) @Max(100) limit?: number; } @Controller('audit-logs') @UseGuards(JwtAuthGuard, RolesGuard, OrgModuleGuard) @RequireOrgModule('audit_logs') @Roles('owner', 'admin') export class AuditLogsController { constructor( private readonly auditLogs: AuditLogsService, private readonly attendance: AttendanceService, ) {} @Get('attendance') attendanceList( @CurrentUser() user: { organizationId: string }, @Query() query: ListAuditQueryDto, ) { return this.attendance.list(user.organizationId, { q: query.q, userId: query.actorUserId, page: query.page, limit: query.limit, }); } @Get() list( @CurrentUser() user: { organizationId: string }, @Query() query: ListAuditQueryDto, ) { return this.auditLogs.list(user.organizationId, { q: query.q, actorUserId: query.actorUserId, entityType: query.entityType, action: query.action, page: query.page, limit: query.limit, }); } }