diff --git a/backend/main/src/Group/Repositories/GroupRepository.ts b/backend/main/src/Group/Repositories/GroupRepository.ts index ddee841c..60a7cc84 100644 --- a/backend/main/src/Group/Repositories/GroupRepository.ts +++ b/backend/main/src/Group/Repositories/GroupRepository.ts @@ -79,11 +79,35 @@ export class GroupRepository implements IGroupRepository { * @param Group */ async update(Group: Group): Promise { - await this.nishikiDbClient.saveGroup(Group.id.id, { - groupName: Group.name, - userIds: Group.userIds.map((userId) => userId.id), - containerIds: Group.containerIds.map((containerId) => containerId.id), - }); + // find users who are not in the updated group + const currentGroupUsers = await this.nishikiDbClient.listOfUsersInGroup( + Group.id.id, + ); + const deletingUsers = currentGroupUsers.filter( + (user) => !Group.userIds.some((userId) => userId.id === user.userId), + ); + + // find containers which are not in the updated group + const currentGroupContainers = await this.nishikiDbClient.listOfContainers( + Group.id.id, + ); + const deletingContainers = currentGroupContainers.filter( + (containerId) => !Group.containerIds.some((id) => id.id === containerId), + ); + + await Promise.all([ + deletingUsers.map((user) => + this.nishikiDbClient.deleteUserFromGroup(Group.id.id, user.userId), + ), + deletingContainers.map((containerId) => + this.nishikiDbClient.deleteContainerFromGroup(Group.id.id, containerId), + ), + this.nishikiDbClient.saveGroup(Group.id.id, { + groupName: Group.name, + userIds: Group.userIds.map((userId) => userId.id), + containerIds: Group.containerIds.map((containerId) => containerId.id), + }), + ]); } /** diff --git a/backend/main/src/Shared/Adapters/DB/NishikiTableClient.ts b/backend/main/src/Shared/Adapters/DB/NishikiTableClient.ts index f9f4adf0..8dd9f3bb 100644 --- a/backend/main/src/Shared/Adapters/DB/NishikiTableClient.ts +++ b/backend/main/src/Shared/Adapters/DB/NishikiTableClient.ts @@ -377,6 +377,44 @@ export class NishikiDynamoDBClient { ); } + /** + * Delete a user from the group. + * This function deletes the relation between the user and the group. + * @param groupId + * @param userId + */ + async deleteUserFromGroup(groupId: string, userId: string) { + const deleteUserFromGroupInput: DeleteItemInput = { + TableName: this.tableName, + Key: marshall({ + PK: userId, + SK: `Group#${groupId}`, + }), + }; + + const command = new DeleteItemCommand(deleteUserFromGroupInput); + await this.dynamoClient.send(command); + } + + /** + * Delete a container from the group. + * This function deletes the relation between the container and the group. + * @param groupId + * @param containerId + */ + async deleteContainerFromGroup(groupId: string, containerId: string) { + const deleteContainerFromGroupInput: DeleteItemInput = { + TableName: this.tableName, + Key: marshall({ + PK: groupId, + SK: `Container#${containerId}`, + }), + }; + + const command = new DeleteItemCommand(deleteContainerFromGroupInput); + await this.dynamoClient.send(command); + } + /** * Add a link and hash data to the Table. * This function takes the link expiry Datetime as a parameter. diff --git a/backend/main/test/Shared/Adapters/NishikiTableClient.test.ts b/backend/main/test/Shared/Adapters/NishikiTableClient.test.ts index 6da788df..317137d0 100644 --- a/backend/main/test/Shared/Adapters/NishikiTableClient.test.ts +++ b/backend/main/test/Shared/Adapters/NishikiTableClient.test.ts @@ -252,6 +252,30 @@ describe.sequential("DynamoDB test client", () => { expect(result).toEqual([]); }); }); + + it("delete a user from a group", async () => { + const groupId = groupData.groupData[0].groupId; + const userId = groupData.groupData[0].users![0]; + + await nishikiClient.deleteUserFromGroup(groupId, userId); + + const result = await nishikiClient.getUser({ + userId, + groupId, + }); + + expect(result).toBeFalsy(); + }); + + it("delete a container from a group", async () => { + const groupId = groupData.groupData[0].groupId; + const containerId = groupData.groupData[0].containerIds![0]; + + await nishikiClient.deleteContainerFromGroup(groupId, containerId); + const result = await nishikiClient.listOfContainers(groupId); + + expect(result).not.toContain(containerId); + }); }); describe.sequential("join link expiry datetime", () => {