From 1f67a2e22d29a89215ede7d8336fb674902bb385 Mon Sep 17 00:00:00 2001 From: raohaotian <1227431568@qq.com> Date: Sat, 12 Apr 2025 07:02:46 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9B=E5=BB=BA=E5=88=86=E4=BA=AB=E7=A0=81?= =?UTF-8?q?=E5=92=8C=E5=AE=9A=E6=9C=9F=E5=88=A0=E9=99=A4=E7=9A=84=E9=80=BB?= =?UTF-8?q?=E8=BE=91=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../models/share-code/share-code.service.ts | 51 +++++++++++++------ 1 file changed, 35 insertions(+), 16 deletions(-) diff --git a/apps/server/src/models/share-code/share-code.service.ts b/apps/server/src/models/share-code/share-code.service.ts index 660f184..3a5f2ca 100755 --- a/apps/server/src/models/share-code/share-code.service.ts +++ b/apps/server/src/models/share-code/share-code.service.ts @@ -106,24 +106,42 @@ export class ShareCodeService extends BaseService { throw new NotFoundException('文件不存在'); } const { filename, filetype, size } = resource.meta as any as ResourceMeta - // 生成分享码 - const code = this.generateCode(); - // 查找是否已有分享码记录 - const existingShareCode = await super.findUnique({ - where: { fileId }, - }); + // 生成分享码(修改的逻辑保证分享码的唯一性) + let code = this.generateCode(); + let existingShareCode; + do { + // 查找是否已有相同 shareCode 或者相同 FileID 的分享码记录 + existingShareCode = await super.findUnique({ + where: { + OR: [ + { code }, + { fileId } + ] + }, + }); + // 如果找到的是已经被删除的码,则可以使用并更新其他信息,否则重新生成 + if (existingShareCode.deleteAt !== null) { + break + } + if (existingShareCode && existingShareCode.code === code) { + code = this.generateCode(); + } + } while (existingShareCode && existingShareCode.code === code); if (existingShareCode) { // 更新现有记录,但保留原有文件名 await super.update({ - where: { fileId }, + where: { id: existingShareCode.id }, data: { code, expiresAt, canUseTimes, isUsed: false, + fileId, fileName: filename || "downloaded_file", uploadIp, + createdAt: new Date(), + deleteAt: null }, }); } else { @@ -218,24 +236,25 @@ export class ShareCodeService extends BaseService { } }) this.logger.log('需要清理的分享码:', shareCodes); + //文件资源硬删除 shareCodes.forEach(code => { this.cleanupUploadFolder(code.fileId); }) - const result = await super.deleteMany({ + //数据库资源软删除 + const result = await super.softDeleteByIds( + [...shareCodes.map(code => code.id)] + ); + const deleteResource = await this.resourceService.updateMany({ where: { fileId: { in: shareCodes.map(code => code.fileId) } }, - }); - const deleteResource = await this.resourceService.deleteMany({ - where: { - fileId: { - in: shareCodes.map(code => code.fileId) - } + data:{ + deletedAt: new Date() } }) - this.logger.log(`Cleaned up ${result.count} ${deleteResource.count} expired share codes`); + this.logger.log(`Cleaned up ${result} ${deleteResource.count} expired share codes`); } catch (error) { this.logger.error('Failed to cleanup expired share codes', error); } @@ -576,7 +595,7 @@ export class ShareCodeService extends BaseService { throw error; } } - + /** * 获取分享码列表,使用ShareCodeSelect并按创建时间倒序排序 * @param args 查询参数