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 查询参数