Aufgabe
Eine kleine Buchhandlung wollte online verkaufen. Sie darf nie mehr Exemplare verkaufen, als sie hat, auch wenn zwei Kunden gleichzeitig bestellen. Alte Bestellungen sollen ihre Preise nach Katalog- und Kursänderungen behalten, und Kunden aus verschiedenen Ländern sollen ihre Sprache und Währung sehen.
Lösung
Alle Geschäftsregeln liegen in einer Django-REST-API, die Vue-App ruft sie nur auf. Eine Bestellzeile speichert Titel und Preis zum Kaufzeitpunkt in der gewählten Währung. Bezahlt ist eine Bestellung erst nach einem signierten Stripe-Webhook, jede Erstattung ist ein eigener Datensatz mit Idempotenzschlüssel, deshalb wird nie doppelt erstattet.
Umgesetzte Aufgaben
- Katalog mit Volltextsuche gebaut, die ein Buch auch mit Tippfehler findet
- Überverkauf ausgeschlossen: der Checkout sperrt die Buchzeilen in einer Transaktion
- Versand nach Gewicht und Zone und Steuer nach Land, Bundesstaat oder PLZ berechnet
- Kartenzahlung über Stripe und einen Demo-Anbieter mit Testkarten angebunden
- Storno mit Erstattung gebaut, auch teilweise
- Preise in Dollar, Euro und Rubel gezeigt, Währungen werden im Admin ergänzt
- Oberfläche und Katalog ins Russische, Englische, Französische und Deutsche übersetzt
- Kursupdates und erneute Erstattungsversuche in einen eigenen Scheduler verlegt
Ergebnis
Der Shop nimmt Bestellungen vom Handy in vier Sprachen und drei Währungen an, verkauft nie zu viel und erstattet Stornos selbst. Der Code ist offen auf GitHub, der Shop startet mit einem einzigen docker compose up.
Technologien
PythonDjango REST FrameworkVue 3TypeScriptPostgreSQLStripeDocker