From d41edde9bb6f3115e01451b942bdcb5abd1f6840 Mon Sep 17 00:00:00 2001 From: Xavier Date: Wed, 7 Oct 2026 08:17:41 +0200 Subject: [PATCH] =?UTF-8?q?feat:=20cr=C3=A9ation=20de=20l'API=20de=20gesti?= =?UTF-8?q?on=20des=20projets=20et=20liaison=20dynamique=20avec=20le=20Das?= =?UTF-8?q?hboard?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/main.py | 38 ++++++++++++++++++++++++- backend/schemas.py | 20 +++++++++++-- frontend/dashboard.html | 63 ++++++++++++++++++++++++++++------------- 3 files changed, 99 insertions(+), 22 deletions(-) diff --git a/backend/main.py b/backend/main.py index 46216ab..9722c8e 100644 --- a/backend/main.py +++ b/backend/main.py @@ -10,6 +10,11 @@ from .models import User from .auth import get_password_hash, generate_totp_secret, get_totp_uri, verify_password, verify_totp, create_access_token, verify_token from .schemas import AdminCreate, LoginRequest +# MAJ BDD +from typing import List +from .schemas import AdminCreate, LoginRequest, ProjectCreate, ProjectResponse +from .models import User, Project + # Création des tables dans la base de données Base.metadata.create_all(bind=engine) @@ -137,4 +142,35 @@ def dashboard(request: Request): if not os.path.exists(frontend_path): raise HTTPException(status_code=404, detail="Interface du tableau de bord introuvable.") - return FileResponse(frontend_path) \ No newline at end of file + return FileResponse(frontend_path) + +# --- GESTION DES PROJETS --- + +def get_current_user(request: Request, db: Session = Depends(get_db)): + """Extrait l'utilisateur actuel à partir du cookie de session JWT.""" + token = request.cookies.get("session_token") + if not token: + raise HTTPException(status_code=401, detail="Non authentifié") + + payload = verify_token(token) + if not payload: + raise HTTPException(status_code=401, detail="Session expirée") + + user = db.query(User).filter(User.username == payload.get("sub")).first() + if not user: + raise HTTPException(status_code=401, detail="Utilisateur introuvable") + return user + +@app.get("/api/projects", response_model=List[ProjectResponse]) +def get_projects(db: Session = Depends(get_db), current_user: User = Depends(get_current_user)): + """Récupère tous les projets de l'utilisateur connecté.""" + return db.query(Project).filter(Project.user_id == current_user.id).order_by(Project.created_at.desc()).all() + +@app.post("/api/projects", response_model=ProjectResponse) +def create_project(project: ProjectCreate, db: Session = Depends(get_db), current_user: User = Depends(get_current_user)): + """Crée un nouveau projet pour l'utilisateur connecté.""" + new_project = Project(title=project.title, user_id=current_user.id) + db.add(new_project) + db.commit() + db.refresh(new_project) + return new_project \ No newline at end of file diff --git a/backend/schemas.py b/backend/schemas.py index 3f7aafa..6c05cf6 100644 --- a/backend/schemas.py +++ b/backend/schemas.py @@ -1,12 +1,28 @@ from pydantic import BaseModel, EmailStr +from datetime import datetime +from typing import Optional class AdminCreate(BaseModel): email: EmailStr username: str password: str -# NOUVEAU : Schéma pour la connexion class LoginRequest(BaseModel): username: str password: str - totp_code: str \ No newline at end of file + totp_code: str + +# --- NOUVEAU : Schémas pour les Projets --- +class ProjectBase(BaseModel): + title: str + +class ProjectCreate(ProjectBase): + pass + +class ProjectResponse(ProjectBase): + id: int + created_at: datetime + is_pinned: bool + + class Config: + from_attributes = True \ No newline at end of file diff --git a/frontend/dashboard.html b/frontend/dashboard.html index ffcd78b..6c88a04 100644 --- a/frontend/dashboard.html +++ b/frontend/dashboard.html @@ -4,7 +4,6 @@ AETHAS38 - Dashboard - - -