From 0cf4761ebea9bb1bac6ff3a86bd9184d1e24142b Mon Sep 17 00:00:00 2001 From: Arie Peterson <arie@greenhost.nl> Date: Thu, 2 Nov 2023 15:40:53 +0100 Subject: [PATCH] Add stackspin role info to user listing endpoint --- backend/areas/users/user_service.py | 50 ++++++++++++++++++++--------- 1 file changed, 34 insertions(+), 16 deletions(-) diff --git a/backend/areas/users/user_service.py b/backend/areas/users/user_service.py index b5e7681e..a3e962cd 100644 --- a/backend/areas/users/user_service.py +++ b/backend/areas/users/user_service.py @@ -20,18 +20,24 @@ kratos_frontend_api = frontend_api.FrontendApi(kratos_client) kratos_identity_api = identity_api.IdentityApi(kratos_client) class UserService: - @staticmethod - def get_users(): + @classmethod + def get_users(cls): page = 0 userList = [] + dashboardRoles = cls.__getDashboardRoles() while page >= 0: if page == 0: res = KratosApi.get("/admin/identities?per_page=1000").json() else: res = KratosApi.get("/admin/identities?per_page=1000&page={}".format(page)).json() for r in res: - # removed the app role assignment function, passing simple user data - # userList.append(UserService.__insertAppRoleToUser(r["id"], r)) + # Inject information from the `stackspin` database that's associated to this user. + # In particular, the dashboard role (admin or regular user). + stackspinData = {} + dashboardRole = dashboardRoles.get(r["id"]) + if dashboardRole is not None: + stackspinData["stackspin_admin"] = dashboardRole == Role.ADMIN_ROLE_ID + r["stackspin_data"] = stackspinData userList.append(r) if len(res) == 0: page = -1 @@ -40,10 +46,10 @@ class UserService: return userList - @staticmethod - def get_user(id): + @classmethod + def get_user(cls, id): res = KratosApi.get("/admin/identities/{}".format(id)).json() - return UserService.__insertAppRoleToUser(id, res) + return cls.__insertAppRoleToUser(id, res) @staticmethod def create_recovery_link(id): @@ -53,8 +59,8 @@ class UserService: res = KratosApi.post("/admin/recovery/link", kratos_data).json() return res - @staticmethod - def post_user(data): + @classmethod + def post_user(cls, data): kratos_data = { "schema_id": "default", "traits": { @@ -90,7 +96,7 @@ class UserService: # We start a recovery flow immediately after creating the # user, so the user can set their initial password. - UserService.__start_recovery_flow(data["email"]) + cls.__start_recovery_flow(data["email"]) return UserService.get_user(res["id"]) @@ -119,8 +125,8 @@ class UserService: api_response = kratos_frontend_api.update_recovery_flow(flow, update_recovery_flow_body=update_recovery_flow_body) - @staticmethod - def put_user(id, user_editing_id, data): + @classmethod + def put_user(cls, id, user_editing_id, data): kratos_data = { "schema_id": "default", "traits": {"email": data["email"], "name": data["name"]}, @@ -148,10 +154,10 @@ class UserService: db.session.add(appRole) db.session.commit() - return UserService.get_user(id) + return cls.get_user(id) - @staticmethod - def put_multiple_users(user_editing_id, data): + @classmethod + def put_multiple_users(cls, user_editing_id, data): for user_data in data["users"]: kratos_data = { # "schema_id": "default", @@ -180,7 +186,7 @@ class UserService: db.session.add(appRole) db.session.commit() - return UserService.get_user(user_data["id"]) + return cls.get_user(user_data["id"]) @staticmethod def delete_user(id): @@ -254,3 +260,15 @@ class UserService: userRes["traits"]["app_roles"] = app_roles return userRes + + @staticmethod + def __getDashboardRoles(): + dashboardRoles = {} + for appRole, app in ( + db.session.query(AppRole, App) + .filter(AppRole.app_id == App.id) + .filter(App.slug == "dashboard") + .all() + ): + dashboardRoles[appRole.user_id] = appRole.role_id + return dashboardRoles -- GitLab