feat: création de l'API de gestion des projets et liaison dynamique avec le Dashboard
Build and Push Docker Image / build-and-push (push) Successful in 39s
Build and Push Docker Image / build-and-push (push) Successful in 39s
This commit is contained in:
1 parent
fd53c75dee
commit
d41edde9bb
3 files changed
+99
-22
No files matched your search
+37
-1
@@ -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)
|
||||
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
|
||||
+18
-2
@@ -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
|
||||
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
|
||||
Reference in new issue
Block a user