From 69ed55f1fe711577d0c9bcf4ef32a49015e69844 Mon Sep 17 00:00:00 2001 From: Jeny Sadadia Date: Tue, 28 Nov 2023 18:14:47 +0530 Subject: [PATCH 1/2] api.db: implement `Database.delete_by_id` Implement a method to delete one object matching a given ID. Signed-off-by: Jeny Sadadia --- api/db.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/api/db.py b/api/db.py index 87933e68..7c418cdd 100644 --- a/api/db.py +++ b/api/db.py @@ -194,3 +194,10 @@ async def update(self, obj): if res.matched_count == 0: raise ValueError(f"No object found with id: {obj.id}") return obj.__class__(**await col.find_one(ObjectId(obj.id))) + + async def delete_by_id(self, model, obj_id): + """Delete one object matching a given id""" + col = self._get_collection(model) + result = await col.delete_one({"_id": ObjectId(obj_id)}) + if result.deleted_count == 0: + raise ValueError(f"No object found with id: {obj_id}") From 95747582f23f53154fa9efc35b2a54d0b008daba Mon Sep 17 00:00:00 2001 From: Jeny Sadadia Date: Wed, 29 Nov 2023 12:16:29 +0530 Subject: [PATCH 2/2] api.main: implement DELETE `/group/` endpoint Implement endpoint to delete a user group. Remove users from that group before deleting it. Also, remove group name from permitted groups `Node.user_groups` to update node. Signed-off-by: Jeny Sadadia --- api/main.py | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/api/main.py b/api/main.py index 5533fcfd..bf80e775 100644 --- a/api/main.py +++ b/api/main.py @@ -393,6 +393,33 @@ async def get_group(group_id: str): return await db.find_by_id(UserGroup, group_id) +@app.delete('/group/{group_id}', response_model=PageModel) +async def delete_group(group_id: str, + current_user: User = Depends(get_current_superuser)): + """Delete user group matching the provided group id""" + group_from_id = await db.find_by_id(UserGroup, group_id) + if not group_from_id: + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail=f"Group not found with id: {group_id}" + ) + # Remove users from the group before deleting it + users = await db.find_by_attributes( + User, {"groups.name": group_from_id.name}) + for user in users.items: + user['groups'].remove(group_from_id) + await db.update(User(**user)) + + # Remove group from user groups that are permitted to update node + nodes = await db.find_by_attributes( + Node, {"user_groups": group_from_id.name}) + for node in nodes.items: + node['user_groups'].remove(group_from_id.name) + await db.update(Node(**node)) + + await db.delete_by_id(UserGroup, group_id) + + # ----------------------------------------------------------------------------- # Nodes