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.
+
-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 :
-
-
-Il faut ensuite choisir le nom de votre nouveau repo, copier les branches de la template puis créer le dépot.
-
-
-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
-
-
-
-## 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"])