No description
- Python 69.2%
- CSS 30.3%
- Mako 0.5%
| .kilo | ||
| .kilocode | ||
| migrations | ||
| source | ||
| static | ||
| .gitignore | ||
| AGENTS.md | ||
| alembic.ini | ||
| main.py | ||
| pyproject.toml | ||
| README.md | ||
| requirements.txt | ||
EW-Sys API
Backend-API für EW-Sys auf Basis von FastAPI, SQLModel und PostgreSQL. Die Anwendung bildet Authentifizierung, Benutzerverwaltung sowie CRUD-Endpunkte für Artikel, Hersteller, Projekte, Anfragen und Rückfragen ab.
Überblick
- JWT-basierte Authentifizierung mit Access- und Refresh-Token
- Invite-Flow für neue Benutzer und Passwort-Reset durch Manager
- Rollen- und gruppenbasierte Zugriffssteuerung
- CRUD-Endpunkte für Benutzer, Artikel, Hersteller, Projekte, Anfragen und Rückfragen
- PDF-Anhänge für Anfragen
- QR-Code-Erzeugung für Artikel
- Status-Endpunkt mit Datenbank-Check und Uptime
- Swagger UI mit eigener Darkmode-CSS
Technologie-Stack
- Python 3.10+
- FastAPI
- SQLModel / SQLAlchemy
- PostgreSQL mit
asyncpg - PyJWT
- Pydantic Settings
- qrcode
- Pillow
- pwdlib mit Argon2
- Alembic
- Ruff
Projektstruktur
main.py: FastAPI-App, Router-Registrierung,/status, eigene Swagger-UIsource/auth.py: Login, Passwort-Setup, Token-Refresh, Logoutsource/users.py: Benutzerverwaltung und Invite-/Reset-Flowsource/items.py: Artikelverwaltung und QR-Code-Endpunktesource/manufacturers.py: Herstellerverwaltungsource/projects.py: Projektverwaltungsource/requests.py: Anfragenverwaltung und PDF-Anhängesource/inquiries.py: Rückfragenverwaltungsource/models.py: SQLModel-Modelle und Enumssource/rbac.py: Authentifizierung und Rollenprüfungsource/config.py: Laden und Validieren der Umgebungsvariablensource/database.py: Async-Engine, Session-Handling, Verbindungsprüfung
Voraussetzungen
- Python 3.10 oder neuer
- PostgreSQL
- Eine
.env-Datei im Projektverzeichnis
Konfiguration
Pflichtvariablen in .env:
DATABASE_URL=postgresql://user:passwort@localhost:5432/ewsys
SECRET_KEY=ein-langes-geheimes-token
ACCESS_TOKEN_EXPIRE_MINUTES=30
REFRESH_TOKEN_EXPIRE_MINUTES=10080
Optionale Variablen:
VERSION=0.3
ENVIRONMENT=development
Hinweise:
DATABASE_URLwird automatisch vonpostgresql://...aufpostgresql+asyncpg://...umgeschrieben.CORS_ALLOW_ORIGINSist standardmaessig auf[*]gesetzt.- Die Anwendung erwartet statische Dateien unter
static/, unter anderem fuer Favicon und Swagger-Darkmode.
Rollenmodell
Hierarchische Rollenstufen:
| Stufe | Rolle |
|---|---|
| 1 | Azubi |
| 2 | Geselle |
| 3 | Einkauf |
| 4 | Abteilungsleiter |
| 5 | Admin |
Gruppen für Berechtigungen:
MANAGER: Abteilungsleiter, AdminEINKAUF: Einkauf, Abteilungsleiter, AdminADMIN: nur Admin
Die Rollenprüfung erfolgt je nach Endpunkt über Mindeststufe, Gruppe oder beides.
Authentifizierung und Invite-Flow
Neue Benutzer können ohne gesetztes Passwort angelegt werden. Der typische Ablauf ist:
- Manager erstellt einen Benutzer über
POST /users/. - Die Antwort enthält einen
invite_token. - Der Benutzer setzt sein Passwort über
POST /auth/setup. - Danach erfolgt der Login ueber
POST /auth/login. - Access-Tokens können über
POST /auth/refresherneuert werden. - Refresh-Tokens werden über
POST /auth/logoutinvalidiert.
Wichtige Sicherheitsdetails aus der Implementierung:
- Login löscht vorhandene Refresh-Tokens des Benutzers vor dem Ausstellen eines neuen Tokens.
- Refresh-Tokens werden nur gehasht in der Datenbank gespeichert.
- Invite-Tokens sind JWTs mit
type="invite"und werden zusätzlich roh im Benutzerdatensatz geprüft.
Endpunkte nach Bereich
Status
GET /status: API-Status, Version, Environment, Uptime und Datenbankstatus
Auth
POST /auth/login: Login per OAuth2-Form (username,password)POST /auth/setup: Passwort über Invite-Token setzenPOST /auth/refresh: neues Access- und Refresh-Token anfordernPOST /auth/logout: Refresh-Token invalidieren
Benutzer
GET /users/me: aktueller BenutzerPOST /users/: Benutzer anlegen, nurMANAGERGET /users/: Benutzerliste, nurMANAGERDELETE /users/{user_id}: Benutzer loeschen, nurMANAGERPOST /users/{user_id}/reset: Passwort zurücksetzen und neuen Invite-Token erzeugen, nurMANAGER
Artikel
POST /items/: Artikel anlegenGET /items/: ArtikellisteGET /items/search: ArtikelsucheGET /items/{item_id}: einzelnen Artikel lesenPATCH /items/{item_id}: Artikel aktualisierenDELETE /items/{item_id}: Artikel loeschenGET /items/{item_id}/qrcode: QR-Code für Artikel als PNGGET /items/by-qr/{qr_uuid}: Artikel über QR-UUID abrufen
Hersteller
POST /manufacturers/: Hersteller anlegenGET /manufacturers/: HerstellerlisteGET /manufacturers/search: HerstellersucheGET /manufacturers/{manufacturer_id}: einzelnen Hersteller lesenPATCH /manufacturers/{manufacturer_id}: Hersteller aktualisierenDELETE /manufacturers/{manufacturer_id}: Hersteller loeschen
Projekte
POST /projects/: Projekt anlegenGET /projects/: ProjektlisteGET /projects/search: ProjektsucheGET /projects/{project_id}: einzelnes Projekt lesenPATCH /projects/{project_id}: Projekt aktualisierenDELETE /projects/{project_id}: Projekt loeschen
Anfragen
POST /requests/: Anfrage anlegenGET /requests/: AnfragelisteGET /requests/{request_id}: einzelne Anfrage lesenPATCH /requests/{request_id}: Anfrage aktualisierenDELETE /requests/{request_id}: Anfrage loeschenPOST /requests/{request_id}/attachments: PDF-Anhang hochladenGET /requests/{request_id}/attachments: Anhänge einer Anfrage auflistenGET /requests/{request_id}/attachments/{attachment_id}: PDF-Anhang herunterladenDELETE /requests/{request_id}/attachments/{attachment_id}: Anhang loeschen
Rückfragen
POST /inquiries/: Rückfrage anlegen, nur GruppeEINKAUFGET /inquiries/: RückfragenlisteGET /inquiries/{inquiry_id}: einzelne Rückfrage lesenPATCH /inquiries/{inquiry_id}: Rückfrage aktualisierenDELETE /inquiries/{inquiry_id}: Rückfrage löschen
Betriebsverhalten
/statusmeldet die Datenbank alsonlineoderoffline.- Uptime basiert auf der Startzeit der App in
main.py. - Es gibt laut Projektvorgaben kein Testframework; für Prüfungen dienen vor allem
/status,/testfalls vorhanden, und die Swagger UI.
Lizenz
Dieses Projekt steht unter der GPLv3.