Files
gesthub/web/routes/annonces.py
2026-08-21 09:12:02 +02:00

63 lines
1.9 KiB
Python

"""routes/annonces.py — API CRUD du module Annonces (EXF-01 à EXF-04)."""
from flask import Blueprint, current_app, jsonify, request
from models.annonce_model import AnnonceNotFoundError
from services import annonce_service
from services.auth_service import client_ip, current_user, require_admin, require_login
bp = Blueprint("annonces", __name__, url_prefix="/api/annonces")
def _db():
return current_app.config["DB"]
@bp.route("", methods=["GET"])
@require_login
def list_annonces():
return jsonify(annonce_service.list_annonces(_db()))
@bp.route("", methods=["POST"])
@require_admin
def create_annonce():
data = request.json or {}
user = current_user()
try:
new_id = annonce_service.create_annonce(
_db(), data.get("titre"), data.get("contenu"), user["sub"],
data.get("epinglee", False), client_ip(),
)
except annonce_service.ValidationError as exc:
return jsonify({"error": str(exc)}), 400
return jsonify({"id": new_id}), 201
@bp.route("/<int:annonce_id>", methods=["PUT"])
@require_admin
def update_annonce(annonce_id):
data = request.json or {}
user = current_user()
try:
annonce_service.update_annonce(
_db(), annonce_id, data.get("titre"), data.get("contenu"), user["sub"],
data.get("epinglee", False), client_ip(),
)
except annonce_service.ValidationError as exc:
return jsonify({"error": str(exc)}), 400
except AnnonceNotFoundError as exc:
return jsonify({"error": str(exc)}), 404
return jsonify({"status": "updated"})
@bp.route("/<int:annonce_id>", methods=["DELETE"])
@require_admin
def delete_annonce(annonce_id):
user = current_user()
try:
annonce_service.delete_annonce(_db(), annonce_id, user["sub"], client_ip())
except AnnonceNotFoundError as exc:
return jsonify({"error": str(exc)}), 404
return jsonify({"status": "deleted"})