Darshan Kumar R
Deploy to Hugging Face Spaces (Clean)
ed0b977
Raw History Blame Contribute Delete
5 kB
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'))