From c71d62af380674e0ace942f0a618f4a276dee5f8 Mon Sep 17 00:00:00 2001 From: BabtouZER <166703741+BabtouZER@users.noreply.github.com> Date: Sun, 23 Mar 2025 12:14:26 +0100 Subject: [PATCH 01/16] Update README.md --- README.md | 135 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 71 insertions(+), 64 deletions(-) diff --git a/README.md b/README.md index dd48910..1082a2b 100644 --- a/README.md +++ b/README.md @@ -1,74 +1,81 @@ -# DEPSEC-TemplateAPI +# Project Management API -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. +###### 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. -## 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 +## Arborescense +Voici l'arborescence de notre API, avec en commentaire pour chaque dossier/fichier : -- /test/tutu qui gère les requêtes POST +``` +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 +``` + +## Lists + +### Unordered + +* Item 1 +* Item 2 +* Item 2a +* Item 2b + * Item 3a + * Item 3b + +### Ordered + +1. Item 1 +2. Item 2 +3. Item 3 + 1. Item 3a + 2. Item 3b + +## Images -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. +![This is an alt text.](/image/sample.webp "This is a sample image.") -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 +## Links -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 +You may be using [Markdown Live Preview](https://markdownlivepreview.com/). + +## Blockquotes + +> Markdown is a lightweight markup language with plain-text-formatting syntax, created in 2004 by John Gruber with Aaron Swartz. +> +>> Markdown is often used to format readme files, for writing messages in online discussion forums, and to create rich text using a plain text editor. + +## Tables + +| Left columns | Right columns | +| ------------- |:-------------:| +| left foo | right foo | +| left bar | right bar | +| left baz | right baz | + +## Blocks of code -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 +let message = 'Hello world'; +alert(message); ``` -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 -``` +## Inline code + +This web site is using `markedjs/marked`. + From 8354d6051aa297da1ce4aff1a3a8d7e75d183f35 Mon Sep 17 00:00:00 2001 From: BabtouZER <166703741+BabtouZER@users.noreply.github.com> Date: Sun, 30 Mar 2025 15:15:12 +0200 Subject: [PATCH 02/16] Update README.md --- README.md | 53 ----------------------------------------------------- 1 file changed, 53 deletions(-) diff --git a/README.md b/README.md index 1082a2b..2dd7f7f 100644 --- a/README.md +++ b/README.md @@ -26,56 +26,3 @@ project_management_API/ ├── Dockerfile # Fichier de l'image docker du microservice └── README.md # Documentation de l'API ``` - -## Lists - -### Unordered - -* Item 1 -* Item 2 -* Item 2a -* Item 2b - * Item 3a - * Item 3b - -### Ordered - -1. Item 1 -2. Item 2 -3. Item 3 - 1. Item 3a - 2. Item 3b - -## Images - -![This is an alt text.](/image/sample.webp "This is a sample image.") - -## Links - -You may be using [Markdown Live Preview](https://markdownlivepreview.com/). - -## Blockquotes - -> Markdown is a lightweight markup language with plain-text-formatting syntax, created in 2004 by John Gruber with Aaron Swartz. -> ->> Markdown is often used to format readme files, for writing messages in online discussion forums, and to create rich text using a plain text editor. - -## Tables - -| Left columns | Right columns | -| ------------- |:-------------:| -| left foo | right foo | -| left bar | right bar | -| left baz | right baz | - -## Blocks of code - -``` -let message = 'Hello world'; -alert(message); -``` - -## Inline code - -This web site is using `markedjs/marked`. - From e5f18caaa6760d2747601bd8f4f884dac8b93496 Mon Sep 17 00:00:00 2001 From: antoine Date: Mon, 31 Mar 2025 18:20:17 +0200 Subject: [PATCH 03/16] =?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 04/16] 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 05/16] 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 06/16] 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 07/16] 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 08/16] 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 09/16] 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 10/16] 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 11/16] 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 12/16] =?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 13/16] 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 14/16] fix(en): message From e4f263a401e1032e5d12798007beb498fd61c790 Mon Sep 17 00:00:00 2001 From: antoine Date: Wed, 2 Apr 2025 17:18:53 +0200 Subject: [PATCH 15/16] =?UTF-8?q?fix(db=5Fconnexion):=20modification=20des?= =?UTF-8?q?=20fichiers=20pour=20pouvoir=20se=20connecter=20=C3=A0=20la=20B?= =?UTF-8?q?DD=20test=C3=A9=20avec=20curl?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env | 2 +- app/__init__.py | 2 +- app/routes/routes1.py | 18 +++++++++--------- requirements.txt | 2 +- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/.env b/.env index d147fc6..0d4a845 100644 --- a/.env +++ b/.env @@ -1,2 +1,2 @@ -TEST_DATABASE_URL=postgresql://dev_user:motdepassedev@51.255.51.83:5433/dev_db +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/app/__init__.py b/app/__init__.py index 3b472ee..3258753 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -4,7 +4,7 @@ import os from dotenv import load_dotenv -__version__ = "1.0.1" # géré automatiquement par la CI +__version__ = "0.1.1" # géré automatiquement par la CI load_dotenv(".env") diff --git a/app/routes/routes1.py b/app/routes/routes1.py index 1a1aa10..5672fb2 100644 --- a/app/routes/routes1.py +++ b/app/routes/routes1.py @@ -6,7 +6,7 @@ import re from app.services.auth import verify_token from app.extensions import db -from depsec_db import models +from depsec_db.models import Project #from depsec_models.models import * #import des modèles depuis le package @@ -20,15 +20,15 @@ projects = [ { "id":1, + "auteur_id":3, "titre":"Gestion des projets", - "auteur":"Solayman", "status":"Accept", "path":"/var/sui" }, { "id":2, + "auteur_id":8, "titre":"Gestion de BDD", - "auteur":"Pierrot la pinto de la mañana", "status":"Refuse", "path":"/var/bang" } @@ -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([project.to_dict() for project in projects]) @projets_bp.route('/', methods=['POST']) @@ -106,17 +106,17 @@ 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("path"): + if data.get("titre") and data.get("auteur_id") and data.get("status") and data.get("path"): titre = data.get("titre") - auteur = data.get("auteur") + auteur_id = data.get("auteur_id") status = data.get("status") path = data.get("path") - if isinstance(auteur, str) and status in ["Accept","Refuse"]: + if isinstance(auteur_id, int) and status in ["Accept","Refuse"]: format = { "id":0, + "auteur":auteur_id, "titre":titre, - "auteur":auteur, "status":status, "path":path } diff --git a/requirements.txt b/requirements.txt index 5ccf151..a95b8e7 100644 --- a/requirements.txt +++ b/requirements.txt @@ -10,4 +10,4 @@ python-semantic-release setuptools flask_migrate psycopg2-binary -git+https://github.com/DEPSEC-Project/DB-Management.git \ No newline at end of file +git+https://github.com/DEPSEC-Project/DB-Management.git@main \ No newline at end of file From 1e64c804a32df7347f84f7dd9c979748f57e0115 Mon Sep 17 00:00:00 2001 From: antoine Date: Wed, 2 Apr 2025 21:32:25 +0200 Subject: [PATCH 16/16] fix(bdd_methods): add all methods --- app/routes/routes1.py | 141 +++++++++++++++++++----------------------- 1 file changed, 63 insertions(+), 78 deletions(-) diff --git a/app/routes/routes1.py b/app/routes/routes1.py index 5672fb2..edcd219 100644 --- a/app/routes/routes1.py +++ b/app/routes/routes1.py @@ -14,67 +14,55 @@ 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, - "auteur_id":3, - "titre":"Gestion des projets", - "status":"Accept", - "path":"/var/sui" - }, - { - "id":2, - "auteur_id":8, - "titre":"Gestion de BDD", - "status":"Refuse", - "path":"/var/bang" - } -] - +# ------------------------------------------------------------------------------------------------------------ # def return_all_proj(): - return projects + return Project.query.all() def return_project(proj): - for p in projects: + for p in return_all_proj(): if proj in p.values(): return p - -def add_dico(dico): +def return_project_by_id(id): + return Project.query.get(id) - for d in projects: - if d["titre"] == dico["titre"]: - return jsonify({"error": f"Le nom de projet {d['titre']} existe deja !"}), 400 +def add_dico(dico): + projects = return_all_proj() + if projects != []: + 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 + max_id = max([p.id for p in projects]) if projects else 0 dico['id'] = max_id + 1 - projects.append(dico) + + new_project = Project( + id = dico['id'], + auteur_id=dico["auteur_id"], + titre=dico["titre"], + status=dico["status"], + path=dico["path"] + ) + + db.session.add(new_project) + db.session.commit() - return return_all_proj() - #save_json(file_path, data) - #return jsonify(load_json(file_path)), 200 + return jsonify({"message": f"Projet {new_project.titre} ajoute avec succes"}), 200 def del_dico(id): - global projects + project = return_project_by_id(id) - try: - new_data = [item for item in projects if int(item.get("id")) != int(id)] - 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 + if not project: + return jsonify({"error": f"Projet avec l'ID {id} non trouve"}), 404 - projects = new_data - return return_all_proj() - #return jsonify(load_json(file_path)), 200 + db.session.delete(project) + db.session.commit() + + return jsonify({"message": f"Projet avec l'ID {id} supprime avec succes"}), 200 # ------------------------------------------------------------------------------------------------------------ # @@ -82,49 +70,46 @@ def del_dico(id): @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 - - - #data = request.get_json() - - - #return return_all_proj(), 200 - #return jsonify({"Projects":data.get('titre')}), 200 - - projects = Project.query.all() - return jsonify([project.to_dict() for project in projects]) + return jsonify({"msg": "Token invalide / Utilisateur non autorise"}), 401 + + return jsonify([project.to_dict() for project in Project.query.all()]) +@projets_bp.route('/', methods=['GET']) +def get_project_by_id(project_id): + project = Project.query.get(project_id) + if not project: + return jsonify({'error': 'Projet non trouvé'}), 404 + return jsonify(project.to_dict()), 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 - + if verify_token() == False and current_app.config["FLASK_ENV"] != "development": + return jsonify({"msg": "Token invalide / Utilisateur non autorise"}), 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_id") and data.get("status") and data.get("path"): - titre = data.get("titre") - auteur_id = data.get("auteur_id") - status = data.get("status") - path = data.get("path") - - if isinstance(auteur_id, int) and status in ["Accept","Refuse"]: - format = { - "id":0, - "auteur":auteur_id, - "titre":titre, - "status":status, - "path":path - } - return add_dico(format) - else : - return jsonify({'error': 'Parametres aux mauvais formats !'}), 400 - else : + if not data: + return jsonify({"error": "Le format de vos donnees n'est pas bon !!"}), 400 + + required_fields = ["titre", "auteur_id", "status", "path"] + if not all(field in data for field in required_fields): return jsonify({'error': 'Parametres manquants'}), 400 + + titre = data["titre"] + auteur_id = data["auteur_id"] + status = data["status"] + path = data["path"] + + if isinstance(auteur_id, int) and status in ["Accept", "Refuse"]: + project_data = { + "auteur_id": auteur_id, + "titre": titre, + "status": status, + "path": path + } + return add_dico(project_data) + else: + return jsonify({'error': 'Parametres aux mauvais formats !'}), 400 @projets_bp.route("/", methods=["DELETE"])