from flask import Blueprint, render_template, request, flash, redirect, url_for, session from utils.db.db import mongo from utils.logging.logger_setup import logger import bcrypt auth_bp = Blueprint('auth', __name__) @auth_bp.route("/login/patient", methods=["GET", "POST"]) def patient_login(): """ Handle patient login requests. Verifies credentials against the MongoDB patient collection. Supports both legacy plain-text and hashed passwords for migration compatibility. """ if request.method == "POST": name = request.form.get("name", "").strip() password = request.form.get("password", "").strip() try: # Check name or email patient = mongo.db.patient.find_one({"$or": [{"name": name}, {"email": name}]}) if patient: # Verify password stored_password = patient.get('password') is_valid = False try: if stored_password: is_valid = bcrypt.checkpw(password.encode('utf-8'), stored_password.encode('utf-8')) except ValueError: # Fallback for legacy plain text passwords during migration is_valid = (stored_password == password) except Exception as e: logger.error(f"Error during password verification for patient {name}: {e}") is_valid = False if is_valid: session['logged_in'] = True session['user_type'] = 'patient' session['user_id'] = patient.get('sql_id', patient.get('id')) logger.info({"action": "patient_login", "status": "success", "patient_id": session['user_id']}) flash("Patient login successful!") return redirect(url_for("patient.patient_dashboard")) else: logger.warning({"action": "patient_login", "status": "failure", "name": name, "reason": "invalid_password"}) flash("Invalid credentials. Please try again.") else: logger.warning({"action": "patient_login", "status": "failure", "name": name, "reason": "user_not_found"}) flash("Invalid credentials. Please try again.") except Exception as e: logger.error(f"Database error during patient login for {name}: {e}") flash("A system error occurred. Please try again later.") return render_template('patient/patient_login.html') @auth_bp.route("/login/doctor", methods=["GET", "POST"]) def doctor_login(): """ Handle doctor login requests. Verifies credentials against the MongoDB doctor collection. """ if request.method == "POST": name = request.form.get("name") password = request.form.get("password") try: doctor = mongo.db.doctor.find_one({"$or": [{"name": name}, {"email": name}]}) if doctor: stored_password = doctor.get('password') is_valid = False try: if stored_password: is_valid = bcrypt.checkpw(password.encode('utf-8'), stored_password.encode('utf-8')) except ValueError: is_valid = (stored_password == password) except Exception as e: logger.error(f"Error during password verification for doctor {name}: {e}") is_valid = False if is_valid: session['logged_in'] = True session['user_type'] = 'doctor' session['user_id'] = doctor.get('sql_id', doctor.get('id')) session['user_name'] = doctor.get('name') logger.info({"action": "doctor_login", "status": "success"}) flash("Doctor login successful!") return redirect(url_for("doctor.doctor_dashboard")) else: logger.warning({"action": "doctor_login", "status": "failure", "name": name, "reason": "invalid_password"}) flash("Invalid credentials. Please try again.") else: logger.warning({"action": "doctor_login", "status": "failure", "name": name, "reason": "user_not_found"}) flash("Invalid credentials. Please try again.") except Exception as e: logger.error(f"Database error during doctor login for {name}: {e}") flash("A system error occurred. Please try again later.") return render_template('doctor/doctor_login.html') @auth_bp.route("/login/admin") def admin_login_redirect(): return redirect(url_for("admin.login")) @auth_bp.route("/logout") def logout(): session.clear() flash("You have been successfully logged out.") return redirect(url_for('index'))