webadmin增加oss日志
This commit is contained in:
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user