@@ -585,6 +585,13 @@ def delete_case(db: Session, case_id: int) -> bool:
585585 db .rollback ()
586586 raise
587587
588+ Args :
589+ db : Active SQLAlchemy database session .
590+ otp_id : Primary - key ID of the OTPVerification record to update .
591+ lockout_duration_minutes : Duration to lock out the email after max
592+ failed attempts are reached (default : 15 minutes ).
593+ max_failed_attempts : Number of consecutive failures that trigger a
594+ lockout (default : 5 ).
588595
589596def create_case_document (
590597 db : Session ,
@@ -610,6 +617,10 @@ def create_case_document(
610617 db .refresh (doc )
611618 return doc
612619
620+ db .commit ()
621+ db .refresh (otp )
622+ return True
623+ return False
613624
614625def create_case_record (
615626 db : Session ,
@@ -780,11 +791,13 @@ def submit_user_feedback(
780791 satisfaction_rating = satisfaction_rating ,
781792 feedback_text = feedback_text ,
782793 )
783- db .add (feedback )
784- db .commit ()
785- db .refresh (feedback )
786- return feedback
787794
795+ def reset_otp_failed_attempts (db : Session , otp_id : int ) -> bool :
796+ """Reset the failed-attempt counter and any lockout on successful verification.
797+
798+ Args:
799+ db: Active SQLAlchemy database session.
800+ otp_id: Primary-key ID of the OTPVerification record to reset.
788801
789802def get_user_feedback(db: Session, user_id: int) -> List[UserFeedback]:
790803 """ Get feedback history for a user """
@@ -814,8 +827,11 @@ def update_user_last_login(db: Session, user_id: int) -> User:
814827 if user:
815828 user.last_login = dt.datetime.now(dt.timezone.utc)
816829 db.commit()
817- db .refresh (user )
818- return user
830+ total_deleted += deleted
831+ if deleted < batch_size:
832+ break
833+
834+ return total_deleted
819835
820836
821837# Thread lock for OTP rate-limit enforcement (single source of truth).
@@ -872,8 +888,16 @@ def mark_otp_as_used(db: Session, otp_id: int) -> bool:
872888 if otp:
873889 otp.is_used = True
874890 db.commit()
891+ try:
892+ from core.embedding_engine import get_vector_store
893+ vs = get_vector_store()
894+ vs.delete(case_id)
895+ except Exception as ev:
896+ logger.warning(f"Failed to auto-invalidate vector store on case deletion: {ev}")
875897 return True
876- return False
898+ except Exception:
899+ db.rollback()
900+ raise
877901
878902
879903
0 commit comments