webadmin增加oss日志

This commit is contained in:
2026-07-12 15:44:17 +08:00
parent 758760eb36
commit 9fc955d81f
12 changed files with 575 additions and 19 deletions
@@ -5,11 +5,16 @@ import { PrismaService } from '../../common/prisma/prisma.module';
import { serializeBigInt } from '../../common/decorators/current-user.decorator';
import { OSS_PROVIDER } from '../../integrations/integrations.constants';
import type { IOssProvider } from '../../integrations/oss/oss.interface';
import { logOssUpload, type OssActorRef } from '../../integrations/oss/oss-log.util';
import type { ResourceListQueryDto } from './dto/common-query.dto';
import type { RegisterResourceDto, UpdateResourceDto, UploadFileDto, UploadTokenDto } from './dto/common-mutate.dto';
const DEFAULT_MAX_BYTES = 10 * 1024 * 1024;
export type OssUploadActor = OssActorRef & {
clientApp?: string;
};
@Injectable()
export class ResourceService {
constructor(
@@ -17,25 +22,120 @@ export class ResourceService {
@Inject(OSS_PROVIDER) private readonly oss: IOssProvider,
) {}
getUploadToken(dto: UploadTokenDto) {
return this.oss.getUploadToken(dto);
getUploadToken(dto: UploadTokenDto, actor?: OssUploadActor) {
try {
const result = this.oss.getUploadToken(dto);
void logOssUpload(this.prisma, {
scene: 'UPLOAD_TOKEN',
actorRef: actor,
requestBody: {
bizType: dto.bizType,
mediaType: dto.mediaType,
fileName: dto.fileName,
clientApp: actor?.clientApp,
},
responseBody: {
bucket: result.bucket,
ossKey: result.ossKey,
url: result.url,
mock: result.mock ?? false,
},
externalNo: result.ossKey,
status: 'SUCCESS',
});
return result;
} catch (err) {
void logOssUpload(this.prisma, {
scene: 'UPLOAD_TOKEN',
actorRef: actor,
requestBody: {
bizType: dto.bizType,
mediaType: dto.mediaType,
fileName: dto.fileName,
clientApp: actor?.clientApp,
},
status: 'FAILED',
errorMessage: err instanceof Error ? err.message : String(err),
});
throw err;
}
}
async uploadFile(file: Express.Multer.File | undefined, dto: UploadFileDto) {
if (!file) {
throw new BadRequestException('请选择要上传的文件');
}
const maxUploadBytes = Number(process.env.OSS_MAX_UPLOAD_BYTES ?? DEFAULT_MAX_BYTES);
if (file.size > maxUploadBytes) {
throw new BadRequestException(`文件不能超过 ${Math.floor(maxUploadBytes / 1024 / 1024)}MB`);
}
return this.oss.putObject({
async uploadFile(
file: Express.Multer.File | undefined,
dto: UploadFileDto,
actor?: OssUploadActor,
) {
const baseRequest = {
bizType: dto.bizType,
mediaType: dto.mediaType,
clientApp: actor?.clientApp,
};
if (!file) {
await logOssUpload(this.prisma, {
scene: 'UPLOAD_PUT_OBJECT',
actorRef: actor,
requestBody: baseRequest,
status: 'FAILED',
errorMessage: '请选择要上传的文件',
});
throw new BadRequestException('请选择要上传的文件');
}
const maxUploadBytes = Number(process.env.OSS_MAX_UPLOAD_BYTES ?? DEFAULT_MAX_BYTES);
const requestBody = {
...baseRequest,
fileName: file.originalname || 'upload.bin',
buffer: file.buffer,
fileSize: file.size,
mimeType: file.mimetype,
});
};
if (file.size > maxUploadBytes) {
const message = `文件不能超过 ${Math.floor(maxUploadBytes / 1024 / 1024)}MB`;
await logOssUpload(this.prisma, {
scene: 'UPLOAD_PUT_OBJECT',
actorRef: actor,
requestBody,
status: 'FAILED',
errorMessage: message,
});
throw new BadRequestException(message);
}
try {
const result = await this.oss.putObject({
bizType: dto.bizType,
mediaType: dto.mediaType,
fileName: file.originalname || 'upload.bin',
buffer: file.buffer,
mimeType: file.mimetype,
});
await logOssUpload(this.prisma, {
scene: 'UPLOAD_PUT_OBJECT',
actorRef: actor,
requestBody,
responseBody: {
bucket: result.bucket,
region: result.region,
ossKey: result.ossKey,
url: result.url,
mock: result.mock ?? false,
},
externalNo: result.ossKey,
status: 'SUCCESS',
});
return result;
} catch (err) {
await logOssUpload(this.prisma, {
scene: 'UPLOAD_PUT_OBJECT',
actorRef: actor,
requestBody,
status: 'FAILED',
errorMessage: err instanceof Error ? err.message : String(err),
});
throw err;
}
}
async register(dto: RegisterResourceDto) {