diff --git a/app/__init__.py b/app/__init__.py index 5299b5b..90d7fb3 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -3,6 +3,8 @@ from flasgger import Swagger from app.database import db from app.models.user import User from app.routes.user_routes import user_bp +from app.routes.login_form import login_bp +from app.routes.dashboard import dashboard_bp from app.routes.invoice_routes import invoice_bp from werkzeug.security import generate_password_hash @@ -54,5 +56,7 @@ def create_app(): # Registrar Blueprints app.register_blueprint(user_bp, url_prefix="/users") app.register_blueprint(invoice_bp, url_prefix="/invoices") + app.register_blueprint(login_bp, url_prefix="/login_bp") + app.register_blueprint(dashboard_bp, url_prefix="/dashboard") return app diff --git a/app/controllers/__init__.py b/app/controllers/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/app/controllers/auth_controller.py b/app/controllers/auth_controller.py new file mode 100644 index 0000000..85395b2 --- /dev/null +++ b/app/controllers/auth_controller.py @@ -0,0 +1,13 @@ +from app.auth import generate_token +from app.models.user import User +from werkzeug.security import check_password_hash +from flask import jsonify + +def authenticate_user(email, password): + user = User.query.filter_by(email=email).first() + + if not user or not check_password_hash(user.password, password): + return None, None + + token = generate_token(user) + return user, token diff --git a/app/routes/dashboard.py b/app/routes/dashboard.py new file mode 100644 index 0000000..3931a6b --- /dev/null +++ b/app/routes/dashboard.py @@ -0,0 +1,12 @@ +from flask import Blueprint, render_template, session, redirect, url_for, flash + +dashboard_bp = Blueprint("dashboard", __name__, template_folder="templates") + +@dashboard_bp.route("/") +def dashboard(): + """Protege a rota do dashboard""" + if "user_id" not in session: + flash("Faça login para acessar o dashboard.", "warning") + return redirect(url_for("login_form.login")) + + return render_template("dashboard.html", user_email=session.get("user_email")) diff --git a/app/routes/login_form.py b/app/routes/login_form.py new file mode 100644 index 0000000..ed265e9 --- /dev/null +++ b/app/routes/login_form.py @@ -0,0 +1,30 @@ +from flask import Blueprint, render_template, request, redirect, url_for, flash, session +from app.controllers.auth_controller import authenticate_user + +login_bp = Blueprint("login_form", __name__, template_folder="templates") + +@login_bp.route("/", methods=["GET", "POST"]) +def login(): + """Rota de login""" + if request.method == "POST": + email = request.form.get("email") + password = request.form.get("password") + + user, token = authenticate_user(email, password) + + if user: + session["user_id"] = user.id + session["user_email"] = user.email + flash("Login bem-sucedido!", "success") + return redirect(url_for("dashboard.dashboard")) + + flash("Credenciais inválidas!", "danger") + + return render_template("login.html") + +@login_bp.route("/logout") +def logout(): + """Rota de logout""" + session.clear() + flash("Você saiu da conta.", "info") + return redirect(url_for("login_form.login")) diff --git a/app/templates/dashboard.html b/app/templates/dashboard.html new file mode 100644 index 0000000..a4f6e3c --- /dev/null +++ b/app/templates/dashboard.html @@ -0,0 +1,13 @@ + + +
+ + +Usuário logado: {{ user_email }}
+ Sair + + diff --git a/app/templates/login.html b/app/templates/login.html new file mode 100644 index 0000000..6384905 --- /dev/null +++ b/app/templates/login.html @@ -0,0 +1,32 @@ + + + + + +