import json as _json from flask import Blueprint, jsonify, request from pydantic import ValidationError from app.extensions import db from app.models.job_application import JobApplication from app.schemas.job_application import JobApplicationIn, JobApplicationOut from app.utils.auth import require_admin jobs_public_bp = Blueprint("jobs_public", __name__, url_prefix="/api/v1") jobs_admin_bp = Blueprint("jobs_admin", __name__, url_prefix="/api/v1/admin") @jobs_public_bp.route("/jobs/apply", methods=["POST"]) def apply(): data = request.get_json(silent=True) or {} try: validated = JobApplicationIn.model_validate(data) except ValidationError as exc: return jsonify({"error": "Dados inválidos", "details": _json.loads(exc.json())}), 422 application = JobApplication( name=validated.name, email=validated.email, phone=validated.phone, role_interest=validated.role_interest, message=validated.message, file_name=validated.file_name, ) db.session.add(application) db.session.commit() return jsonify({"message": "Candidatura recebida com sucesso"}), 201 @jobs_admin_bp.route("/jobs", methods=["GET"]) @require_admin def list_applications(): page = request.args.get("page", 1, type=int) per_page = min(request.args.get("per_page", 20, type=int), 100) pagination = ( JobApplication.query .order_by(JobApplication.created_at.desc()) .paginate(page=page, per_page=per_page, error_out=False) ) items = [JobApplicationOut.model_validate(item).model_dump(mode="json") for item in pagination.items] return jsonify({ "items": items, "total": pagination.total, "page": pagination.page, "per_page": pagination.per_page, "pages": pagination.pages, }), 200