From 62359395d4dd97631cc254bc9093e7ed2a78c44a Mon Sep 17 00:00:00 2001 From: tamarafinogina Date: Thu, 22 Jan 2026 18:56:23 +0100 Subject: [PATCH 1/5] set name = plainName --- src/modules/file/file.usecase.spec.ts | 37 +++++-------------- src/modules/file/file.usecase.ts | 20 +++-------- src/modules/folder/folder.usecase.spec.ts | 35 ++++-------------- src/modules/folder/folder.usecase.ts | 43 +++++------------------ src/modules/user/user.usecase.spec.ts | 5 +-- src/modules/user/user.usecase.ts | 3 +- 6 files changed, 31 insertions(+), 112 deletions(-) diff --git a/src/modules/file/file.usecase.spec.ts b/src/modules/file/file.usecase.spec.ts index 330c66621..c50b66404 100644 --- a/src/modules/file/file.usecase.spec.ts +++ b/src/modules/file/file.usecase.spec.ts @@ -442,7 +442,7 @@ describe('FileUseCases', () => { const expectedFile = newFile({ attributes: { ...file, - name: 'newencrypted-' + file.name, + name: file.plainName, folderId: destinationFolder.id, folderUuid: destinationFolder.uuid, status: FileStatus.EXISTS, @@ -454,10 +454,6 @@ describe('FileUseCases', () => { .spyOn(folderUseCases, 'getFolderByUuid') .mockResolvedValueOnce(destinationFolder); - jest - .spyOn(cryptoService, 'encryptName') - .mockReturnValueOnce(expectedFile.name); - jest .spyOn(fileRepository, 'findByPlainNameAndFolderId') .mockResolvedValueOnce(null); @@ -478,7 +474,7 @@ describe('FileUseCases', () => { { folderId: destinationFolder.id, folderUuid: destinationFolder.uuid, - name: expectedFile.name, + name: expectedFile.plainName, status: FileStatus.EXISTS, plainName: expectedFile.plainName, type: expectedFile.type, @@ -541,7 +537,6 @@ describe('FileUseCases', () => { jest .spyOn(folderUseCases, 'getFolderByUuid') .mockResolvedValueOnce(destinationFolder); - jest.spyOn(cryptoService, 'encryptName').mockReturnValueOnce(file.name); jest .spyOn(fileRepository, 'findByPlainNameAndFolderId') .mockResolvedValueOnce(file); @@ -564,7 +559,6 @@ describe('FileUseCases', () => { jest .spyOn(folderUseCases, 'getFolderByUuid') .mockResolvedValueOnce(destinationFolder); - jest.spyOn(cryptoService, 'encryptName').mockReturnValueOnce(file.name); jest .spyOn(fileRepository, 'findByPlainNameAndFolderId') .mockResolvedValueOnce(conflictFile); @@ -602,6 +596,7 @@ describe('FileUseCases', () => { folderUuid: destinationFolder.uuid, status: FileStatus.EXISTS, plainName: newAttributes.name, + name: newAttributes.name, type: newAttributes.type, }, }); @@ -613,10 +608,6 @@ describe('FileUseCases', () => { .spyOn(folderUseCases, 'getFolderByUuid') .mockResolvedValueOnce(destinationFolder); - jest - .spyOn(cryptoService, 'encryptName') - .mockReturnValueOnce(fileToBeMovedAndRenamed.name); - jest .spyOn(fileRepository, 'findByPlainNameAndFolderId') .mockResolvedValueOnce(null); @@ -642,7 +633,7 @@ describe('FileUseCases', () => { { folderId: destinationFolder.id, folderUuid: destinationFolder.uuid, - name: expectedFile.name, + name: expectedFile.plainName, status: FileStatus.EXISTS, plainName: expectedFile.plainName, type: expectedFile.type, @@ -674,6 +665,7 @@ describe('FileUseCases', () => { folderUuid: destinationFolder.uuid, status: FileStatus.EXISTS, plainName: newAttributes.name, + name: newAttributes.name, type: newAttributes.type, }, }); @@ -685,10 +677,6 @@ describe('FileUseCases', () => { .spyOn(folderUseCases, 'getFolderByUuid') .mockResolvedValueOnce(destinationFolder); - jest - .spyOn(cryptoService, 'encryptName') - .mockReturnValueOnce(fileToBeRenamed.name); - jest .spyOn(fileRepository, 'findByPlainNameAndFolderId') .mockResolvedValueOnce(null); @@ -710,7 +698,7 @@ describe('FileUseCases', () => { { folderId: expectedFile.folderId, folderUuid: expectedFile.folderUuid, - name: expectedFile.name, + name: expectedFile.plainName, status: FileStatus.EXISTS, plainName: expectedFile.plainName, type: expectedFile.type, @@ -742,10 +730,6 @@ describe('FileUseCases', () => { .spyOn(folderUseCases, 'getFolderByUuid') .mockResolvedValueOnce(destinationFolder); - jest - .spyOn(cryptoService, 'encryptName') - .mockReturnValueOnce(fileToBeRenamed.name); - jest .spyOn(fileRepository, 'findByPlainNameAndFolderId') .mockResolvedValueOnce(null); @@ -1343,12 +1327,11 @@ describe('FileUseCases', () => { const newFileMeta: UpdateFileMetaDto = { plainName: 'new-name' }; const mockFile = newFile({ owner: userMocked }); - const encryptedName = 'encrypted-name'; const updatedFile = newFile({ attributes: { ...mockFile, plainName: newFileMeta.plainName, - name: encryptedName, + name: newFileMeta.plainName, }, }); @@ -1356,7 +1339,6 @@ describe('FileUseCases', () => { jest .spyOn(fileRepository, 'findByPlainNameAndFolderId') .mockResolvedValueOnce(null); - jest.spyOn(cryptoService, 'encryptName').mockReturnValue(encryptedName); const result = await service.updateFileMetaData( userMocked, @@ -1381,7 +1363,7 @@ describe('FileUseCases', () => { userMocked.id, expect.objectContaining({ plainName: newFileMeta.plainName, - name: encryptedName, + name: newFileMeta.plainName, }), ); const { @@ -1417,7 +1399,6 @@ describe('FileUseCases', () => { jest .spyOn(fileRepository, 'findByPlainNameAndFolderId') .mockResolvedValueOnce(null); - jest.spyOn(cryptoService, 'encryptName').mockReturnValue(mockFile.name); const result = await service.updateFileMetaData( userMocked, @@ -1840,7 +1821,7 @@ describe('FileUseCases', () => { const mockFile = newFile({ attributes: { fileId: testFileId, - name: 'encrypted-name', + name: 'name', type: 'jpg', size: BigInt(1000), bucket: testBucketId, diff --git a/src/modules/file/file.usecase.ts b/src/modules/file/file.usecase.ts index 945fa390d..37bf3c7d6 100644 --- a/src/modules/file/file.usecase.ts +++ b/src/modules/file/file.usecase.ts @@ -50,7 +50,7 @@ import { } from '../feature-limit/limits.enum'; import { FeatureLimitUsecases } from '../feature-limit/feature-limit.usecase'; import { SequelizeFileVersionRepository } from './file-version.repository'; -import { FileVersion, FileVersionStatus } from './file-version.domain'; +import { FileVersionStatus } from './file-version.domain'; import { FileVersionDto } from './dto/responses/file-version.dto'; import { UserUseCases } from '../user/user.usecase'; import { RedisService } from '../../externals/redis/redis.service'; @@ -368,10 +368,7 @@ export class FileUseCases { throw new ForbiddenException('Folder is not yours'); } - const cryptoFileName = this.cryptoService.encryptName( - newFileDto.plainName, - folder.id, - ); + const cryptoFileName = newFileDto.plainName; const exists = await this.fileRepository.findByPlainNameAndFolderId( user.id, @@ -496,9 +493,7 @@ export class FileUseCases { newFileMetadata.plainName ?? file.plainName ?? this.cryptoService.decryptName(file.name, file.folderId); - const cryptoFileName = newFileMetadata.plainName - ? this.cryptoService.encryptName(newFileMetadata.plainName, file.folderId) - : file.name; + const cryptoFileName = newFileMetadata.plainName || file.name; const type = newFileMetadata.type ?? file.type; const updatedFile = File.build({ @@ -885,7 +880,7 @@ export class FileUseCases { if (shouldVersion) { await this.applyRetentionPolicy(fileUuid, user.uuid); - const { fileId, size, modificationTime } = newFileData; + const { size, modificationTime } = newFileData; await Promise.all([ this.fileVersionRepository.upsert({ @@ -1018,15 +1013,10 @@ export class FileUseCases { ); } - const destinationEncryptedName = this.cryptoService.encryptName( - file.plainName, - destinationFolder.id, - ); - const updateData: Partial = { folderId: destinationFolder.id, folderUuid: destinationFolder.uuid, - name: destinationEncryptedName, + name: file.plainName, status: FileStatus.EXISTS, plainName: file.plainName, type: file.type, diff --git a/src/modules/folder/folder.usecase.spec.ts b/src/modules/folder/folder.usecase.spec.ts index aa8b40715..2c52b441b 100644 --- a/src/modules/folder/folder.usecase.spec.ts +++ b/src/modules/folder/folder.usecase.spec.ts @@ -445,11 +445,7 @@ describe('FolderUseCases', () => { describe('decryptFolderName()', () => { it('When the name is encrypted, then the decrypting works', () => { const folder = newFolder(); - const encriptedName = cryptoService.encryptName( - folder.plainName, - folder.parentId, - ); - folder.name = encriptedName; + folder.name = folder.plainName; const result = service.decryptFolderName(folder); @@ -531,7 +527,7 @@ describe('FolderUseCases', () => { const expectedFolder = newFolder({ attributes: { ...folder, - name: 'newencrypted-' + folder.name, + name: folder.name, parentUuid: destinationFolder.uuid, parentId: destinationFolder.parentId, }, @@ -552,10 +548,6 @@ describe('FolderUseCases', () => { .spyOn(cryptoService, 'decryptName') .mockReturnValueOnce(folder.plainName); - jest - .spyOn(cryptoService, 'encryptName') - .mockReturnValueOnce(expectedFolder.name); - jest .spyOn(folderRepository, 'findByNameAndParentUuid') .mockResolvedValueOnce(null); @@ -575,7 +567,7 @@ describe('FolderUseCases', () => { { parentId: destinationFolder.id, parentUuid: destinationFolder.uuid, - name: expectedFolder.name, + name: expectedFolder.plainName, plainName: expectedFolder.plainName, deleted: false, deletedAt: null, @@ -705,7 +697,6 @@ describe('FolderUseCases', () => { jest .spyOn(cryptoService, 'decryptName') .mockReturnValueOnce(folder.plainName); - jest.spyOn(cryptoService, 'encryptName').mockReturnValueOnce(folder.name); jest .spyOn(folderRepository, 'findByNameAndParentUuid') .mockResolvedValueOnce(folder); @@ -741,7 +732,6 @@ describe('FolderUseCases', () => { jest .spyOn(cryptoService, 'decryptName') .mockReturnValueOnce(folder.plainName); - jest.spyOn(cryptoService, 'encryptName').mockReturnValueOnce(folder.name); jest .spyOn(folderRepository, 'findByNameAndParentUuid') .mockResolvedValueOnce(conflictFolder); @@ -760,7 +750,7 @@ describe('FolderUseCases', () => { const expectedFolder = newFolder({ attributes: { ...folder, - name: 'newencrypted-' + newName, + name: newName, plainName: newName, parentUuid: destinationFolder.uuid, parentId: destinationFolder.id, @@ -778,10 +768,6 @@ describe('FolderUseCases', () => { .spyOn(service, 'getFolderByUuid') .mockResolvedValueOnce(destinationFolder); - jest - .spyOn(cryptoService, 'encryptName') - .mockReturnValueOnce(expectedFolder.name); - jest .spyOn(folderRepository, 'findByNameAndParentUuid') .mockResolvedValueOnce(null); @@ -852,9 +838,6 @@ describe('FolderUseCases', () => { }, }); - jest - .spyOn(cryptoService, 'encryptName') - .mockReturnValueOnce(encryptedFolderName); jest .spyOn(folderRepository, 'findByNameAndParentUuid') .mockResolvedValue(null); @@ -947,10 +930,6 @@ describe('FolderUseCases', () => { .mockResolvedValueOnce(parentFolder); jest.spyOn(folderRepository, 'findOne').mockResolvedValueOnce(null); - jest - .spyOn(cryptoService, 'encryptName') - .mockReturnValueOnce(encryptedFolderName); - jest .spyOn(folderRepository, 'createWithAttributes') .mockResolvedValueOnce(newFolderCreated); @@ -1171,11 +1150,10 @@ describe('FolderUseCases', () => { }); it('When the folder metadata is updated successfully, then it should update and return the updated folder', async () => { - const encryptedName = 'encrypted-new-folder-name'; const mockFolder = newFolder({ owner: userMocked }); const updatedFolder = newFolder({ attributes: { - name: encryptedName, + name: newFolderMetadata.plainName, plainName: newFolderMetadata.plainName, modificationTime: new Date(), }, @@ -1184,7 +1162,6 @@ describe('FolderUseCases', () => { jest.spyOn(folderRepository, 'findOne').mockResolvedValueOnce(mockFolder); jest.spyOn(mockFolder, 'isOwnedBy').mockReturnValueOnce(true); jest.spyOn(folderRepository, 'findOne').mockResolvedValueOnce(null); - jest.spyOn(cryptoService, 'encryptName').mockReturnValue(encryptedName); jest .spyOn(folderRepository, 'updateByFolderId') .mockResolvedValue(updatedFolder); @@ -1199,7 +1176,7 @@ describe('FolderUseCases', () => { mockFolder.id, expect.objectContaining({ plainName: newFolderMetadata.plainName, - name: encryptedName, + name: newFolderMetadata.plainName, }), ); diff --git a/src/modules/folder/folder.usecase.ts b/src/modules/folder/folder.usecase.ts index 7156f2240..5568fea10 100644 --- a/src/modules/folder/folder.usecase.ts +++ b/src/modules/folder/folder.usecase.ts @@ -275,11 +275,9 @@ export class FolderUseCases { throw new Error('Invalid folder name'); } - const encryptedFolderName = this.cryptoService.encryptName(name, null); - const folder = await this.folderRepository.create( user.id, - encryptedFolderName, + name, bucketId, null, '03-aes', @@ -319,10 +317,7 @@ export class FolderUseCases { return { userId: user.id, plainName: folder.name, - name: this.cryptoService.encryptName( - folder.name, - folder.parentFolderId, - ), + name: folder.name, encryptVersion: '03-aes', bucket: null, parentId: folder.parentFolderId, @@ -362,13 +357,8 @@ export class FolderUseCases { throw new ForbiddenException('This folder is not yours'); } - const cryptoFileName = this.cryptoService.encryptName( - newFolderMetadata.plainName, - folder.parentId, - ); - const folderWithSameNameExists = await this.folderRepository.findOne({ - name: cryptoFileName, + name: newFolderMetadata.plainName, parentId: folder.parentId, deleted: false, removed: false, @@ -384,7 +374,7 @@ export class FolderUseCases { folder.id, { plainName: newFolderMetadata.plainName, - name: cryptoFileName, + name: newFolderMetadata.plainName, modificationTime: new Date(), }, ); @@ -436,15 +426,10 @@ export class FolderUseCases { ); } - const encryptedFolderName = this.cryptoService.encryptName( - newFolderDto.plainName, - parentFolder.id, - ); - const folder = await this.folderRepository.createWithAttributes({ uuid: v4(), userId: user.id, - name: encryptedFolderName, + name: newFolderDto.plainName, plainName: newFolderDto.plainName, parentId: parentFolder.id, parentUuid: parentFolder.uuid, @@ -884,13 +869,8 @@ export class FolderUseCases { const plainName = newName ?? this.cryptoService.decryptName(folder.name, folder.parentId); - const nameEncryptedWithDestination = this.cryptoService.encryptName( - plainName, - destinationFolder.id, - ); - const exists = await this.folderRepository.findByNameAndParentUuid( - nameEncryptedWithDestination, + plainName, plainName, destinationFolder.uuid, false, @@ -910,7 +890,7 @@ export class FolderUseCases { const updateData: Partial = { parentId: destinationFolder.id, parentUuid: destinationFolder.uuid, - name: nameEncryptedWithDestination, + name: plainName, plainName, deleted: false, deletedAt: null, @@ -938,13 +918,8 @@ export class FolderUseCases { throw new BadRequestException('Invalid folder name'); } - const newEncryptedName = this.cryptoService.encryptName( - newName, - folder.parentId, - ); - const exists = await this.folderRepository.findByNameAndParentUuid( - newEncryptedName, + newName, newName, folder.parentUuid, false, @@ -957,7 +932,7 @@ export class FolderUseCases { } return await this.folderRepository.updateByFolderId(folder.id, { - name: newEncryptedName, + name: newName, plainName: newName, }); } diff --git a/src/modules/user/user.usecase.spec.ts b/src/modules/user/user.usecase.spec.ts index 40ce1cbd3..108daaf25 100644 --- a/src/modules/user/user.usecase.spec.ts +++ b/src/modules/user/user.usecase.spec.ts @@ -3586,9 +3586,6 @@ describe('User use cases', () => { const familyFolder = newFolder({ attributes: { name: 'Family' } }); const personalFolder = newFolder({ attributes: { name: 'Personal' } }); - jest - .spyOn(cryptoService, 'encryptName') - .mockReturnValue('encrypted-name'); jest .spyOn(folderUseCases, 'createRootFolder') .mockResolvedValue(rootFolder); @@ -3601,7 +3598,7 @@ describe('User use cases', () => { expect(folderUseCases.createRootFolder).toHaveBeenCalledWith( user, - 'encrypted-name', + expect.any(String), bucketId, ); expect(userRepository.updateById).toHaveBeenCalledWith(user.id, { diff --git a/src/modules/user/user.usecase.ts b/src/modules/user/user.usecase.ts index 7a84db634..c4ce0c9b8 100644 --- a/src/modules/user/user.usecase.ts +++ b/src/modules/user/user.usecase.ts @@ -12,7 +12,6 @@ import { forwardRef, } from '@nestjs/common'; import { ConfigService } from '@nestjs/config'; -import { Environment } from '@internxt/inxt-js'; import { v4, validate } from 'uuid'; import { generateMnemonic } from 'bip39'; import * as speakeasy from 'speakeasy'; @@ -362,7 +361,7 @@ export class UserUseCases { user: User, bucketId: string, ): Promise<[Folder, Folder, Folder]> { - const rootFolderName = this.cryptoService.encryptName(`${v4()}`); + const rootFolderName = v4(); const rootFolder = await this.folderUseCases.createRootFolder( user, From 431008e6b0d26fb40711b450d930796b29ca6f0a Mon Sep 17 00:00:00 2001 From: tamarafinogina Date: Fri, 23 Jan 2026 11:40:06 +0100 Subject: [PATCH 2/5] only attempt folder decryption if no plainName --- src/modules/folder/folder.usecase.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/modules/folder/folder.usecase.ts b/src/modules/folder/folder.usecase.ts index 5568fea10..4b2a39666 100644 --- a/src/modules/folder/folder.usecase.ts +++ b/src/modules/folder/folder.usecase.ts @@ -202,7 +202,8 @@ export class FolderUseCases { ): Promise { const folder = await this.folderRepository.findById(folderId, deleted); - return folder ? this.decryptFolderName(folder) : null; + if (!folder.plainName) return this.decryptFolderName(folder); + else return folder; } async isFolderInsideFolder( From 7f724caec58c8496ed745adcd94a75d11a9cd6db Mon Sep 17 00:00:00 2001 From: tamarafinogina Date: Fri, 23 Jan 2026 12:52:25 +0100 Subject: [PATCH 3/5] always create folder with plainName attribute --- src/modules/folder/folder.repository.spec.ts | 6 +++++- src/modules/folder/folder.repository.ts | 3 +++ src/modules/folder/folder.usecase.ts | 2 ++ src/modules/user/user.usecase.spec.ts | 1 + src/modules/user/user.usecase.ts | 1 + src/modules/workspaces/workspaces.usecase.spec.ts | 1 + src/modules/workspaces/workspaces.usecase.ts | 4 +++- 7 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/modules/folder/folder.repository.spec.ts b/src/modules/folder/folder.repository.spec.ts index 664440c06..a936bfdd3 100644 --- a/src/modules/folder/folder.repository.spec.ts +++ b/src/modules/folder/folder.repository.spec.ts @@ -765,7 +765,7 @@ describe('SequelizeFolderRepository', () => { describe('create', () => { it('When creating a folder with basic parameters, then it should return the created folder', async () => { const userId = 1; - const name = 'encrypted-name'; + const name = 'folder-name'; const bucket = 'bucket-id'; const parentId = 2; const encryptVersion = '03-aes' as const; @@ -788,6 +788,7 @@ describe('SequelizeFolderRepository', () => { const result = await repository.create( userId, name, + name, bucket, parentId, encryptVersion, @@ -797,6 +798,7 @@ describe('SequelizeFolderRepository', () => { expect(folderModel.create).toHaveBeenCalledWith({ userId, name, + plainName: name, bucket, parentId, encryptVersion, @@ -834,6 +836,7 @@ describe('SequelizeFolderRepository', () => { { userId: 1, name: 'folder1', + plainName: 'folderPlainName1', bucket: 'bucket1', parentId: 1, encryptVersion: '03-aes' as const, @@ -842,6 +845,7 @@ describe('SequelizeFolderRepository', () => { { userId: 1, name: 'folder2', + plainName: 'folderPlainName2', bucket: 'bucket2', parentId: 1, encryptVersion: '03-aes' as const, diff --git a/src/modules/folder/folder.repository.ts b/src/modules/folder/folder.repository.ts index 6faf158c3..529cbe146 100644 --- a/src/modules/folder/folder.repository.ts +++ b/src/modules/folder/folder.repository.ts @@ -559,6 +559,7 @@ export class SequelizeFolderRepository implements FolderRepository { async create( userId: UserAttributes['id'], name: FolderAttributes['name'], + plainName: FolderAttributes['plainName'], bucket: FolderAttributes['bucket'], parentId: FolderAttributes['parentId'], encryptVersion: FolderAttributes['encryptVersion'], @@ -567,6 +568,7 @@ export class SequelizeFolderRepository implements FolderRepository { const folder = await this.folderModel.create({ userId, name, + plainName, bucket, parentId, encryptVersion, @@ -592,6 +594,7 @@ export class SequelizeFolderRepository implements FolderRepository { folders: { userId: UserAttributes['id']; name: FolderAttributes['name']; + plainName: FolderAttributes['plainName']; bucket: FolderAttributes['bucket']; parentId: FolderAttributes['parentId']; encryptVersion: FolderAttributes['encryptVersion']; diff --git a/src/modules/folder/folder.usecase.ts b/src/modules/folder/folder.usecase.ts index 4b2a39666..25a12896a 100644 --- a/src/modules/folder/folder.usecase.ts +++ b/src/modules/folder/folder.usecase.ts @@ -258,6 +258,7 @@ export class FolderUseCases { async createRootFolder( creator: User, name: FolderAttributes['name'], + plainName: FolderAttributes['plainName'], bucketId: string, ): Promise { const isAGuestOnSharedWorkspace = creator.email !== creator.bridgeUser; @@ -279,6 +280,7 @@ export class FolderUseCases { const folder = await this.folderRepository.create( user.id, name, + plainName, bucketId, null, '03-aes', diff --git a/src/modules/user/user.usecase.spec.ts b/src/modules/user/user.usecase.spec.ts index 108daaf25..36e7a44d8 100644 --- a/src/modules/user/user.usecase.spec.ts +++ b/src/modules/user/user.usecase.spec.ts @@ -3599,6 +3599,7 @@ describe('User use cases', () => { expect(folderUseCases.createRootFolder).toHaveBeenCalledWith( user, expect.any(String), + expect.any(String), bucketId, ); expect(userRepository.updateById).toHaveBeenCalledWith(user.id, { diff --git a/src/modules/user/user.usecase.ts b/src/modules/user/user.usecase.ts index c4ce0c9b8..880577fe7 100644 --- a/src/modules/user/user.usecase.ts +++ b/src/modules/user/user.usecase.ts @@ -366,6 +366,7 @@ export class UserUseCases { const rootFolder = await this.folderUseCases.createRootFolder( user, rootFolderName, + rootFolderName, bucketId, ); diff --git a/src/modules/workspaces/workspaces.usecase.spec.ts b/src/modules/workspaces/workspaces.usecase.spec.ts index 1a36471db..2f700f322 100644 --- a/src/modules/workspaces/workspaces.usecase.spec.ts +++ b/src/modules/workspaces/workspaces.usecase.spec.ts @@ -3923,6 +3923,7 @@ describe('WorkspacesUsecases', () => { expect(folderUseCases.createRootFolder).toHaveBeenCalledWith( workspaceUser, expect.any(String), + expect.any(String), bucket.id, ); expect(workspaceRepository.create).toHaveBeenCalledWith( diff --git a/src/modules/workspaces/workspaces.usecase.ts b/src/modules/workspaces/workspaces.usecase.ts index df902baed..cba425378 100644 --- a/src/modules/workspaces/workspaces.usecase.ts +++ b/src/modules/workspaces/workspaces.usecase.ts @@ -174,9 +174,11 @@ export class WorkspacesUsecases { workspaceEmail, networkUserId, ); + const name = v4(); const rootFolder = await this.folderUseCases.createRootFolder( workspaceUser, - v4(), + name, + name, bucket.id, ); newWorkspace.rootFolderId = rootFolder.uuid; From ccdbc4b63b5a6a837a35b08340de73d8bc727646 Mon Sep 17 00:00:00 2001 From: tamarafinogina Date: Fri, 23 Jan 2026 12:57:21 +0100 Subject: [PATCH 4/5] fix sonar issue --- src/modules/folder/folder.usecase.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/modules/folder/folder.usecase.ts b/src/modules/folder/folder.usecase.ts index 25a12896a..536d60d10 100644 --- a/src/modules/folder/folder.usecase.ts +++ b/src/modules/folder/folder.usecase.ts @@ -202,8 +202,8 @@ export class FolderUseCases { ): Promise { const folder = await this.folderRepository.findById(folderId, deleted); - if (!folder.plainName) return this.decryptFolderName(folder); - else return folder; + if (folder.plainName) return folder; + else return this.decryptFolderName(folder); } async isFolderInsideFolder( From f71343556a83761ff8350e30bc77ccee97d36cee Mon Sep 17 00:00:00 2001 From: tamarafinogina Date: Mon, 26 Jan 2026 16:31:00 +0100 Subject: [PATCH 5/5] switch findOne to plainName --- src/modules/folder/folder.usecase.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/folder/folder.usecase.ts b/src/modules/folder/folder.usecase.ts index 536d60d10..a4d9fde69 100644 --- a/src/modules/folder/folder.usecase.ts +++ b/src/modules/folder/folder.usecase.ts @@ -361,7 +361,7 @@ export class FolderUseCases { } const folderWithSameNameExists = await this.folderRepository.findOne({ - name: newFolderMetadata.plainName, + plainName: newFolderMetadata.plainName, parentId: folder.parentId, deleted: false, removed: false,