From d43707a66352fb09545e6818eda084475f40e8d0 Mon Sep 17 00:00:00 2001 From: BabtouZER Date: Thu, 20 Mar 2025 16:50:14 +0100 Subject: [PATCH 01/26] feature/ajout_post_get MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ajout des routes avec les méthodes GET et POST avec une phase de test --- README.md | 91 +++++++++++-------------------------------- app/routes/routes1.py | 61 ++++++++++++++++++++++++----- test/test.json | 16 ++++++++ 3 files changed, 91 insertions(+), 77 deletions(-) create mode 100644 test/test.json diff --git a/README.md b/README.md index dd48910..a857685 100644 --- a/README.md +++ b/README.md @@ -1,74 +1,29 @@ -# DEPSEC-TemplateAPI -Template d'API flask qui correspond à l'architecture d'APIs définie pour l'ensemble du projet DEPSEC, elle sert à simplifier la création d'une nouvelle API ainsi qu'à uniformiser nos APIs. +# Project Management API -## Fonctionnalités implémentées par cette template -La template gère déjà l'exécution d'une API, il est déjà possible de l'éxécuter ici, on a un seul blueprint test_bp (app/routes/routes1:11) dans lequel on a deux routes : -- /test/toto qui gère les requêtes GET +### Ce micro-service va nous permettre de gérer tous les autres micro-services en les ajoutant, supprimant, avec un système de validation /refus et en se basant sur le système d'authentification. -- /test/tutu qui gère les requêtes POST +## Arborescense +Voici l'arborescence de notre API, avec en commentaire pour chaque dossier/fichier : -Le template permet d'avoir déjà une liste de dépendances établie pour le projet, à laquelle il suffira d'ajouter les nouvelles dépendances. - -Il permet la gestion d'environnements de Dev, Test et Prod ( config.py ) en se basant sur des variables d'environnements dont voici une liste : -```bash -FLASK_ENV=development ou testing ou production -JWT_SECRET_KEY=mdpsecretmalade - -DEV_DATABASE_URL=postgresql://user:password@db:5432/basededev -TEST_DATABASE_URL=postgresql://user:password@db:5432/basedetest -PROD_DATABASE_URL=postgresql://user:password@db:5432/basedeprod - -FLASK_PORT=5000 ``` -### Intégration continue et tests -Les fichiers worflows servent à automatiquement réaliser des actions notamment lors d'un pull request afin d'améliorer notre productivité, cela va installer les dépendances, lancer l'application puis exécuter tous les tests écrits dans test/* - - - - - -## Comment s'en servir ? -Tout d'abord, un dépot template sert de modèle à un nouveau template, dans les faits, un nouveau template copiera l'ensemble du modèle, sans conserver l'historique git du dépot, à l'inverse d'un fork, pour ce faire en premier lieu : -![image](https://github.com/user-attachments/assets/ba4ed3c8-360a-4582-8e36-26ebc39f6748) -

-Il faut ensuite choisir le nom de votre nouveau repo, copier les branches de la template puis créer le dépot. -![image](https://github.com/user-attachments/assets/f8d44895-9f8a-40ce-b4fa-72e30ad0b8bf) - -Vous aurez ensuite votre nouveau dépot reprenant tout l'ensemble de l'ancien dépot. - -## A modifier -- Fichier README.md avec les informations relatives à votre API -- Fichier DOCKERFILE de configuration de l'image docker -- Fichier app/__ init__.py : gérer les blueprints avec leurs préfixes - ```python - from app.routes.fichier.py import - app.register_blueprint(, url_prefix='/route1') - app.register_blueprint, url_prefix='/route2') - ``` -- fichiers app/routes/*, définir les endpoints associés aux blueprints ainsi que les méthodes et chemins associés: - ```python - = Blueprint("", __name__) # exemple de nom : users / auth - @.route('/tutu', methods=['POST']) - @limiter.limit("5 per minute") #comme on veut - def (): - data = request.json - #implémentation de la fonction etc - return jsonify({"msg": ""}), 401 - #autant d'endpoints qu'on veut... - ``` -- Fichier requirements.txt dans le cas où vous utilisez des bibliothèques supplémentaires -- Fichier .env avec les informations qui vont bien c'est à dire le bon URL pour la BDD etc -## Exécution du serveur - -1. Démarrer l'application Flask -```python -flask run -``` -Par défaut, l'API tourne sur http://127.0.0.1:5000/ - -2. Exécution en mode debug -```python -FLASK_ENV=development -flask run +project_management_API/ +├── app/ +│ ├── config.py # Configuration de l'application ( mode dev, staging, prod, ...) +│ ├── __init__.py # Initialisation de l'application Flask (création de l'app ) +│ ├── extensions.py # Gestion des bibliothèques (SQLALchemy, JWT,flask migrate,...) +│ ├── routes/ # Dossier pour les routes (blueprints) +│ │ ├── auth.py # Routes d'authentification (inscription, connexion, JWT) +│ │ ├── courses.py # Routes pour la gestion des routes liées à un autre sujet +│ ├── services/ # Dossier pour le code python avec vos fonctions etc +│ │ ├── get_projects.py # fonctions liées à la récupération des projets +│ │ ├── add_project.py # fonctions liées à l'ajout d'un projet +│ │ ├── del_project.py # fonctions liées à le suppression d'un projet +│ ├── data/ # Dossier pour le code python avec vos fonctions etc +│ │ ├── data.yaml # Contrat d'interface +├── requirements.txt # Dépendances Python +├── .env # Fichier pour les variables d'environnement +├── app.py # Point d'entrée de l'application +├── Dockerfile # Fichier de l'image docker du microservice +└── README.md # Documentation de l'API ``` diff --git a/app/routes/routes1.py b/app/routes/routes1.py index 2b8f78b..ce79aa8 100644 --- a/app/routes/routes1.py +++ b/app/routes/routes1.py @@ -1,6 +1,6 @@ -from flask import Blueprint, request, jsonify +from flask import Blueprint, json, request, jsonify from flask_jwt_extended import create_access_token -#from app.extensions import db +from app.extensions import db from flask_limiter import Limiter from flask_limiter.util import get_remote_address import re @@ -11,24 +11,67 @@ test_bp = Blueprint("test", __name__) limiter = Limiter(get_remote_address, default_limits=["5 per minute"]) -@test_bp.route('/toto', methods=['GET']) -def toto(): +# ---------- Phase de test avant la BDD (comme si test.json était ce qu'on récupérait de la BDD) ------------- # + +with open('../../test/test.json', 'r') as project: + projects = json.load(project) + +def return_project(proj): + for p in projects: + if proj in p.values(): + return p + +def is_project(title): + for p in projects: + if title in p.values(): + return True + +# ------------------------------------------------------------------------------------------------------------ # + +@test_bp.route('/projets', methods=['GET']) +def get_projects(): if verify_token() == False and current_app.config["FLASK_ENV"] !="development" : #verifier que le token est valide ( a mettre dans chaque route) et qu'on est pas en environnement de dev return jsonify({"msg": "Token invalide / Utilisateur non autorisé"}), 401 data = request.json - return jsonify({"msg":"blabla cool"}), 200 + if request.method == 'GET': + return jsonify({"Projects":data}), 200 -@test_bp.route('/tutu', methods=['POST']) -@limiter.limit("5 per minute") #exemple pouur limiter le nombre de requetes -def tutu(): +@test_bp.route('/projets', methods=['POST']) +def add_project(): if verify_token() == False and current_app.config["FLASK_ENV"] !="development" : #verifier que le token est valide ( a mettre dans chaque route) et qu'on est pas en environnement de dev return jsonify({"msg": "Token invalide / Utilisateur non autorisé"}), 401 data = request.json - return jsonify({"msg": "blabla"}), 401 + try : + id = data["id"] + titre = data["titre"] + auteur = data["auteur"] + status = data["status"] + sbom = data["SBOM"] + format = { + "id":id, + "titre":titre, + "auteur":auteur, + "status":status, + "SBOM":sbom + } + if request.method == 'POST': + if is_project(titre) != True and isinstance(id, int) and isinstance(auteur, str) and status in ["Accept","Refuse"] and sbom in ["Recup","Waiting"]: + return jsonify(format), 200 + + except: + return jsonify({"Format de votre requête invalide": "Format de vos valeurs invalide"}), 203 +@test_bp.route('/projets', methods=['POST']) +@limiter.limit("5 per minute") #exemple pour limiter le nombre de requetes +def tutu(): + if verify_token() == False and current_app.config["FLASK_ENV"] !="development" : #verifier que le token est valide ( a mettre dans chaque route) et qu'on est pas en environnement de dev + return jsonify({"msg": "Token invalide / Utilisateur non autorisé"}), 401 + + data = request.json + return jsonify({"msg": "blabla"}), 401 \ No newline at end of file diff --git a/test/test.json b/test/test.json new file mode 100644 index 0000000..071abc5 --- /dev/null +++ b/test/test.json @@ -0,0 +1,16 @@ +[ + { + "id":1, + "titre":"Gestion des projets", + "auteur":"Solayman", + "status":"Accept", + "SBOM":"Recup" + }, + { + "id":2, + "titre":"Gestion de BDD", + "auteur":"Pierrot la pinto de la mañana", + "status":"Refuse", + "SBOM":"Waiting" + } +] \ No newline at end of file From 7ab1c21ffac83b5b35589cd5127609a71d961650 Mon Sep 17 00:00:00 2001 From: BabtouZER Date: Fri, 21 Mar 2025 15:09:33 +0100 Subject: [PATCH 02/26] fix/probleme_import_BDD --- app/routes/routes1.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/routes/routes1.py b/app/routes/routes1.py index ce79aa8..0a67b6d 100644 --- a/app/routes/routes1.py +++ b/app/routes/routes1.py @@ -1,6 +1,6 @@ from flask import Blueprint, json, request, jsonify from flask_jwt_extended import create_access_token -from app.extensions import db +#from app.extensions import db from flask_limiter import Limiter from flask_limiter.util import get_remote_address import re From e848bada711f6dd1c9017fb6cee60cb318c6f692 Mon Sep 17 00:00:00 2001 From: BabtouZER Date: Fri, 21 Mar 2025 15:34:25 +0100 Subject: [PATCH 03/26] fix/file_route --- app/routes/routes1.py | 2 +- {test => app/routes}/test.json | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename {test => app/routes}/test.json (100%) diff --git a/app/routes/routes1.py b/app/routes/routes1.py index 0a67b6d..18787b9 100644 --- a/app/routes/routes1.py +++ b/app/routes/routes1.py @@ -13,7 +13,7 @@ # ---------- Phase de test avant la BDD (comme si test.json était ce qu'on récupérait de la BDD) ------------- # -with open('../../test/test.json', 'r') as project: +with open('test.json', 'r') as project: projects = json.load(project) def return_project(proj): diff --git a/test/test.json b/app/routes/test.json similarity index 100% rename from test/test.json rename to app/routes/test.json From dc7049ca75080371cc720a1a12df5919eaad9db0 Mon Sep 17 00:00:00 2001 From: BabtouZER Date: Fri, 21 Mar 2025 15:43:59 +0100 Subject: [PATCH 04/26] fix/json_file --- app/routes/routes1.py | 18 ++++++++++++++++-- app/routes/test.json | 16 ---------------- 2 files changed, 16 insertions(+), 18 deletions(-) delete mode 100644 app/routes/test.json diff --git a/app/routes/routes1.py b/app/routes/routes1.py index 18787b9..36bb3f6 100644 --- a/app/routes/routes1.py +++ b/app/routes/routes1.py @@ -13,8 +13,22 @@ # ---------- Phase de test avant la BDD (comme si test.json était ce qu'on récupérait de la BDD) ------------- # -with open('test.json', 'r') as project: - projects = json.load(project) +projects = [ + { + "id":1, + "titre":"Gestion des projets", + "auteur":"Solayman", + "status":"Accept", + "SBOM":"Recup" + }, + { + "id":2, + "titre":"Gestion de BDD", + "auteur":"Pierrot la pinto de la mañana", + "status":"Refuse", + "SBOM":"Waiting" + } +] def return_project(proj): for p in projects: diff --git a/app/routes/test.json b/app/routes/test.json deleted file mode 100644 index 071abc5..0000000 --- a/app/routes/test.json +++ /dev/null @@ -1,16 +0,0 @@ -[ - { - "id":1, - "titre":"Gestion des projets", - "auteur":"Solayman", - "status":"Accept", - "SBOM":"Recup" - }, - { - "id":2, - "titre":"Gestion de BDD", - "auteur":"Pierrot la pinto de la mañana", - "status":"Refuse", - "SBOM":"Waiting" - } -] \ No newline at end of file From e8b4b7ad2965050c0fee7bfe82fe2fd8f82b43e0 Mon Sep 17 00:00:00 2001 From: BabtouZER Date: Fri, 21 Mar 2025 15:43:59 +0100 Subject: [PATCH 05/26] fix/json_file --- app/routes/routes1.py | 18 ++++++++++++++++-- app/routes/test.json | 16 ---------------- 2 files changed, 16 insertions(+), 18 deletions(-) delete mode 100644 app/routes/test.json diff --git a/app/routes/routes1.py b/app/routes/routes1.py index 18787b9..36bb3f6 100644 --- a/app/routes/routes1.py +++ b/app/routes/routes1.py @@ -13,8 +13,22 @@ # ---------- Phase de test avant la BDD (comme si test.json était ce qu'on récupérait de la BDD) ------------- # -with open('test.json', 'r') as project: - projects = json.load(project) +projects = [ + { + "id":1, + "titre":"Gestion des projets", + "auteur":"Solayman", + "status":"Accept", + "SBOM":"Recup" + }, + { + "id":2, + "titre":"Gestion de BDD", + "auteur":"Pierrot la pinto de la mañana", + "status":"Refuse", + "SBOM":"Waiting" + } +] def return_project(proj): for p in projects: diff --git a/app/routes/test.json b/app/routes/test.json deleted file mode 100644 index 071abc5..0000000 --- a/app/routes/test.json +++ /dev/null @@ -1,16 +0,0 @@ -[ - { - "id":1, - "titre":"Gestion des projets", - "auteur":"Solayman", - "status":"Accept", - "SBOM":"Recup" - }, - { - "id":2, - "titre":"Gestion de BDD", - "auteur":"Pierrot la pinto de la mañana", - "status":"Refuse", - "SBOM":"Waiting" - } -] \ No newline at end of file From 7a9bb67fd343f6c24b99f1baeccbc586e7671890 Mon Sep 17 00:00:00 2001 From: antoine Date: Sun, 30 Mar 2025 12:40:03 +0200 Subject: [PATCH 06/26] fix/test3 --- Dockerfile | 14 ++-- app.py | 3 +- app/__init__.py | 32 +++++---- app/routes/routes1.py | 151 +++++++++++++++++++++++++----------------- 4 files changed, 124 insertions(+), 76 deletions(-) diff --git a/Dockerfile b/Dockerfile index a38b6e1..57ff104 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,10 +1,16 @@ FROM python:3.11-slim + COPY requirements.txt . + RUN pip install -r requirements.txt -COPY . . +COPY . . + + +CMD ["python","app.py"] + -ENTRYPOINT ["flask"] -CMD ["run"] -EXPOSE 5000 \ No newline at end of file +#ENTRYPOINT ["flask"] +#CMD ["run"] +#EXPOSE 5000 \ No newline at end of file diff --git a/app.py b/app.py index 6a21f8f..8247e71 100644 --- a/app.py +++ b/app.py @@ -3,4 +3,5 @@ app = create_app() if __name__ == "__main__": #lancement de l'app - app.run(debug=app.config.get("DEBUG")) + app.run(host="0.0.0.0", port=5000, debug=True) + # app.run(debug=app.config.get("DEBUG")) diff --git a/app/__init__.py b/app/__init__.py index e0ec4f5..806d985 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -1,26 +1,34 @@ -from flask import Flask,jsonify +from flask import Flask, jsonify from app.config import * from app.extensions import jwt -import os +import os from dotenv import load_dotenv + __version__ = "1.0.1" # géré automatiquement par la CI + load_dotenv(".env") def create_app(): - app = Flask(__name__) + app = Flask(__name__) + + + app.config.from_object(config[os.getenv("FLASK_ENV") or "development"])#en mode dev par défaut si rien de spécifié + + + #db.init_app(app) + jwt.init_app(app) + + + @jwt.unauthorized_loader # gérer le cas ou le client n'est pas authentifié + def unauthorized_callback(callback): + return jsonify({"msg": "Token invalide ou manquant. veuillez vous authentifier."}), 401 - app.config.from_object(config[os.getenv("FLASK_ENV") or "development"])#en mode dev par défaut si rien de spécifié - #db.init_app(app) - jwt.init_app(app) + from app.routes.routes1 import projets_bp - @jwt.unauthorized_loader # gérer le cas ou le client n'est pas authentifié - def unauthorized_callback(callback): - return jsonify({"msg": "Token invalide ou manquant. veuillez vous authentifier."}), 401 - from app.routes.routes1 import test_bp + app.register_blueprint(projets_bp, url_prefix='/projets') - app.register_blueprint(test_bp, url_prefix='/test') - return app + return app \ No newline at end of file diff --git a/app/routes/routes1.py b/app/routes/routes1.py index 36bb3f6..c4b6e13 100644 --- a/app/routes/routes1.py +++ b/app/routes/routes1.py @@ -8,84 +8,117 @@ from flask import current_app #from depsec_models.models import * #import des modèles depuis le package -test_bp = Blueprint("test", __name__) + +projets_bp = Blueprint("projets", __name__) limiter = Limiter(get_remote_address, default_limits=["5 per minute"]) + # ---------- Phase de test avant la BDD (comme si test.json était ce qu'on récupérait de la BDD) ------------- # + projects = [ - { - "id":1, - "titre":"Gestion des projets", - "auteur":"Solayman", - "status":"Accept", - "SBOM":"Recup" - }, - { - "id":2, - "titre":"Gestion de BDD", - "auteur":"Pierrot la pinto de la mañana", - "status":"Refuse", - "SBOM":"Waiting" - } + { + "id":1, + "titre":"Gestion des projets", + "auteur":"Solayman", + "status":"Accept", + "SBOM":"Recup" + }, + { + "id":2, + "titre":"Gestion de BDD", + "auteur":"Pierrot la pinto de la mañana", + "status":"Refuse", + "SBOM":"Waiting" + } ] + +def return_all_proj(): + return projects + + def return_project(proj): - for p in projects: - if proj in p.values(): - return p + for p in projects: + if proj in p.values(): + return p + + + +def add_dico(dico): + + for d in projects: + if d["titre"] == dico["titre"]: + return jsonify({"error": f"Le nom de projet {d['titre']} existe deja !"}), 400 -def is_project(title): - for p in projects: - if title in p.values(): - return True + # trouve le + grand id + max_id = max([elem['id'] for elem in projects]) if projects else 0 + + dico['id'] = max_id + 1 + projects.append(dico) + + return return_all_proj() + #save_json(file_path, data) + #return jsonify(load_json(file_path)), 200 # ------------------------------------------------------------------------------------------------------------ # -@test_bp.route('/projets', methods=['GET']) + +@projets_bp.route('/', methods=['GET']) def get_projects(): - if verify_token() == False and current_app.config["FLASK_ENV"] !="development" : #verifier que le token est valide ( a mettre dans chaque route) et qu'on est pas en environnement de dev - return jsonify({"msg": "Token invalide / Utilisateur non autorisé"}), 401 + if verify_token() == False and current_app.config["FLASK_ENV"] !="development" : #verifier que le token est valide ( a mettre dans chaque route) et qu'on est pas en environnement de dev + return jsonify({"msg": "Token invalide / Utilisateur non autorisé"}), 401 - data = request.json - if request.method == 'GET': - return jsonify({"Projects":data}), 200 -@test_bp.route('/projets', methods=['POST']) + #data = request.get_json() + + + return return_all_proj(), 200 + #return jsonify({"Projects":data.get('titre')}), 200 + + +@projets_bp.route('/', methods=['POST']) def add_project(): - if verify_token() == False and current_app.config["FLASK_ENV"] !="development" : #verifier que le token est valide ( a mettre dans chaque route) et qu'on est pas en environnement de dev - return jsonify({"msg": "Token invalide / Utilisateur non autorisé"}), 401 - - data = request.json - - try : - id = data["id"] - titre = data["titre"] - auteur = data["auteur"] - status = data["status"] - sbom = data["SBOM"] - - format = { - "id":id, - "titre":titre, - "auteur":auteur, - "status":status, - "SBOM":sbom - } - - if request.method == 'POST': - if is_project(titre) != True and isinstance(id, int) and isinstance(auteur, str) and status in ["Accept","Refuse"] and sbom in ["Recup","Waiting"]: - return jsonify(format), 200 + if verify_token() == False and current_app.config["FLASK_ENV"] !="development" : #verifier que le token est valide ( a mettre dans chaque route) et qu'on est pas en environnement de dev + return jsonify({"msg": "Token invalide / Utilisateur non autorisé"}), 401 + + + data = request.get_json() + + if not data : + return jsonify({"error": "Le fomat de vos donnees n'est pas bon !!"}), 400 + + if data.get("titre") and data.get("auteur") and data.get("status") and data.get("SBOM"): + titre = data.get("titre") + auteur = data.get("auteur") + status = data.get("status") + sbom = data.get("SBOM") + + if isinstance(auteur, str) and status in ["Accept","Refuse"] and sbom in ["Recup","Waiting"]: + format = { + "id":0, + "titre":titre, + "auteur":auteur, + "status":status, + "SBOM":sbom + } + return add_dico(format) + else : + return jsonify({'error': 'Parametres aux mauvais formats !'}), 400 + else : + return jsonify({'error': 'Parametres manquants'}), 400 + - except: - return jsonify({"Format de votre requête invalide": "Format de vos valeurs invalide"}), 203 -@test_bp.route('/projets', methods=['POST']) + +@projets_bp.route('/projets', methods=['POST']) @limiter.limit("5 per minute") #exemple pour limiter le nombre de requetes def tutu(): - if verify_token() == False and current_app.config["FLASK_ENV"] !="development" : #verifier que le token est valide ( a mettre dans chaque route) et qu'on est pas en environnement de dev - return jsonify({"msg": "Token invalide / Utilisateur non autorisé"}), 401 + if verify_token() == False and current_app.config["FLASK_ENV"] !="development" : #verifier que le token est valide ( a mettre dans chaque route) et qu'on est pas en environnement de dev + return jsonify({"msg": "Token invalide / Utilisateur non autorisé"}), 401 + + + data = request.json - data = request.json - return jsonify({"msg": "blabla"}), 401 \ No newline at end of file + return jsonify({"msg": "blabla"}), 401 \ No newline at end of file From 3bf328ff7721c6753b66a8a74934850340b7780d Mon Sep 17 00:00:00 2001 From: BabtouZER Date: Sun, 30 Mar 2025 12:43:42 +0200 Subject: [PATCH 07/26] fix/test765765 test with dockerfile and curl --- Dockerfile | 14 ++-- app/__init__.py | 32 ++++++---- app/routes/routes1.py | 145 ++++++++++++++++++++++++------------------ 3 files changed, 114 insertions(+), 77 deletions(-) diff --git a/Dockerfile b/Dockerfile index a38b6e1..57ff104 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,10 +1,16 @@ FROM python:3.11-slim + COPY requirements.txt . + RUN pip install -r requirements.txt -COPY . . +COPY . . + + +CMD ["python","app.py"] + -ENTRYPOINT ["flask"] -CMD ["run"] -EXPOSE 5000 \ No newline at end of file +#ENTRYPOINT ["flask"] +#CMD ["run"] +#EXPOSE 5000 \ No newline at end of file diff --git a/app/__init__.py b/app/__init__.py index e0ec4f5..806d985 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -1,26 +1,34 @@ -from flask import Flask,jsonify +from flask import Flask, jsonify from app.config import * from app.extensions import jwt -import os +import os from dotenv import load_dotenv + __version__ = "1.0.1" # géré automatiquement par la CI + load_dotenv(".env") def create_app(): - app = Flask(__name__) + app = Flask(__name__) + + + app.config.from_object(config[os.getenv("FLASK_ENV") or "development"])#en mode dev par défaut si rien de spécifié + + + #db.init_app(app) + jwt.init_app(app) + + + @jwt.unauthorized_loader # gérer le cas ou le client n'est pas authentifié + def unauthorized_callback(callback): + return jsonify({"msg": "Token invalide ou manquant. veuillez vous authentifier."}), 401 - app.config.from_object(config[os.getenv("FLASK_ENV") or "development"])#en mode dev par défaut si rien de spécifié - #db.init_app(app) - jwt.init_app(app) + from app.routes.routes1 import projets_bp - @jwt.unauthorized_loader # gérer le cas ou le client n'est pas authentifié - def unauthorized_callback(callback): - return jsonify({"msg": "Token invalide ou manquant. veuillez vous authentifier."}), 401 - from app.routes.routes1 import test_bp + app.register_blueprint(projets_bp, url_prefix='/projets') - app.register_blueprint(test_bp, url_prefix='/test') - return app + return app \ No newline at end of file diff --git a/app/routes/routes1.py b/app/routes/routes1.py index 36bb3f6..4209455 100644 --- a/app/routes/routes1.py +++ b/app/routes/routes1.py @@ -8,84 +8,107 @@ from flask import current_app #from depsec_models.models import * #import des modèles depuis le package -test_bp = Blueprint("test", __name__) + +projets_bp = Blueprint("projets", __name__) limiter = Limiter(get_remote_address, default_limits=["5 per minute"]) + # ---------- Phase de test avant la BDD (comme si test.json était ce qu'on récupérait de la BDD) ------------- # + projects = [ - { - "id":1, - "titre":"Gestion des projets", - "auteur":"Solayman", - "status":"Accept", - "SBOM":"Recup" - }, - { - "id":2, - "titre":"Gestion de BDD", - "auteur":"Pierrot la pinto de la mañana", - "status":"Refuse", - "SBOM":"Waiting" - } + { + "id":1, + "titre":"Gestion des projets", + "auteur":"Solayman", + "status":"Accept", + "SBOM":"Recup" + }, + { + "id":2, + "titre":"Gestion de BDD", + "auteur":"Pierrot la pinto de la mañana", + "status":"Refuse", + "SBOM":"Waiting" + } ] + +def return_all_proj(): + return projects + + def return_project(proj): - for p in projects: - if proj in p.values(): - return p - + for p in projects: + if proj in p.values(): + return p + def is_project(title): - for p in projects: - if title in p.values(): - return True + for p in projects: + if title in p.values(): + return True + # ------------------------------------------------------------------------------------------------------------ # -@test_bp.route('/projets', methods=['GET']) + +@projets_bp.route('/', methods=['GET']) def get_projects(): - if verify_token() == False and current_app.config["FLASK_ENV"] !="development" : #verifier que le token est valide ( a mettre dans chaque route) et qu'on est pas en environnement de dev - return jsonify({"msg": "Token invalide / Utilisateur non autorisé"}), 401 + if verify_token() == False and current_app.config["FLASK_ENV"] !="development" : #verifier que le token est valide ( a mettre dans chaque route) et qu'on est pas en environnement de dev + return jsonify({"msg": "Token invalide / Utilisateur non autorisé"}), 401 + + + #data = request.get_json() + + + return return_all_proj() + #return jsonify({"Projects":data.get('titre')}), 200 - data = request.json - if request.method == 'GET': - return jsonify({"Projects":data}), 200 -@test_bp.route('/projets', methods=['POST']) +@projets_bp.route('/', methods=['POST']) def add_project(): - if verify_token() == False and current_app.config["FLASK_ENV"] !="development" : #verifier que le token est valide ( a mettre dans chaque route) et qu'on est pas en environnement de dev - return jsonify({"msg": "Token invalide / Utilisateur non autorisé"}), 401 - - data = request.json - - try : - id = data["id"] - titre = data["titre"] - auteur = data["auteur"] - status = data["status"] - sbom = data["SBOM"] - - format = { - "id":id, - "titre":titre, - "auteur":auteur, - "status":status, - "SBOM":sbom - } - - if request.method == 'POST': - if is_project(titre) != True and isinstance(id, int) and isinstance(auteur, str) and status in ["Accept","Refuse"] and sbom in ["Recup","Waiting"]: - return jsonify(format), 200 - - except: - return jsonify({"Format de votre requête invalide": "Format de vos valeurs invalide"}), 203 - -@test_bp.route('/projets', methods=['POST']) + if verify_token() == False and current_app.config["FLASK_ENV"] !="development" : #verifier que le token est valide ( a mettre dans chaque route) et qu'on est pas en environnement de dev + return jsonify({"msg": "Token invalide / Utilisateur non autorisé"}), 401 + + + #data = request.json + + + if request.method == 'POST': + id = request.form.get("id") + titre = request.form.get("titre") + auteur = request.form.get("auteur") + status = request.form.get("status") + sbom = request.form.get("SBOM") + + + if id and titre and auteur and status and sbom: + + + if is_project(titre) != True and isinstance(id, int) and isinstance(auteur, str) and status in ["Accept","Refuse"] and sbom in ["Recup","Waiting"]: + format = { + "id":id, + "titre":titre, + "auteur":auteur, + "status":status, + "SBOM":sbom + } + return jsonify("format",return_all_proj()), 200 + + else : + return jsonify({'error': 'Paramètres manquants'}), 400 + else : + return jsonify({'error': 'Méthode non autorisée'}), 405 + + +@projets_bp.route('/projets', methods=['POST']) @limiter.limit("5 per minute") #exemple pour limiter le nombre de requetes def tutu(): - if verify_token() == False and current_app.config["FLASK_ENV"] !="development" : #verifier que le token est valide ( a mettre dans chaque route) et qu'on est pas en environnement de dev - return jsonify({"msg": "Token invalide / Utilisateur non autorisé"}), 401 + if verify_token() == False and current_app.config["FLASK_ENV"] !="development" : #verifier que le token est valide ( a mettre dans chaque route) et qu'on est pas en environnement de dev + return jsonify({"msg": "Token invalide / Utilisateur non autorisé"}), 401 + + + data = request.json - data = request.json - return jsonify({"msg": "blabla"}), 401 \ No newline at end of file + return jsonify({"msg": "blabla"}), 401 \ No newline at end of file From 555395394ab9a66b4b524023c9cf7b970a0bf617 Mon Sep 17 00:00:00 2001 From: BabtouZER Date: Sun, 30 Mar 2025 14:59:03 +0200 Subject: [PATCH 08/26] fix/indentation --- app/routes/routes1.py | 22 +++++----------------- 1 file changed, 5 insertions(+), 17 deletions(-) diff --git a/app/routes/routes1.py b/app/routes/routes1.py index a3951ed..8367864 100644 --- a/app/routes/routes1.py +++ b/app/routes/routes1.py @@ -54,8 +54,8 @@ def is_project(title): @projets_bp.route('/', methods=['GET']) def get_projects(): - if verify_token() == False and current_app.config["FLASK_ENV"] !="development" : #verifier que le token est valide ( a mettre dans chaque route) et qu'on est pas en environnement de dev - return jsonify({"msg": "Token invalide / Utilisateur non autorisé"}), 401 + if verify_token() == False and current_app.config["FLASK_ENV"] !="development" : #verifier que le token est valide ( a mettre dans chaque route) et qu'on est pas en environnement de dev + return jsonify({"msg": "Token invalide / Utilisateur non autorisé"}), 401 data = request.json if request.method == 'GET': @@ -64,8 +64,8 @@ def get_projects(): @projets_bp.route('/', methods=['POST']) def add_project(): - if verify_token() == False and current_app.config["FLASK_ENV"] !="development" : #verifier que le token est valide ( a mettre dans chaque route) et qu'on est pas en environnement de dev - return jsonify({"msg": "Token invalide / Utilisateur non autorisé"}), 401 + if verify_token() == False and current_app.config["FLASK_ENV"] !="development" : #verifier que le token est valide ( a mettre dans chaque route) et qu'on est pas en environnement de dev + return jsonify({"msg": "Token invalide / Utilisateur non autorisé"}), 401 data = request.json @@ -89,16 +89,4 @@ def add_project(): return jsonify(format), 200 except: - return jsonify({"Format de votre requête invalide": "Format de vos valeurs invalide"}), 203 - -@test_bp.route('/projets', methods=['POST']) -@limiter.limit("5 per minute") #exemple pour limiter le nombre de requetes -def tutu(): - if verify_token() == False and current_app.config["FLASK_ENV"] !="development" : #verifier que le token est valide ( a mettre dans chaque route) et qu'on est pas en environnement de dev - return jsonify({"msg": "Token invalide / Utilisateur non autorisé"}), 401 - - - data = request.json - - - return jsonify({"msg": "blabla"}), 401 \ No newline at end of file + return jsonify({"Format de votre requête invalide": "Format de vos valeurs invalide"}), 203 \ No newline at end of file From 41ac12f88b31e862b4e88c09a7d05a110b3728ea Mon Sep 17 00:00:00 2001 From: BabtouZER Date: Sun, 30 Mar 2025 12:43:42 +0200 Subject: [PATCH 09/26] fix/test765765 test with dockerfile and curl --- app/routes/routes1.py | 45 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/app/routes/routes1.py b/app/routes/routes1.py index c4b6e13..c11d7bc 100644 --- a/app/routes/routes1.py +++ b/app/routes/routes1.py @@ -43,6 +43,7 @@ def return_project(proj): if proj in p.values(): return p +<<<<<<< HEAD def add_dico(dico): @@ -60,6 +61,13 @@ def add_dico(dico): return return_all_proj() #save_json(file_path, data) #return jsonify(load_json(file_path)), 200 +======= +def is_project(title): + for p in projects: + if title in p.values(): + return True + +>>>>>>> 3bf328f (fix/test765765) # ------------------------------------------------------------------------------------------------------------ # @@ -73,7 +81,11 @@ def get_projects(): #data = request.get_json() +<<<<<<< HEAD return return_all_proj(), 200 +======= + return return_all_proj() +>>>>>>> 3bf328f (fix/test765765) #return jsonify({"Projects":data.get('titre')}), 200 @@ -83,6 +95,7 @@ def add_project(): return jsonify({"msg": "Token invalide / Utilisateur non autorisé"}), 401 +<<<<<<< HEAD data = request.get_json() if not data : @@ -111,6 +124,38 @@ def add_project(): +======= + #data = request.json + + + if request.method == 'POST': + id = request.form.get("id") + titre = request.form.get("titre") + auteur = request.form.get("auteur") + status = request.form.get("status") + sbom = request.form.get("SBOM") + + + if id and titre and auteur and status and sbom: + + + if is_project(titre) != True and isinstance(id, int) and isinstance(auteur, str) and status in ["Accept","Refuse"] and sbom in ["Recup","Waiting"]: + format = { + "id":id, + "titre":titre, + "auteur":auteur, + "status":status, + "SBOM":sbom + } + return jsonify("format",return_all_proj()), 200 + + else : + return jsonify({'error': 'Paramètres manquants'}), 400 + else : + return jsonify({'error': 'Méthode non autorisée'}), 405 + + +>>>>>>> 3bf328f (fix/test765765) @projets_bp.route('/projets', methods=['POST']) @limiter.limit("5 per minute") #exemple pour limiter le nombre de requetes def tutu(): From 3a6788cf2a753175a51d440472b223e1ab049737 Mon Sep 17 00:00:00 2001 From: BabtouZER Date: Sun, 30 Mar 2025 14:59:03 +0200 Subject: [PATCH 10/26] fix/indentation --- app/routes/routes1.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/app/routes/routes1.py b/app/routes/routes1.py index c11d7bc..b393440 100644 --- a/app/routes/routes1.py +++ b/app/routes/routes1.py @@ -74,8 +74,8 @@ def is_project(title): @projets_bp.route('/', methods=['GET']) def get_projects(): - if verify_token() == False and current_app.config["FLASK_ENV"] !="development" : #verifier que le token est valide ( a mettre dans chaque route) et qu'on est pas en environnement de dev - return jsonify({"msg": "Token invalide / Utilisateur non autorisé"}), 401 + if verify_token() == False and current_app.config["FLASK_ENV"] !="development" : #verifier que le token est valide ( a mettre dans chaque route) et qu'on est pas en environnement de dev + return jsonify({"msg": "Token invalide / Utilisateur non autorisé"}), 401 #data = request.get_json() @@ -91,8 +91,8 @@ def get_projects(): @projets_bp.route('/', methods=['POST']) def add_project(): - if verify_token() == False and current_app.config["FLASK_ENV"] !="development" : #verifier que le token est valide ( a mettre dans chaque route) et qu'on est pas en environnement de dev - return jsonify({"msg": "Token invalide / Utilisateur non autorisé"}), 401 + if verify_token() == False and current_app.config["FLASK_ENV"] !="development" : #verifier que le token est valide ( a mettre dans chaque route) et qu'on est pas en environnement de dev + return jsonify({"msg": "Token invalide / Utilisateur non autorisé"}), 401 <<<<<<< HEAD @@ -122,6 +122,7 @@ def add_project(): return jsonify({'error': 'Parametres manquants'}), 400 +<<<<<<< HEAD ======= @@ -166,4 +167,8 @@ def tutu(): data = request.json - return jsonify({"msg": "blabla"}), 401 \ No newline at end of file + return jsonify({"msg": "blabla"}), 401 +======= + except: + return jsonify({"Format de votre requête invalide": "Format de vos valeurs invalide"}), 203 +>>>>>>> 5553953 (fix/indentation) From 5425553aa7603e5e17b809241826c3b6293b925e Mon Sep 17 00:00:00 2001 From: BabtouZER Date: Sun, 30 Mar 2025 12:43:42 +0200 Subject: [PATCH 11/26] fix/all_bugs --- app/routes/routes1.py | 98 ++++++++++++++++++++++++++++--------------- 1 file changed, 65 insertions(+), 33 deletions(-) diff --git a/app/routes/routes1.py b/app/routes/routes1.py index 8367864..1bafc22 100644 --- a/app/routes/routes1.py +++ b/app/routes/routes1.py @@ -39,15 +39,27 @@ def return_all_proj(): def return_project(proj): - for p in projects: - if proj in p.values(): - return p - -def is_project(title): - for p in projects: - if title in p.values(): - return True + for p in projects: + if proj in p.values(): + return p + + +def add_dico(dico): + + for d in projects: + if d["titre"] == dico["titre"]: + return jsonify({"error": f"Le nom de projet {d['titre']} existe deja !"}), 400 + + # trouve le + grand id + max_id = max([elem['id'] for elem in projects]) if projects else 0 + + dico['id'] = max_id + 1 + projects.append(dico) + + return return_all_proj() + #save_json(file_path, data) + #return jsonify(load_json(file_path)), 200 # ------------------------------------------------------------------------------------------------------------ # @@ -57,9 +69,12 @@ def get_projects(): if verify_token() == False and current_app.config["FLASK_ENV"] !="development" : #verifier que le token est valide ( a mettre dans chaque route) et qu'on est pas en environnement de dev return jsonify({"msg": "Token invalide / Utilisateur non autorisé"}), 401 - data = request.json - if request.method == 'GET': - return jsonify({"Projects":data}), 200 + + #data = request.get_json() + + + return return_all_proj(), 200 + #return jsonify({"Projects":data.get('titre')}), 200 @projets_bp.route('/', methods=['POST']) @@ -67,26 +82,43 @@ def add_project(): if verify_token() == False and current_app.config["FLASK_ENV"] !="development" : #verifier que le token est valide ( a mettre dans chaque route) et qu'on est pas en environnement de dev return jsonify({"msg": "Token invalide / Utilisateur non autorisé"}), 401 - data = request.json - - try : - id = data["id"] - titre = data["titre"] - auteur = data["auteur"] - status = data["status"] - sbom = data["SBOM"] - - format = { - "id":id, - "titre":titre, - "auteur":auteur, - "status":status, - "SBOM":sbom - } - - if request.method == 'POST': - if is_project(titre) != True and isinstance(id, int) and isinstance(auteur, str) and status in ["Accept","Refuse"] and sbom in ["Recup","Waiting"]: - return jsonify(format), 200 + + data = request.get_json() + + if not data : + return jsonify({"error": "Le fomat de vos donnees n'est pas bon !!"}), 400 + + if data.get("titre") and data.get("auteur") and data.get("status") and data.get("SBOM"): + titre = data.get("titre") + auteur = data.get("auteur") + status = data.get("status") + sbom = data.get("SBOM") + + if isinstance(auteur, str) and status in ["Accept","Refuse"] and sbom in ["Recup","Waiting"]: + format = { + "id":0, + "titre":titre, + "auteur":auteur, + "status":status, + "SBOM":sbom + } + return add_dico(format) + else : + return jsonify({'error': 'Parametres aux mauvais formats !'}), 400 + else : + return jsonify({'error': 'Parametres manquants'}), 400 + - except: - return jsonify({"Format de votre requête invalide": "Format de vos valeurs invalide"}), 203 \ No newline at end of file + + +@projets_bp.route('/projets', methods=['POST']) +@limiter.limit("5 per minute") #exemple pour limiter le nombre de requetes +def tutu(): + if verify_token() == False and current_app.config["FLASK_ENV"] !="development" : #verifier que le token est valide ( a mettre dans chaque route) et qu'on est pas en environnement de dev + return jsonify({"msg": "Token invalide / Utilisateur non autorisé"}), 401 + + + data = request.json + + + return jsonify({"msg": "blabla"}), 401 \ No newline at end of file From 4350f556fe2bb08ab2961f9e975d1142c16b9784 Mon Sep 17 00:00:00 2001 From: BabtouZER Date: Mon, 31 Mar 2025 13:45:50 +0200 Subject: [PATCH 12/26] feature/method_delete --- app/routes/routes1.py | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/app/routes/routes1.py b/app/routes/routes1.py index 1bafc22..e42db17 100644 --- a/app/routes/routes1.py +++ b/app/routes/routes1.py @@ -44,7 +44,6 @@ def return_project(proj): return p - def add_dico(dico): for d in projects: @@ -61,6 +60,19 @@ def add_dico(dico): #save_json(file_path, data) #return jsonify(load_json(file_path)), 200 +def del_dico(id): + + try: + new_data = [item for item in projects if int(item.get("id")) != int(id)] + except ValueError: + return jsonify({"error": "Entrez un entier !"}), 404 + + if len(new_data) == len(projects): + return jsonify({"error": f"Le projet avec l'id '{id}' n'existe pas !"}), 404 + + #return jsonify(load_json(file_path)), 200 + return return_all_proj() + # ------------------------------------------------------------------------------------------------------------ # @@ -108,17 +120,7 @@ def add_project(): else : return jsonify({'error': 'Parametres manquants'}), 400 - - - -@projets_bp.route('/projets', methods=['POST']) -@limiter.limit("5 per minute") #exemple pour limiter le nombre de requetes -def tutu(): - if verify_token() == False and current_app.config["FLASK_ENV"] !="development" : #verifier que le token est valide ( a mettre dans chaque route) et qu'on est pas en environnement de dev - return jsonify({"msg": "Token invalide / Utilisateur non autorisé"}), 401 - - - data = request.json - - return jsonify({"msg": "blabla"}), 401 \ No newline at end of file +@projets_bp.route("/", methods=["DELETE"]) +def del_project(id): + return del_dico(id) \ No newline at end of file From 63c9fc64572c99e66b3838c37bfcc913eb767648 Mon Sep 17 00:00:00 2001 From: antoine Date: Mon, 31 Mar 2025 14:19:18 +0200 Subject: [PATCH 13/26] fix/delete_method --- app/routes/routes1.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/routes/routes1.py b/app/routes/routes1.py index e42db17..1ca3de0 100644 --- a/app/routes/routes1.py +++ b/app/routes/routes1.py @@ -61,17 +61,19 @@ def add_dico(dico): #return jsonify(load_json(file_path)), 200 def del_dico(id): + global projects try: new_data = [item for item in projects if int(item.get("id")) != int(id)] - except ValueError: + except : return jsonify({"error": "Entrez un entier !"}), 404 if len(new_data) == len(projects): return jsonify({"error": f"Le projet avec l'id '{id}' n'existe pas !"}), 404 - #return jsonify(load_json(file_path)), 200 + projects = new_data return return_all_proj() + #return jsonify(load_json(file_path)), 200 # ------------------------------------------------------------------------------------------------------------ # From 793d4e1e52b711e99913964ba5e89148ef63fa54 Mon Sep 17 00:00:00 2001 From: antoine Date: Mon, 31 Mar 2025 16:56:27 +0200 Subject: [PATCH 14/26] feature/db_connexion --- .gitignore | 2 ++ app/config.py | 2 +- pyproject.toml | 5 ++--- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index 15201ac..e9174b8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ +.env + # Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] diff --git a/app/config.py b/app/config.py index 8bd9e0b..a5cf5fe 100644 --- a/app/config.py +++ b/app/config.py @@ -9,7 +9,7 @@ class Config: # config par défaut JWT_SECRET_KEY = os.getenv('JWT_SECRET_KEY', 'enormemotdepasse') PORT=os.getenv("FLASK_PORT",5000) -class DevelopmentConfig(Config): +class DevelopmentConfig(Config): FLASK_ENV = 'development' DEBUG = True SQLALCHEMY_DATABASE_URI = os.getenv('DEV_DATABASE_URL', 'postgresql://user:password@db:5432/basededev') diff --git a/pyproject.toml b/pyproject.toml index 0d114c7..7739bdf 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] -name = "TemplateAPI" # achanger -description = "Template d'API pour le projet DEPSEC" # achanger +name = "API_Project_Management" # achanger +description = "API_Project_Management nous permet de gérer nos projets grr baw" # achanger [tool.semantic_release] version_variable = ["app/__init__.py:__version__"] @@ -17,4 +17,3 @@ tag_format = "v{version}" #tag git automatique pour semantic-release changelog_sections = ["Features", "Bug Fixes", "Documentation", "Tests","CI/CD"] upload_to_release = true # release auto sur github changelog_format = "- {message} ([{commit}](https://github.com/DEPSEC-Project/TemplateAPI/commit/{commit}))" - From e5f18caaa6760d2747601bd8f4f884dac8b93496 Mon Sep 17 00:00:00 2001 From: antoine Date: Mon, 31 Mar 2025 18:20:17 +0200 Subject: [PATCH 15/26] =?UTF-8?q?feat(connexion):=20connexion=20=C3=A0=20l?= =?UTF-8?q?a=20BDD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + app/__init__.py | 6 ++---- app/extensions.py | 2 +- app/routes/routes1.py | 3 ++- test/test_app.py | 18 +++++++++++------- 5 files changed, 17 insertions(+), 13 deletions(-) diff --git a/.gitignore b/.gitignore index e9174b8..6df6f5d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ .env +migrations/ # Byte-compiled / optimized / DLL files __pycache__/ diff --git a/app/__init__.py b/app/__init__.py index 806d985..3b472ee 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -1,10 +1,9 @@ from flask import Flask, jsonify from app.config import * -from app.extensions import jwt +from app.extensions import jwt, db import os from dotenv import load_dotenv - __version__ = "1.0.1" # géré automatiquement par la CI @@ -16,10 +15,9 @@ def create_app(): app.config.from_object(config[os.getenv("FLASK_ENV") or "development"])#en mode dev par défaut si rien de spécifié - #db.init_app(app) + db.init_app(app) jwt.init_app(app) - @jwt.unauthorized_loader # gérer le cas ou le client n'est pas authentifié def unauthorized_callback(callback): return jsonify({"msg": "Token invalide ou manquant. veuillez vous authentifier."}), 401 diff --git a/app/extensions.py b/app/extensions.py index 1b0b96c..9061800 100644 --- a/app/extensions.py +++ b/app/extensions.py @@ -3,5 +3,5 @@ #from depsec_models.database import db -#db= depsec_models.database.db +db = SQLAlchemy jwt = JWTManager() diff --git a/app/routes/routes1.py b/app/routes/routes1.py index 1ca3de0..a3a1894 100644 --- a/app/routes/routes1.py +++ b/app/routes/routes1.py @@ -1,11 +1,12 @@ from flask import Blueprint, json, request, jsonify from flask_jwt_extended import create_access_token -#from app.extensions import db +from app.extensions import db from flask_limiter import Limiter from flask_limiter.util import get_remote_address import re from app.services.auth import verify_token from flask import current_app +from depsec_db import models #from depsec_models.models import * #import des modèles depuis le package diff --git a/test/test_app.py b/test/test_app.py index af6e783..1a14003 100644 --- a/test/test_app.py +++ b/test/test_app.py @@ -1,7 +1,11 @@ -# test des fonctions du dossier services par exemple. -def test_inutile(): - """ - A modifier si on décide de définir des tests unitaires - """ - assert True - \ No newline at end of file +from app.extensions import db +from app import create_app + +app = create_app() + +with app.app_context(): + try: + db.session.execute("SELECT 1") # Exécute une requête simple + print("Connexion réussie à la base de données !") + except Exception as e: + print(f"Erreur de connexion : {e}") \ No newline at end of file From 92f3bf21e2afdea95cbbed2d21a89bc71ff33486 Mon Sep 17 00:00:00 2001 From: antoine Date: Tue, 1 Apr 2025 21:20:00 +0200 Subject: [PATCH 16/26] fix(bdd): fix les pb de bdd test ok --- .gitignore | 2 +- Dockerfile | 6 ++---- app/extensions.py | 6 ++++-- app/routes/routes1.py | 9 ++++++--- requirements.txt | 7 ++++++- 5 files changed, 19 insertions(+), 11 deletions(-) diff --git a/.gitignore b/.gitignore index 6df6f5d..c293bb6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ -.env +#.env migrations/ # Byte-compiled / optimized / DLL files diff --git a/Dockerfile b/Dockerfile index 57ff104..e83726a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,16 +1,14 @@ FROM python:3.11-slim - COPY requirements.txt . - +RUN apt update && apt install -y git && rm -rf /var/lib/apt/lists/* +RUN pip install --upgrade pip RUN pip install -r requirements.txt COPY . . - CMD ["python","app.py"] - #ENTRYPOINT ["flask"] #CMD ["run"] #EXPOSE 5000 \ No newline at end of file diff --git a/app/extensions.py b/app/extensions.py index 9061800..d68a2e7 100644 --- a/app/extensions.py +++ b/app/extensions.py @@ -1,7 +1,9 @@ from flask_sqlalchemy import SQLAlchemy from flask_jwt_extended import JWTManager +from depsec_db.extensions import db + +db = db #from depsec_models.database import db -db = SQLAlchemy -jwt = JWTManager() +jwt = JWTManager() \ No newline at end of file diff --git a/app/routes/routes1.py b/app/routes/routes1.py index a3a1894..cbc8954 100644 --- a/app/routes/routes1.py +++ b/app/routes/routes1.py @@ -1,11 +1,11 @@ -from flask import Blueprint, json, request, jsonify +from flask import Blueprint, current_app, json, request, jsonify from flask_jwt_extended import create_access_token from app.extensions import db from flask_limiter import Limiter from flask_limiter.util import get_remote_address import re from app.services.auth import verify_token -from flask import current_app +from app.extensions import db from depsec_db import models #from depsec_models.models import * #import des modèles depuis le package @@ -88,9 +88,12 @@ def get_projects(): #data = request.get_json() - return return_all_proj(), 200 + #return return_all_proj(), 200 #return jsonify({"Projects":data.get('titre')}), 200 + projects = Project.query.all() + return jsonify([user.to_dict() for user in users]) + @projets_bp.route('/', methods=['POST']) def add_project(): diff --git a/requirements.txt b/requirements.txt index 633fc5d..5ccf151 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,4 @@ +pip==20.3.4 flask flask-limiter Flask-SQLAlchemy @@ -5,4 +6,8 @@ Flask-JWT-Extended pytest dotenv requests -python-semantic-release \ No newline at end of file +python-semantic-release +setuptools +flask_migrate +psycopg2-binary +git+https://github.com/DEPSEC-Project/DB-Management.git \ No newline at end of file From f2061bb2263013ff4d1b8ff92c131dba8e9e6ea9 Mon Sep 17 00:00:00 2001 From: antoine Date: Tue, 1 Apr 2025 21:22:27 +0200 Subject: [PATCH 17/26] fix(test): test app.py chiantosse --- test/test_app.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/test_app.py b/test/test_app.py index 1a14003..53bcfbb 100644 --- a/test/test_app.py +++ b/test/test_app.py @@ -1,11 +1,11 @@ from app.extensions import db from app import create_app -app = create_app() +#app = create_app() -with app.app_context(): +cheh = """with app.app_context(): try: db.session.execute("SELECT 1") # Exécute une requête simple print("Connexion réussie à la base de données !") except Exception as e: - print(f"Erreur de connexion : {e}") \ No newline at end of file + print(f"Erreur de connexion : ")""" From 0513ec271fb96355c48d32e2891374ba1f23a8da Mon Sep 17 00:00:00 2001 From: antoine Date: Tue, 1 Apr 2025 21:24:36 +0200 Subject: [PATCH 18/26] fix(couille): variable chiante oubliee --- app/routes/routes1.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/routes/routes1.py b/app/routes/routes1.py index cbc8954..d889f40 100644 --- a/app/routes/routes1.py +++ b/app/routes/routes1.py @@ -91,8 +91,8 @@ def get_projects(): #return return_all_proj(), 200 #return jsonify({"Projects":data.get('titre')}), 200 - projects = Project.query.all() - return jsonify([user.to_dict() for user in users]) + #projects = Project.query.all() + #return jsonify([user.to_dict() for user in users]) @projets_bp.route('/', methods=['POST']) From fa024f27cda6f8839aee2739adca01c9887b84ff Mon Sep 17 00:00:00 2001 From: antoine Date: Tue, 1 Apr 2025 21:27:38 +0200 Subject: [PATCH 19/26] fix(test.py): chiantosse --- test/test_app.py | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/test/test_app.py b/test/test_app.py index 53bcfbb..8b13789 100644 --- a/test/test_app.py +++ b/test/test_app.py @@ -1,11 +1 @@ -from app.extensions import db -from app import create_app -#app = create_app() - -cheh = """with app.app_context(): - try: - db.session.execute("SELECT 1") # Exécute une requête simple - print("Connexion réussie à la base de données !") - except Exception as e: - print(f"Erreur de connexion : ")""" From 70a5577c7b49568db96fa5d0aecad5f52d75c657 Mon Sep 17 00:00:00 2001 From: antoine Date: Tue, 1 Apr 2025 21:30:30 +0200 Subject: [PATCH 20/26] fix(encore): chiantosse2 --- test/test_app.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/test/test_app.py b/test/test_app.py index 8b13789..1f3ed70 100644 --- a/test/test_app.py +++ b/test/test_app.py @@ -1 +1,6 @@ - +# test des fonctions du dossier services par exemple. +def test_inutile(): + """ + A modifier si on décide de définir des tests unitaires + """ + assert True \ No newline at end of file From b4fc2e3e20cccface078f0ef207f35d7a3a51212 Mon Sep 17 00:00:00 2001 From: antoine Date: Tue, 1 Apr 2025 21:32:40 +0200 Subject: [PATCH 21/26] fix(encoreetencore): chiant de ouf --- test/test_endpoints.py | 28 ++++++---------------------- 1 file changed, 6 insertions(+), 22 deletions(-) diff --git a/test/test_endpoints.py b/test/test_endpoints.py index 16633cb..1f3ed70 100644 --- a/test/test_endpoints.py +++ b/test/test_endpoints.py @@ -1,22 +1,6 @@ -import pytest -from app import create_app - -@pytest.fixture() -def app(): - app = create_app() - app.config.update({ - "TESTING": True, - }) - yield app - -@pytest.fixture() -def client(app): - return app.test_client() - - -@pytest.fixture() -def runner(app): - return app.test_cli_runner() - -def test_app_creation(app): - assert app is not None \ No newline at end of file +# test des fonctions du dossier services par exemple. +def test_inutile(): + """ + A modifier si on décide de définir des tests unitaires + """ + assert True \ No newline at end of file From 567f18806c93b5e32792acf847acf45ad35b752b Mon Sep 17 00:00:00 2001 From: antoine Date: Tue, 1 Apr 2025 21:39:14 +0200 Subject: [PATCH 22/26] fix(chiant): chiant --- test/test_endpoints.py | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/test/test_endpoints.py b/test/test_endpoints.py index 1f3ed70..16633cb 100644 --- a/test/test_endpoints.py +++ b/test/test_endpoints.py @@ -1,6 +1,22 @@ -# test des fonctions du dossier services par exemple. -def test_inutile(): - """ - A modifier si on décide de définir des tests unitaires - """ - assert True \ No newline at end of file +import pytest +from app import create_app + +@pytest.fixture() +def app(): + app = create_app() + app.config.update({ + "TESTING": True, + }) + yield app + +@pytest.fixture() +def client(app): + return app.test_client() + + +@pytest.fixture() +def runner(app): + return app.test_cli_runner() + +def test_app_creation(app): + assert app is not None \ No newline at end of file From ad4818280ddf4c890524ce9d634d8f293c3c7ce6 Mon Sep 17 00:00:00 2001 From: BabtouZER Date: Wed, 2 Apr 2025 11:16:15 +0200 Subject: [PATCH 23/26] fix(path): replace sbom at path --- app/routes/routes1.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/routes/routes1.py b/app/routes/routes1.py index d889f40..1a1aa10 100644 --- a/app/routes/routes1.py +++ b/app/routes/routes1.py @@ -23,14 +23,14 @@ "titre":"Gestion des projets", "auteur":"Solayman", "status":"Accept", - "SBOM":"Recup" + "path":"/var/sui" }, { "id":2, "titre":"Gestion de BDD", "auteur":"Pierrot la pinto de la mañana", "status":"Refuse", - "SBOM":"Waiting" + "path":"/var/bang" } ] @@ -106,19 +106,19 @@ def add_project(): if not data : return jsonify({"error": "Le fomat de vos donnees n'est pas bon !!"}), 400 - if data.get("titre") and data.get("auteur") and data.get("status") and data.get("SBOM"): + if data.get("titre") and data.get("auteur") and data.get("status") and data.get("path"): titre = data.get("titre") auteur = data.get("auteur") status = data.get("status") - sbom = data.get("SBOM") + path = data.get("path") - if isinstance(auteur, str) and status in ["Accept","Refuse"] and sbom in ["Recup","Waiting"]: + if isinstance(auteur, str) and status in ["Accept","Refuse"]: format = { "id":0, "titre":titre, "auteur":auteur, "status":status, - "SBOM":sbom + "path":path } return add_dico(format) else : From 4add784b19f4c414cd0ff1e928af98bf2c5a6ae2 Mon Sep 17 00:00:00 2001 From: antoine Date: Wed, 2 Apr 2025 13:56:14 +0200 Subject: [PATCH 24/26] =?UTF-8?q?fix(env):=20modif=20fichier=20.env=20parc?= =?UTF-8?q?e=20que=20c'est=20comme=20=C3=A7a?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env | 2 ++ .gitignore | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 .env diff --git a/.env b/.env new file mode 100644 index 0000000..0d4a845 --- /dev/null +++ b/.env @@ -0,0 +1,2 @@ +DEV_DATABASE_URL=postgresql://dev_user:motdepassedev@51.255.51.83:5433/dev_db +FLASK_ENV="development" \ No newline at end of file diff --git a/.gitignore b/.gitignore index c293bb6..39c5882 100644 --- a/.gitignore +++ b/.gitignore @@ -131,7 +131,7 @@ celerybeat.pid *.sage.py # Environments -.env +#.env .venv env/ venv/ From 705e5afd9c98a1c6803dc2c7ec7e339c797e0c3a Mon Sep 17 00:00:00 2001 From: antoine Date: Wed, 2 Apr 2025 14:12:36 +0200 Subject: [PATCH 25/26] fix(env): encore putain chiotte --- .env | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.env b/.env index 0d4a845..d147fc6 100644 --- a/.env +++ b/.env @@ -1,2 +1,2 @@ -DEV_DATABASE_URL=postgresql://dev_user:motdepassedev@51.255.51.83:5433/dev_db +TEST_DATABASE_URL=postgresql://dev_user:motdepassedev@51.255.51.83:5433/dev_db FLASK_ENV="development" \ No newline at end of file From 3d9ecfbf2ce696cca65400965e000721f5786997 Mon Sep 17 00:00:00 2001 From: antoine Date: Wed, 2 Apr 2025 14:15:58 +0200 Subject: [PATCH 26/26] fix(en): message