- 全模块类型化:controller 的 req: any → AuthenticatedRequest/RequestUser, 聚合查询 getRawMany 泛型标注、导入行/响应体定义具体 interface、 catch (e: any) → unknown + 收窄、no-base-to-string 用 String() 显式转换 - 第三方无类型库边界(pdfkit/exceljs)文件级或单行 disable 并注明理由 - 顺带修复:get-business-context.tool 两个 require-await error、 bills.controller 参数顺序隐患、main.ts compression 调用 - 运行时逻辑零改动;测试 142 套件 / 1065 用例全部通过
47 lines
1.4 KiB
TypeScript
47 lines
1.4 KiB
TypeScript
import { Controller, Get, Post, Body, Query, UseGuards, Request } from '@nestjs/common';
|
|
import { OperationLogsService } from './operation-logs.service';
|
|
import { JwtAuthGuard } from '../auth/guards/jwt-auth.guard';
|
|
import { RequirePermission } from '../auth/decorators/permission.decorator';
|
|
import { extractRequestInfo } from '../common/request-utils';
|
|
import { CreateAuditLogDto, QueryOperationLogsDto } from './dto/operation-log.dto';
|
|
import type { AuthenticatedUser } from '../authorization';
|
|
|
|
interface AuthenticatedRequest {
|
|
user: AuthenticatedUser;
|
|
headers?: Record<string, string | string[] | undefined>;
|
|
connection?: { remoteAddress?: string };
|
|
}
|
|
|
|
@UseGuards(JwtAuthGuard)
|
|
@Controller('operation-logs')
|
|
export class OperationLogsController {
|
|
constructor(private service: OperationLogsService) {}
|
|
|
|
@Get()
|
|
@RequirePermission('log:view')
|
|
findAll(@Query() query: QueryOperationLogsDto) {
|
|
return this.service.findAll(query);
|
|
}
|
|
|
|
|
|
@Post('audit')
|
|
@RequirePermission('log:create')
|
|
async createAuditLog(
|
|
@Body() body: CreateAuditLogDto,
|
|
@Request() req: AuthenticatedRequest,
|
|
) {
|
|
const { ipAddress, userAgent } = extractRequestInfo(req);
|
|
return this.service.log({
|
|
userId: req.user?.id,
|
|
username: req.user?.username,
|
|
module: body.module,
|
|
action: body.action,
|
|
targetId: body.targetId,
|
|
targetType: body.targetType,
|
|
detail: body.detail,
|
|
ipAddress,
|
|
userAgent,
|
|
});
|
|
}
|
|
}
|