diff --git a/backend/areas/users/user_service.py b/backend/areas/users/user_service.py index b5e7681e86340108734bb43c3f0a08b1568ba109..a3e962cd15b2b6f8bb8097ae9e8531ab44830919 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