55import logging
66from flask_bcrypt import Bcrypt
77from flask_jwt_extended import create_access_token , create_refresh_token
8+ from sqlalchemy .exc import SQLAlchemyError
89from utils .db import db
910from models .user import User
1011from models .pending_user import PendingUser
@@ -48,18 +49,15 @@ def register_user(name, email, password):
4849
4950 name = name .strip ()
5051 hashed_password = bcrypt .generate_password_hash (password ).decode ("utf-8" )
51-
52+ # Move duplicate checks OUTSIDE try to avoid catching
53+ if User .query .filter ((User .email == email ) | (User .name == name )).first ():
54+ logger .error (f"User with email { email } or name { name } already exists" )
55+ raise ValueError ("A user with this email or name already exists" )
56+
57+ if PendingUser .query .filter_by (email = email ).first ():
58+ logger .error (f"Verification request pending for email { email } " )
59+ raise ValueError ("A verification request for this email is already pending" )
5260 try :
53- # Check if email or name already exists in users
54- if User .query .filter ((User .email == email ) | (User .name == name )).first ():
55- logger .error (f"User with email { email } or name { name } already exists" )
56- raise ValueError ("A user with this email or name already exists" )
57-
58- # Check if email is pending
59- if PendingUser .query .filter_by (email = email ).first ():
60- logger .error (f"Verification request pending for email { email } " )
61- raise ValueError ("A verification request for this email is already pending" )
62-
6361 # Store in pending_users
6462 verification_code = generate_verification_code ()
6563 expires_at = datetime .now (timezone .utc ) + CODE_EXPIRATION
@@ -86,31 +84,30 @@ def register_user(name, email, password):
8684 except Exception as e :
8785 logger .error (f"Registration failed for email { email } : { str (e )} " )
8886 db .session .rollback ()
89- raise RuntimeError ( "Registration failed" )
87+ raise
9088
9189def verify_code (email , code ):
9290 """Verify the code and create a user account."""
9391 if not email or not code :
9492 logger .error ("Missing email or verification code" )
9593 raise ValueError ("Email and verification code are required" )
9694
97- try :
98- pending_user = PendingUser .query .filter_by (email = email ).first ()
99- if not pending_user :
100- logger .error (f"No pending registration for email { email } " )
101- raise ValueError ("No pending registration found for this email" )
102-
103- expires_at_aware = pytz .utc .localize (pending_user .expires_at ) if pending_user .expires_at .tzinfo is None else pending_user .expires_at
104- if datetime .now (timezone .utc ) > expires_at_aware :
105- db .session .delete (pending_user )
106- db .session .commit ()
107- logger .error (f"Verification code expired for email { email } " )
108- raise ValueError ("Verification code has expired" )
109-
110- if code != pending_user .verification_code :
111- logger .error (f"Invalid verification code for email { email } " )
112- raise ValueError ("Invalid verification code" )
95+ pending_user = PendingUser .query .filter_by (email = email ).first ()
96+ if not pending_user :
97+ logger .error (f"No pending registration for email { email } " )
98+ raise ValueError ("No pending registration found for this email" )
99+ if code != pending_user .verification_code :
100+ logger .error (f"Invalid verification code for email { email } " )
101+ raise ValueError ("Invalid verification code" )
102+ expires_at_aware = pytz .utc .localize (
103+ pending_user .expires_at ) if pending_user .expires_at .tzinfo is None else pending_user .expires_at
104+ if datetime .now (timezone .utc ) > expires_at_aware :
105+ db .session .delete (pending_user )
106+ db .session .commit ()
107+ logger .error (f"Verification code expired for email { email } " )
108+ raise ValueError ("Verification code has expired" )
113109
110+ try :
114111 # Move to users
115112 user = User (
116113 name = pending_user .name ,
@@ -189,7 +186,7 @@ def login_user(ip, email, password):
189186 logger .error (f"Invalid credentials for email { email } " )
190187 raise ValueError ("Invalid credentials" )
191188
192- except Exception as e :
189+ except ( SQLAlchemyError , OSError ) as e :
193190 logger .error (f"Login failed for email { email } : { str (e )} " )
194191 db .session .rollback ()
195192 raise RuntimeError ("Internal server error" )
@@ -205,12 +202,11 @@ def set_password(user_id, password):
205202 raise ValueError ("Password must be at least 5 characters long" )
206203
207204 hashed_password = bcrypt .generate_password_hash (password ).decode ("utf-8" )
208-
205+ user = User .query .get (user_id )
206+ if not user :
207+ logger .error (f"User not found: { user_id } " )
208+ raise ValueError ("User not found" )
209209 try :
210- user = User .query .get (user_id )
211- if not user :
212- logger .error (f"User not found: { user_id } " )
213- raise ValueError ("User not found" )
214210 user .password = hashed_password
215211 db .session .commit ()
216212 logger .info (f"Password set successfully for user_id { user_id } " )
0 commit comments