feat: création de l'API /api/setup avec pydantic pour la création du compte Admin

This commit is contained in:
xavier committed 2026-10-06 23:23:47 +02:00
1 parent b8d9cd5520
commit 13abdc68af
2 files changed
+45 -6

No files matched your search

+39 -6
View File
@@ -1,12 +1,14 @@
from fastapi import FastAPI, Depends from fastapi import FastAPI, Depends, HTTPException, status
from fastapi.responses import RedirectResponse from fastapi.responses import RedirectResponse
from sqlalchemy.orm import Session from sqlalchemy.orm import Session
# Importation de nos modules locaux # Importation de nos modules locaux
from .database import engine, Base, get_db from .database import engine, Base, get_db
from .models import User from .models import User
from .auth import get_password_hash, generate_totp_secret, get_totp_uri
from .schemas import AdminCreate
# Création des tables dans la base de données (si elles n'existent pas) # Création des tables dans la base de données
Base.metadata.create_all(bind=engine) Base.metadata.create_all(bind=engine)
app = FastAPI(title="AETHAS38 - Orchestrateur Multi-IA") app = FastAPI(title="AETHAS38 - Orchestrateur Multi-IA")
@@ -18,21 +20,52 @@ def is_setup_required(db: Session) -> bool:
@app.get("/") @app.get("/")
def read_root(db: Session = Depends(get_db)): def read_root(db: Session = Depends(get_db)):
"""Route principale : redirige selon l'état de l'installation."""
if is_setup_required(db): if is_setup_required(db):
return RedirectResponse(url="/setup") return RedirectResponse(url="/setup")
return RedirectResponse(url="/login") return RedirectResponse(url="/login")
@app.get("/setup") @app.get("/setup")
def setup_page(db: Session = Depends(get_db)): def setup_page(db: Session = Depends(get_db)):
"""Affiche l'assistant d'installation (Frontend Vue.js à venir)."""
if not is_setup_required(db): if not is_setup_required(db):
return RedirectResponse(url="/login") return RedirectResponse(url="/login")
return {"message": "Assistant d'installation AETHAS38. Veuillez créer le compte Administrateur."} return {"message": "Assistant d'installation AETHAS38. Veuillez créer le compte Administrateur."}
@app.get("/login") @app.get("/login")
def login_page(db: Session = Depends(get_db)): def login_page(db: Session = Depends(get_db)):
"""Affiche la page de connexion sécurisée."""
if is_setup_required(db): if is_setup_required(db):
return RedirectResponse(url="/setup") return RedirectResponse(url="/setup")
return {"message": "Page de connexion (Frontend Vue.js à venir)."} return {"message": "Page de connexion."}
@app.post("/api/setup")
def create_admin(admin_data: AdminCreate, db: Session = Depends(get_db)):
"""Reçoit les données du frontend, crée l'admin et retourne le QR Code 2FA."""
if not is_setup_required(db):
raise HTTPException(
status_code=status.HTTP_403_FORBIDDEN,
detail="L'installation a déjà été effectuée."
)
# Sécurisation des accès
hashed_pw = get_password_hash(admin_data.password)
totp_secret = generate_totp_secret()
new_admin = User(
email=admin_data.email,
username=admin_data.username,
hashed_password=hashed_pw,
totp_secret=totp_secret,
is_admin=True
)
db.add(new_admin)
db.commit()
db.refresh(new_admin)
# Génération de l'URI pour l'affichage du QR Code côté frontend
totp_uri = get_totp_uri(totp_secret, new_admin.username)
return {
"message": "Administrateur créé avec succès.",
"totp_secret": totp_secret,
"totp_uri": totp_uri
}
+6
View File
@@ -0,0 +1,6 @@
from pydantic import BaseModel, EmailStr
class AdminCreate(BaseModel):
email: EmailStr
username: str
password: str