134 lines
2.9 KiB
Markdown
134 lines
2.9 KiB
Markdown
|
||
Wichtel Generator – Backend
|
||
-
|
||
Backend-Service für eine Wichtel-Generator Web-App.
|
||
Dieses System stellt sicher, dass über mehrere Runden hinweg keine Wichtel-Paare doppelt vorkommen, solange noch neue Kombinationen mathematisch möglich sind.
|
||
|
||
Das Backend speichert alle Runden und Paarungen persistent in einer SQLite-Datenbank und stellt eine REST-API über FastAPI bereit.
|
||
|
||
----------------------FEATURES----------------------
|
||
-
|
||
-
|
||
Wiederholungsfreie Wichtelpaare
|
||
-------------------------------
|
||
Für die gleiche Teilnehmergruppe werden über mehrere Runden hinweg immer neue Paarungen generiert, solange es mathematisch möglich ist.
|
||
-
|
||
Mathematische Absicherung
|
||
-------------------------------
|
||
Die maximale Anzahl möglicher eindeutiger Runden wird über Derangements (Subfakultäten) berechnet.
|
||
-
|
||
Persistente Speicherung
|
||
-------------------------------
|
||
Alle Runden, Teilnehmer und Paarungen werden in SQLite gespeichert.
|
||
-
|
||
REST API (FastAPI)
|
||
-------------------------------
|
||
Optimiert für Integration in eine Web-App.
|
||
|
||
|
||
----------------------Grundidee----------------------
|
||
-
|
||
|
||
Wenn dieselbe Gruppe von Personen mehrfach wichtelt, sollen die Paare nicht wiederholt werden.
|
||
|
||
Dazu wird:
|
||
|
||
- Aus allen Teilnehmer-E-Mails ein Konstellations-Hash gebildet
|
||
|
||
- Diese Konstellation erhält einen oder mehrere Cycles
|
||
|
||
- In jedem Cycle werden so lange neue Runden erzeugt, bis alle möglichen Paarungen ausgeschöpft sind
|
||
|
||
- Danach wird automatisch ein neuer Cycle gestartet
|
||
|
||
|
||
----------------------Datenbank-Struktur----------------------
|
||
-
|
||
- ### CYCLES
|
||
|
||
Eine feste Teilnehmer-Konstellation (über Hash)
|
||
|
||
- ### ROUNDS
|
||
|
||
Eine einzelne Wichtelrunde innerhalb eines Cycles
|
||
|
||
- ### PARTICIPANTS
|
||
|
||
Teilnehmer einer bestimmten Runde
|
||
|
||
- ### PAIRS
|
||
Wer beschenkt wen in einer Runde
|
||
|
||
---
|
||
|
||
|
||
#### Die Datenbank erzwingt:
|
||
|
||
- kein Selbst-Wichteln
|
||
|
||
- kein doppelter Schenker
|
||
|
||
- kein doppelter Empfänger
|
||
|
||
|
||
----------------------API----------------------
|
||
-
|
||
### Runde erstellen
|
||
|
||
POST /api/rounds
|
||
|
||
- Request
|
||
|
||
{
|
||
"round_name": "Weihnachten 2025",
|
||
"participants": [
|
||
{ "name": "Alice", "email": "alice@mail.com", "wish": "Buch" },
|
||
{ "name": "Bob", "email": "bob@mail.com" },
|
||
{ "name": "Clara", "email": "clara@mail.com" }
|
||
]
|
||
}
|
||
|
||
|
||
- Response
|
||
|
||
{
|
||
"round_id": 12,
|
||
"created_at": "2025-12-01T19:43:10"
|
||
}
|
||
|
||
---
|
||
### Wichtel aufdecken
|
||
|
||
POST /api/reveal
|
||
|
||
- Request
|
||
|
||
{
|
||
"email": "alice@mail.com"
|
||
}
|
||
|
||
|
||
- Response
|
||
|
||
{
|
||
"giver": "Alice",
|
||
"receiver": "Bob",
|
||
"wish": "Schokolade"
|
||
}
|
||
|
||
|
||
|
||
**Wenn eine E-Mail in mehreren Runden vorkommt, gibt die API zuerst eine Auswahlliste zurück.**
|
||
|
||
|
||
----------------------Roadmap----------------------
|
||
-
|
||
|
||
|
||
- #### Token-basierte Reveal-Links
|
||
|
||
- #### Mail-Versand
|
||
|
||
- #### Ausschlussregeln (Partner, Familie, etc.)
|
||
|
||
- #### Deployment |