1- from typing import Any , Dict , List
2- from submodules .model import User , enums
1+ from typing import Any , Dict , List , Optional
2+ from submodules .model import User , daemon , enums
33from submodules .model .business_objects import user , user_activity , general
44from controller .auth import kratos
55from submodules .model .exceptions import EntityNotFoundException
@@ -91,11 +91,17 @@ def remove_organization_from_user(user_mail: str) -> None:
9191 user .remove_organization (user_id , with_commit = True )
9292
9393
94- def get_active_users (minutes : int , order_by_interaction : bool ) -> User :
94+ def get_active_users_filtered (
95+ minutes : Optional [int ] = None ,
96+ sort_key : Optional [str ] = None ,
97+ sort_direction : Optional [str ] = None ,
98+ offset : Optional [int ] = None ,
99+ limit : Optional [int ] = None ,
100+ ) -> User :
95101 now = datetime .now ()
96102 last_interaction_range = (now - timedelta (minutes = minutes )) if minutes > 0 else None
97- return user_activity . get_active_users_in_range (
98- last_interaction_range , order_by_interaction
103+ return user . get_active_users_after_filter (
104+ last_interaction_range , sort_key , sort_direction , offset , limit
99105 )
100106
101107
@@ -104,53 +110,53 @@ def update_last_interaction(user_id: str) -> None:
104110 user_activity .update_last_interaction (user_id )
105111
106112
107- def get_mapped_sorted_paginated_users (
108- active_users : Dict [str , Any ],
109- sort_key : str ,
110- sort_direction : int ,
111- offset : int ,
112- limit : int ,
113- ) -> List [Dict [str , Any ]]:
114-
115- final_users = []
116- save_len_final_users = 0
117-
118- # mapping users with the users in kratos
119- active_users_ids = list (active_users .keys ())
120-
121- for user_id in active_users_ids :
122- get_user = kratos .__get_identity (user_id , False )["identity" ]
123- if get_user and get_user ["traits" ]["email" ] is not None :
124- get_user ["email" ] = get_user ["traits" ]["email" ]
125- get_user ["verified" ] = get_user ["verifiable_addresses" ][0 ]["verified" ]
126- active_user_by_id = active_users [user_id ]
127- get_user ["last_interaction" ] = active_user_by_id ["last_interaction" ]
128- get_user ["role" ] = active_user_by_id ["role" ]
129- get_user ["organization" ] = active_user_by_id ["organizationName" ]
130-
131- public_meta = get_user ["metadata_public" ]
132- get_user ["sso_provider" ] = (
133- public_meta .get ("registration_scope" , {}).get ("provider_id" , None )
134- if public_meta
135- else None
136- )
137-
138- final_users .append (get_user )
139- save_len_final_users += 1
140-
141- final_users = sorted (
142- final_users ,
143- key = lambda x : (x [sort_key ] is None , x .get (sort_key , "" )),
144- reverse = sort_direction == - 1 ,
145- )
146-
147- # paginating users
148- final_users = final_users [offset : offset + limit ]
149-
150- return final_users , save_len_final_users
151-
152-
153113def delete_user (user_id : str ) -> None :
154114 user .delete (user_id , with_commit = True )
155115 user_activity .delete_user_activity (user_id , with_commit = True )
156116 kratos .__refresh_identity_cache ()
117+
118+
119+ def migrate_kratos_users () -> None :
120+ # this is only supposed to be called during startup of the application
121+ daemon .run_with_db_token (__migrate_kratos_users )
122+
123+
124+ def __migrate_kratos_users ():
125+ users_kratos = kratos .get_cached_values (False )
126+ users_database = user .get_all ()
127+
128+ for user_database in users_database :
129+ user_id = str (user_database .id )
130+ user_identity = users_kratos [user_id ]["identity" ]
131+
132+ if user_database .email != user_identity ["traits" ]["email" ]:
133+ user_database .email = user_identity ["traits" ]["email" ]
134+ if (
135+ user_database .verified
136+ != user_identity ["verifiable_addresses" ][0 ]["verified" ]
137+ ):
138+ user_database .verified = user_identity ["verifiable_addresses" ][0 ][
139+ "verified"
140+ ]
141+ if (
142+ user_database .created_at
143+ != user_identity ["verifiable_addresses" ][0 ]["created_at" ]
144+ ):
145+ user_database .created_at = user_identity ["verifiable_addresses" ][0 ][
146+ "created_at"
147+ ]
148+ if user_database .metadata_public != user_identity ["metadata_public" ]:
149+ user_database .metadata_public = user_identity ["metadata_public" ]
150+ sso_provider = (
151+ (
152+ user_identity ["metadata_public" ]
153+ .get ("registration_scope" , {})
154+ .get ("provider_id" , None )
155+ )
156+ if user_identity ["metadata_public" ]
157+ else None
158+ )
159+ if user_database .sso_provider != sso_provider :
160+ user_database .sso_provider = sso_provider
161+
162+ general .commit ()
0 commit comments