From 9b72fc3ffe981e24ae1079a5e859dd30490ebb78 Mon Sep 17 00:00:00 2001 From: moonrailgun Date: Wed, 4 Oct 2023 20:50:47 +0800 Subject: [PATCH] feat: use file save upsert logic rather than insert for avoid duplicate recording of the same file --- server/models/file.ts | 2 ++ server/services/core/file.service.ts | 25 ++++++++++++++++--------- 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/server/models/file.ts b/server/models/file.ts index 5e6e10d8..385d1bdc 100644 --- a/server/models/file.ts +++ b/server/models/file.ts @@ -5,6 +5,7 @@ import { Ref, modelOptions, Severity, + index, } from '@typegoose/typegoose'; import { Base, TimeStamps } from '@typegoose/typegoose/lib/defaultClasses'; import type { Types } from 'mongoose'; @@ -18,6 +19,7 @@ import { User } from './user/user'; allowMixed: Severity.ALLOW, }, }) +@index({ bucketName: 1, objectName: 1 }) export class File extends TimeStamps implements Base { _id: Types.ObjectId; id: string; diff --git a/server/services/core/file.service.ts b/server/services/core/file.service.ts index ce637c0e..241bf149 100644 --- a/server/services/core/file.service.ts +++ b/server/services/core/file.service.ts @@ -288,15 +288,22 @@ class FileService extends TcService { this.minioClient .statObject(this.bucketName, objectName) .then((stat) => - this.adapter.insert({ - etag, - userId: new Types.ObjectId(userId), - bucketName: this.bucketName, - objectName, - url, - size: stat.size, - metaData: stat.metaData, - }) + this.adapter.model.updateOne( + { + bucketName: this.bucketName, + objectName, + }, + { + etag, + userId: new Types.ObjectId(userId), + url, + size: stat.size, + metaData: stat.metaData, + }, + { + upsert: true, + } + ) ) .catch((err) => { this.logger.error(`持久化到数据库失败: ${objectName}`, err);