66from fastapi_users .password import PasswordHelper
77from sqlalchemy import func
88from sqlalchemy import select
9+ from sqlalchemy .exc import IntegrityError
910from sqlalchemy .orm import Session
1011from sqlalchemy .sql import expression
1112from sqlalchemy .sql .elements import ColumnElement
2021from onyx .db .models import SamlAccount
2122from onyx .db .models import User
2223from onyx .db .models import User__UserGroup
24+ from onyx .setup import setup_logger
2325from onyx .utils .variable_functionality import fetch_ee_implementation_or_noop
2426
27+ logger = setup_logger ()
28+
2529
2630def validate_user_role_update (requested_role : UserRole , current_role : UserRole ) -> None :
2731 """
@@ -274,7 +278,7 @@ def _generate_ext_permissioned_user(email: str) -> User:
274278
275279
276280def batch_add_ext_perm_user_if_not_exists (
277- db_session : Session , emails : list [str ]
281+ db_session : Session , emails : list [str ], continue_on_error : bool = False
278282) -> list [User ]:
279283 lower_emails = [email .lower () for email in emails ]
280284 found_users , missing_lower_emails = _get_users_by_emails (db_session , lower_emails )
@@ -283,10 +287,27 @@ def batch_add_ext_perm_user_if_not_exists(
283287 for email in missing_lower_emails :
284288 new_users .append (_generate_ext_permissioned_user (email = email ))
285289
286- db_session .add_all (new_users )
287- db_session .commit ()
288-
289- return found_users + new_users
290+ try :
291+ db_session .add_all (new_users )
292+ db_session .commit ()
293+ except IntegrityError :
294+ db_session .rollback ()
295+ logger .warning (
296+ "IntegrityError occurred during batch insert. Falling back to individual inserts."
297+ )
298+ if not continue_on_error :
299+ raise
300+ for user in new_users :
301+ try :
302+ db_session .add (user )
303+ db_session .commit ()
304+ except IntegrityError :
305+ db_session .rollback ()
306+ logger .warning (f"Skipping duplicate user: { user .email } " )
307+ continue
308+ # Fetch all users again to ensure we have the most up-to-date list
309+ all_users , _ = _get_users_by_emails (db_session , lower_emails )
310+ return all_users
290311
291312
292313def delete_user_from_db (
0 commit comments