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/services/ocr_service.py b/app/services/ocr_service.py new file mode 100644 index 0000000..389c439 --- /dev/null +++ b/app/services/ocr_service.py @@ -0,0 +1,53 @@ +import os +import uuid +from typing import Dict +from PIL import Image +from pdf2image import convert_from_path +from app.services.correction_service import correct_text +from app.services.engines.tesseract_ocr import ocr_tesseract +from app.services.engines.easyocr_ocr import ocr_easyocr +from app.services.engines.paddleocr_ocr import ocr_paddleocr +# from app.services.engines.mmocr_ocr import ocr_mmocr # Opcional +from app.utils import save_text_file + +UPLOAD_DIR = "app/static/uploads" +TEXTS_DIR = "app/static/texts" + +def process_document(file_path: str) -> Dict[str, str]: + filename = os.path.basename(file_path) + base_name = os.path.splitext(filename)[0] + output_folder = os.path.join(TEXTS_DIR, base_name) + os.makedirs(output_folder, exist_ok=True) + + images = [] + if file_path.lower().endswith(".pdf"): + images = convert_from_path(file_path) + else: + images = [Image.open(file_path)] + + results = { + "tesseract": "", + "easyocr": "", + "paddleocr": "", + # "mmocr": "" + } + + for i, image in enumerate(images): + temp_img_path = os.path.join(output_folder, f"page_{i}.png") + image.save(temp_img_path) + + results["tesseract"] += ocr_tesseract(image) + "\n" + results["easyocr"] += ocr_easyocr(temp_img_path) + "\n" + results["paddleocr"] += ocr_paddleocr(temp_img_path) + "\n" + # results["mmocr"] += ocr_mmocr(temp_img_path) + "\n" + + os.remove(temp_img_path) + + for engine, text in results.items(): + save_text_file(text, os.path.join(output_folder, f"{engine}.txt")) + + corrected = correct_text(results["tesseract"]) + save_text_file(corrected, os.path.join(output_folder, "corrigido.txt")) + results["corrigido"] = corrected + + return results 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 @@ + + + + + +