Skip to content

Commit

Permalink
Merge pull request #388 from internxt/fix/file-transfer-space-validation
Browse files Browse the repository at this point in the history
[PB-2504: fix/file transfer space validation
  • Loading branch information
sg-gs authored Aug 13, 2024
2 parents 6e9c077 + 067cc81 commit ee0823f
Show file tree
Hide file tree
Showing 2 changed files with 141 additions and 29 deletions.
135 changes: 114 additions & 21 deletions src/modules/workspaces/workspaces.usecase.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4265,15 +4265,18 @@ describe('WorkspacesUsecases', () => {
workspaceId: workspace.id,
member: workspaceOwner,
memberId: workspaceOwner.uuid,
attributes: {
spaceLimit: 1099511627776, // 1TB
},
});

jest
.spyOn(workspaceRepository, 'findById')
.mockResolvedValueOnce(workspace);
jest
.spyOn(workspaceRepository, 'findWorkspaceUser')
.mockResolvedValueOnce(memberWorkspaceUser)
.mockResolvedValueOnce(ownerWorkspaceUser);
.mockResolvedValueOnce(ownerWorkspaceUser)
.mockResolvedValueOnce(memberWorkspaceUser);
jest
.spyOn(userRepository, 'findByUuid')
.mockResolvedValueOnce(workspaceNetworkUser);
Expand All @@ -4286,13 +4289,66 @@ describe('WorkspacesUsecases', () => {
jest
.spyOn(folderUseCases, 'getFoldersInWorkspace')
.mockResolvedValueOnce([]);
jest
.spyOn(service, 'calculateFilesSizeSum')
.mockResolvedValueOnce(0)
.mockResolvedValueOnce(483183820800); // 450 GB

await expect(
service.transferPersonalItemsToWorkspaceOwner(workspace.id, member),
).resolves.toBeUndefined();
expect(folderUseCases.moveFolder).not.toHaveBeenCalled();
});

it("When owner doesn't have enough free space then it shoudl throw", async () => {
const workspaceOwner = newUser();
const workspaceNetworkUser = newUser();
const member = newUser();
const workspace = newWorkspace({
owner: workspaceOwner,
});
const folderToMove = newFolder();
const memberWorkspaceUser = newWorkspaceUser({
workspaceId: workspace.id,
member: member,
memberId: member.uuid,
attributes: {
rootFolderId: folderToMove.uuid,
},
});
const ownerWorkspaceUser = newWorkspaceUser({
workspaceId: workspace.id,
member: workspaceOwner,
memberId: workspaceOwner.uuid,
attributes: {
spaceLimit: 1099511627776, // 1TB
},
});

jest
.spyOn(workspaceRepository, 'findById')
.mockResolvedValueOnce(workspace);
jest
.spyOn(workspaceRepository, 'findWorkspaceUser')
.mockResolvedValueOnce(ownerWorkspaceUser)
.mockResolvedValueOnce(memberWorkspaceUser);
jest
.spyOn(userRepository, 'findByUuid')
.mockResolvedValueOnce(workspaceNetworkUser);
jest
.spyOn(folderUseCases, 'getByUuid')
.mockResolvedValueOnce(folderToMove);

jest
.spyOn(service, 'calculateFilesSizeSum')
.mockResolvedValueOnce(483183820800) // 450GB
.mockResolvedValueOnce(644245094400); // 600 GB

await expect(
service.transferPersonalItemsToWorkspaceOwner(workspace.id, member),
).rejects.toThrow(BadRequestException);
});

it("When user is not the owner of the workspace, then it should move the member's root folder to the workspace owner's root folder", async () => {
const workspaceOwner = newUser();
const workspaceNetworkUser = newUser();
Expand All @@ -4313,6 +4369,9 @@ describe('WorkspacesUsecases', () => {
workspaceId: workspace.id,
member: workspaceOwner,
memberId: workspaceOwner.uuid,
attributes: {
spaceLimit: 1099511627776, // 1TB
},
});
const resultingFolder = Object.assign(newFolder(), folderToMove, {
parentUuid: ownerWorkspaceUser.rootFolderId,
Expand All @@ -4331,8 +4390,8 @@ describe('WorkspacesUsecases', () => {
.mockResolvedValueOnce(workspace);
jest
.spyOn(workspaceRepository, 'findWorkspaceUser')
.mockResolvedValueOnce(memberWorkspaceUser)
.mockResolvedValueOnce(ownerWorkspaceUser);
.mockResolvedValueOnce(ownerWorkspaceUser)
.mockResolvedValueOnce(memberWorkspaceUser);
jest
.spyOn(userRepository, 'findByUuid')
.mockResolvedValueOnce(workspaceNetworkUser);
Expand All @@ -4351,6 +4410,10 @@ describe('WorkspacesUsecases', () => {
jest
.spyOn(folderUseCases, 'renameFolder')
.mockResolvedValueOnce(resultingRenamedFolder);
jest
.spyOn(service, 'calculateFilesSizeSum')
.mockResolvedValueOnce(483183820800) // 450 GB
.mockResolvedValueOnce(483183820800); // 450 GB

const shortIdentifier = Buffer.from(memberWorkspaceUser.id)
.toString('base64')
Expand Down Expand Up @@ -4413,6 +4476,9 @@ describe('WorkspacesUsecases', () => {
workspaceId: workspace.id,
memberId: member.uuid,
member,
attributes: {
spaceLimit: 1099511627776, // 1TB
},
});

jest
Expand All @@ -4422,6 +4488,10 @@ describe('WorkspacesUsecases', () => {
.spyOn(workspaceRepository, 'findById')
.mockResolvedValue(workspace);
jest.spyOn(workspaceRepository, 'deleteUserFromWorkspace');
jest
.spyOn(service, 'calculateFilesSizeSum')
.mockResolvedValueOnce(483183820800) // 450 GB
.mockResolvedValueOnce(483183820800); // 450 GB

expect(
await service.removeWorkspaceMember(workspace.id, member.uuid),
Expand Down Expand Up @@ -4462,6 +4532,9 @@ describe('WorkspacesUsecases', () => {
const workspaceUser = newWorkspaceUser({
memberId: user.uuid,
workspaceId: workspace.id,
attributes: {
spaceLimit: 1099511627776, // 1TB
},
});
jest
.spyOn(workspaceRepository, 'findById')
Expand All @@ -4470,6 +4543,10 @@ describe('WorkspacesUsecases', () => {
.spyOn(workspaceRepository, 'findWorkspaceUser')
.mockResolvedValue(workspaceUser);
jest.spyOn(service, 'transferPersonalItemsToWorkspaceOwner');
jest
.spyOn(service, 'calculateFilesSizeSum')
.mockResolvedValueOnce(483183820800) // 450 GB
.mockResolvedValueOnce(483183820800); // 450 GB

await service.leaveWorkspace(workspace.id, user);

Expand All @@ -4485,6 +4562,9 @@ describe('WorkspacesUsecases', () => {
const workspaceUser = newWorkspaceUser({
memberId: user.uuid,
workspaceId: workspace.id,
attributes: {
spaceLimit: 1099511627776, // 1TB
},
});
const team = newWorkspaceTeam({
workspaceId: workspace.id,
Expand All @@ -4500,6 +4580,10 @@ describe('WorkspacesUsecases', () => {
jest
.spyOn(teamRepository, 'getTeamsWhereUserIsManagerByWorkspaceId')
.mockResolvedValue([team]);
jest
.spyOn(service, 'calculateFilesSizeSum')
.mockResolvedValueOnce(483183820800) // 450 GB
.mockResolvedValueOnce(483183820800); // 450 GB

await service.leaveWorkspace(workspace.id, user);

Expand All @@ -4516,28 +4600,37 @@ describe('WorkspacesUsecases', () => {
workspaceRepository.deleteUserFromWorkspace,
).toHaveBeenCalledWith(user.uuid, workspace.id);
});
});

it('When user is not a manager of any teams and has no items in the workspace, then they should leave the workspace', async () => {
const user = newUser();
const workspace = newWorkspace();
const workspaceUser = newWorkspaceUser({
memberId: user.uuid,
workspaceId: workspace.id,
});
it('When user is not a manager of any teams and has no items in the workspace, then they should leave the workspace', async () => {
const user = newUser();
const workspace = newWorkspace();
const workspaceUser = newWorkspaceUser({
memberId: user.uuid,
workspaceId: workspace.id,
attributes: {
spaceLimit: 1099511627776, // 1TB
},
});

jest.spyOn(workspaceRepository, 'findById').mockResolvedValue(workspace);
jest
.spyOn(workspaceRepository, 'findWorkspaceUser')
.mockResolvedValue(workspaceUser);
jest
.spyOn(workspaceRepository, 'findById')
.mockResolvedValue(workspace);
jest
.spyOn(workspaceRepository, 'findWorkspaceUser')
.mockResolvedValue(workspaceUser);
jest
.spyOn(service, 'calculateFilesSizeSum')
.mockResolvedValueOnce(0) // 450 GB
.mockResolvedValueOnce(483183820800); // 450 GB

await service.leaveWorkspace(workspace.id, user);
await service.leaveWorkspace(workspace.id, user);

expect(workspaceRepository.deleteUserFromWorkspace).toHaveBeenCalledWith(
user.uuid,
workspace.id,
);
expect(
workspaceRepository.deleteUserFromWorkspace,
).toHaveBeenCalledWith(user.uuid, workspace.id);
});
});

describe('upload workspace Avatar', () => {
const newAvatarKey = v4();
const newAvatarURL = `http://localhost:9000/${newAvatarKey}`;
Expand Down
35 changes: 27 additions & 8 deletions src/modules/workspaces/workspaces.usecase.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2203,6 +2203,33 @@ export class WorkspacesUsecases {
throw new ForbiddenException('You are the owner of this workspace');
}

const memberUsage = await this.calculateFilesSizeSum(
user.uuid,
workspace.id,
[FileStatus.EXISTS, FileStatus.TRASHED],
);

const ownerUsage = await this.calculateFilesSizeSum(
workspace.ownerId,
workspace.id,
[FileStatus.EXISTS, FileStatus.TRASHED],
);

const combinedUsage = Number(memberUsage) + Number(ownerUsage);

const ownerWorkspaceUser = await this.workspaceRepository.findWorkspaceUser(
{
workspaceId,
memberId: workspace.ownerId,
},
);

if (Number(ownerWorkspaceUser.spaceLimit) < combinedUsage) {
throw new BadRequestException(
'Owner does not have enough space to receive the files',
);
}

const memberWorkspaceUser =
await this.workspaceRepository.findWorkspaceUser({
workspaceId,
Expand All @@ -2224,7 +2251,6 @@ export class WorkspacesUsecases {
},
{ limit: 1, offset: 0 },
);

const filesInPersonalRootFolder =
await this.fileUseCases.getFilesInWorkspace(
user.uuid,
Expand All @@ -2248,13 +2274,6 @@ export class WorkspacesUsecases {
workspace.workspaceUserId,
);

const ownerWorkspaceUser = await this.workspaceRepository.findWorkspaceUser(
{
workspaceId,
memberId: workspace.ownerId,
},
);

const movedFolder = await this.folderUseCases.moveFolder(
workspaceNetworkUser,
memberRootFolder.uuid,
Expand Down

0 comments on commit ee0823f

Please sign in to comment.