from flask import (Blueprint, render_template, request, redirect, url_for, flash, session, current_app) from app.services.user_service import UserService from app.constants.messages import SuccessMessage, ErrorMessage from app.constants.http_status import HTTPStatus auth_bp = Blueprint("auth", __name__) # ========================== # LOGIN # ========================== @auth_bp.route("/login", methods=["GET", "POST"]) def login(): if session.get("user_id"): current_app.logger.info("User already logged in.") return redirect(url_for("dashboard.dashboard")) if request.method == "POST": try: email = request.form.get("email", "").strip() password = request.form.get("password", "") if not email or not password: flash(ErrorMessage.INVALID_REQUEST, "danger") current_app.logger.warning("Login failed. Email or password missing.") return render_template("login.html", title="Login") user = UserService.validate_login(email, password) if user: session.clear() session["user_id"] = user.id session["user_name"] = user.name session["email"] = user.email session.permanent = True current_app.logger.info(f"Login successful. User={user.name}") flash(SuccessMessage.LOGIN, "success") return redirect(url_for("dashboard.dashboard")) current_app.logger.warning(f"Invalid login attempt. Email={email}") flash(ErrorMessage.LOGIN_FAILED,"danger") except Exception as e: current_app.logger.exception("Login Error" ) flash(ErrorMessage.INTERNAL_SERVER_ERROR,"danger") return render_template("login.html", title="Login") # ========================== # LOGOUT # ========================== @auth_bp.route("/logout") def logout(): username = session.get("user_name", "Unknown") session.clear() current_app.logger.info(f"Logout successful. User={username}") flash(SuccessMessage.LOGOUT,"info") return redirect(url_for("auth.login")) # ========================== # REGISTER # ========================== @auth_bp.route("/register", methods=["GET", "POST"]) def register(): if request.method == "POST": try: name = request.form.get("name", "").strip() email = request.form.get("email", "").strip() password = request.form.get("password", "") if not name or not email or not password: flash(ErrorMessage.INVALID_REQUEST,"danger") return redirect(url_for("auth.register")) user = UserService.register_user(name, email, password) if not user: current_app.logger.warning(f"Duplicate Registration: {email}") flash(ErrorMessage.DUPLICATE_ENTRY,"danger") return redirect(url_for("auth.register")) current_app.logger.info(f"New user registered: {email}") flash(SuccessMessage.CREATED,"success") return redirect(url_for("auth.login")) except Exception: current_app.logger.exception("User Registration Failed" ) flash(ErrorMessage.INTERNAL_SERVER_ERROR,"danger") return render_template("register.html",title="Register")