Source code for backend.api.modules
# API-Endpunkte für Studienmodule (CRUD)
# Hier werden nur Anfragen entgegengenommen und an die Datenbank weitergeleitet
# Keine Business-Logik — die kommt später in services/
from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.orm import Session
from pydantic import BaseModel
from typing import Optional
from backend.models.database import get_db
from backend.models.module import Module
# Router-Objekt — wird in main.py registriert
router = APIRouter(prefix="/api/modules", tags=["modules"])
# --- Pydantic Schemas: Definieren was rein und raus geht ---
# Schema für das Erstellen eines Moduls (was der User sendet)
[docs]
class ModuleCreate(BaseModel):
name: str
description: Optional[str] = ""
color: Optional[str] = "#4a90d9"
# Schema für das Aktualisieren eines Moduls
[docs]
class ModuleUpdate(BaseModel):
name: Optional[str] = None
description: Optional[str] = None
color: Optional[str] = None
# --- Endpunkte ---
# GET /api/modules — Alle Module auflisten
@router.get("/")
def get_modules(db: Session = Depends(get_db)):
modules = db.query(Module).all()
return modules
# POST /api/modules — Neues Modul erstellen
@router.post("/")
def create_module(data: ModuleCreate, db: Session = Depends(get_db)):
module = Module(name=data.name, description=data.description, color=data.color)
db.add(module)
db.commit()
db.refresh(module)
return module
# GET /api/modules/{id} — Ein bestimmtes Modul abrufen
@router.get("/{module_id}")
def get_module(module_id: int, db: Session = Depends(get_db)):
module = db.query(Module).filter(Module.id == module_id).first()
if not module:
raise HTTPException(status_code=404, detail="Modul nicht gefunden")
return module
# PUT /api/modules/{id} — Modul aktualisieren
@router.put("/{module_id}")
def update_module(module_id: int, data: ModuleUpdate, db: Session = Depends(get_db)):
module = db.query(Module).filter(Module.id == module_id).first()
if not module:
raise HTTPException(status_code=404, detail="Modul nicht gefunden")
# Nur Felder aktualisieren die mitgeschickt wurden
if data.name is not None:
module.name = data.name
if data.description is not None:
module.description = data.description
if data.color is not None:
module.color = data.color
db.commit()
db.refresh(module)
return module
# DELETE /api/modules/{id} — Modul löschen (inkl. aller Dokumente)
@router.delete("/{module_id}")
def delete_module(module_id: int, db: Session = Depends(get_db)):
module = db.query(Module).filter(Module.id == module_id).first()
if not module:
raise HTTPException(status_code=404, detail="Modul nicht gefunden")
db.delete(module)
db.commit()
return {"message": f"Modul '{module.name}' gelöscht"}