from flask import Flask, jsonify, request from pathlib import Path import json from models import ListeMedaille, Medaille from flask_swagger_ui import get_swaggerui_blueprint import os app = Flask(__name__) app.config['MEDAILLE_FILE'] = os.getenv('MEDAILLE_FILE', Path(__file__).parent.parent / 'data' / 'medailles.json') @app.route('/ping', methods=["GET"]) def ping(): return jsonify({"message": "pong"}), 200 @app.route('/', methods=["GET"]) def listeMedaille(): """ Renvoie la liste des médilles """ # Offset / Limit offset = request.args.get('offset', 0) limit = request.args.get('limit', 10) listeMedailles = ListeMedaille() listeMedailles.loadFromJson(app.config['MEDAILLE_FILE']) if limit != 0: listeMedailles.root = listeMedailles.root[int(offset):int(offset)+int(limit)] else: listeMedailles.root = listeMedailles.root[int(offset):] return jsonify(listeMedailles.model_dump()), 200 @app.route('/', methods=["GET"]) def getMedaille(id: int): """ Renvoie un médille par son id """ listeMedailles = ListeMedaille() listeMedailles.loadFromJson(app.config['MEDAILLE_FILE']) for medaille in listeMedailles.root: if medaille.id == id: return jsonify(medaille.model_dump()), 200 return jsonify({"message": "Medaille introuvable"}), 404 @app.route('/', methods=["DELETE"]) def deleteMedaille(id: int): """ Supprime un médille par son id """ listeMedailles = ListeMedaille() listeMedailles.loadFromJson(app.config['MEDAILLE_FILE']) for medaille in listeMedailles.root: if medaille.id == id: listeMedailles.root.remove(medaille) with open(app.config['MEDAILLE_FILE'], 'w') as f: json.dump(listeMedailles.model_dump(), f, indent=4) return jsonify({"message": "Medaille supprimé"}), 200 return jsonify({"message": "Medaille introuvable"}), 404 @app.route('/', methods=["PUT"]) def updateMedaille(id: int): """ Met à jour un médille par son id """ listeMedailles = ListeMedaille() listeMedailles.loadFromJson(app.config['MEDAILLE_FILE']) for medaille in listeMedailles.root: if medaille.id == id: data = json.loads(request.data) for key, value in data.items(): setattr(medaille, key, value) with open(app.config['MEDAILLE_FILE'], 'w') as f: json.dump(listeMedailles.model_dump(), f, indent=4) return jsonify({"message": "Medaille mis à jour"}), 200 return jsonify({"message": "Medaille introuvable"}), 404 @app.route('/', methods=["PATCH"]) def patchMedaille(id: int): """ Met à jour un médille par son id """ listeMedailles = ListeMedaille() listeMedailles.loadFromJson(app.config['MEDAILLE_FILE']) for medaille in listeMedailles.root: if medaille.id == id: data = json.loads(request.data) data["id"] = medaille.id # On ne peut pas changer l'id for key, value in data.items(): if hasattr(medaille, key): setattr(medaille, key, value) if not medaille.validate(): return jsonify({"message": "Données invalides"}), 400 with open(app.config['MEDAILLE_FILE'], 'w') as f: json.dump(listeMedailles.model_dump(), f, indent=4) return jsonify({"message": "Medaille mis à jour"}), 200 return jsonify({"message": "Medaille introuvable"}), 404 @app.route('/', methods=["POST"]) def addMedaille(): """ Ajoute un médille """ listeMedailles = ListeMedaille() listeMedailles.loadFromJson(app.config['MEDAILLE_FILE']) medaille = Medaille(**json.loads(request.data)) if not medaille.validate(): return jsonify({"message": "Données invalides"}), 400 medaille.id = max([medaille.id for medaille in listeMedailles.root]) + 1 listeMedailles.root.append(medaille) with open(app.config['MEDAILLE_FILE'], 'w') as f: json.dump(listeMedailles.model_dump(), f, indent=4) return jsonify(medaille.model_dump()), 200 swaggerui_blueprint = get_swaggerui_blueprint( "/swagger/", "/medailles/static/swagger.yaml" ) app.register_blueprint(swaggerui_blueprint) def create_app(): return app if __name__ == '__main__': app.run()