5.3 KiB
5.3 KiB
Backlog
Prioriterade förbättringar och kända luckor. Top-down ungefär i prioritetsordning.
P0 — innan skarp lansering
- Rate-limit på
POST /api/bookings: enkel IP-baserad throttle (t.ex. 5 bokningar/timme/IP) för att stoppa spam/bots. Implementera isrc/app/api/bookings/route.tseller via en middleware-wrapper. - Honeypot eller hCaptcha på formuläret: bokningsformuläret är publikt utan skydd. Honeypot är minimalistiskt och räcker ofta.
- Generera riktigt
AUTH_SECRET: dokumenterat i README men måste göras manuellt vid deploy. - Verifiera Mailjet-avsändare:
MAIL_FROM_EMAILmåste vara verifierad i Mailjet-kontot innan mejl kommer fram. - Skarpa produktpriser och upphämtningstider: ändra i
prisma/seed.tseller via Prisma Studio innan lansering. - Cookie-banner / GDPR-info: bokningen samlar PII (namn, e-post, org.nummer, adress). Kort policy-text + länk.
- Backup-rutin för SQLite-volymen: cron-jobb på värden som kör
cpmot en separat disk eller S3.
P1 — höjer kvaliteten
- Admin-UI för produkter och upphämtningstider: idag måste man köra seed-filen eller Prisma Studio. Lägg till
/admin/productsoch/admin/pickup-slotsmed CRUD. - Admin-UI för att skapa fler administratörer: tabellen
Adminstöder flera men det finns ingen invite-flow. Antingen self-serve invite via mejl-länk eller manuell skapa-form i admin-panelen. - Kund-avbokning via token-länk: lägg till
cancelTokenpåBooking, inkludera unik avbokningslänk i bekräftelsemejlet. Trigger påGET /booking/cancel/{token}med bekräftelsesida. - Lagerbegränsning per produkt: idag finns kapacitet bara på upphämtnings-slots. Lägg
totalStockpåProductoch kontrollera i POST-routen attΣ confirmed quantity ≤ stock. - Mailjet Templates (Template-ID) istället för inline HTML: gör det möjligt att ändra mejldesign utan redeploy. Inline HTML kvar som fallback om template-id saknas.
- Resend-bekräftelse loggar: idag skickar admin-knappen "Resend confirmation" tyst — visa toast/success vid lyckad sändning.
- Bookings-vy: paginering: nuvarande tar
take: 200. Lägg cursor-paginering vid skarp volym. - PDF-faktureringsunderlag per bokning: utöver CSV — en PDF som matchar fakturamall, lättare att bifoga.
- Audit log för admin-actions: tabell
AuditEventmed vem som ändrade status, körde resend, etc. - Healthcheck-endpoint:
GET /api/healthreturnerar 200 +{db: 'ok'}för proxy/uptime-monitor.
P2 — bra att ha
- Prisma migrate istället för db push: när schemat är stabilt, kör
prisma migrate devinitialt och commita migrations-mappen. Byt entrypoint tillmigrate deploy. - Multi-event-stöd: idag är allt knutet till ett event via
NEXT_PUBLIC_EVENT_NAME. Lägg tillEvent-tabell med egen produkt- och slot-koppling om systemet ska användas till fler läger. - E-mail verification innan bokning: skicka kod eller bekräfta via dubbelt opt-in. Idag litar vi på att kunden anger korrekt mejl.
- Slot-omval via avbokningslänk: kunden kan byta upphämtningstid utan att kontakta admin.
- Skicka påminnelse-mejl dagen innan upphämtning (cron + Mailjet).
- Status-mejl vid statusbyte: kunden får mejl när bokningen markeras
INVOICEDellerCANCELLED. - Inbjudnings-mejl till nya admins (kopplat till P1 admin-UI för admins).
- Tester: minst en smoke-test för
POST /api/bookings(Playwright eller Vitest + Supertest). - CI: GitHub Actions som kör
npm run buildpå PR. - Telemetri / felrapportering: Sentry eller liknande.
P3 — framtida överväganden
- Postgres istället för SQLite: när volymen växer eller om vi vill ha managed backups. Prisma byter provider med en rad + ny
DATABASE_URL. - Prisma 7-uppgradering: ny
prisma.config.tsmed driver adapter (t.ex.@prisma/adapter-better-sqlite3), uppdateradPrismaClient-init. Inte värt det förrän Prisma 7 är stabilare och vi har annat skäl att uppgradera. - Server-side e-postvalidering: t.ex. DNS/MX-koll eller integration mot Mailjet Address Validation.
- Bilder på produkterna i formuläret: laddas från egen
/public/products/*.webpeller via en CDN. - Skip-link och bättre a11y-audit: fokushantering i stegen, ARIA-live för felmeddelanden.
- Webhooks från Mailjet (bounce/spam-rapport) — markerar bokningar med ogiltig e-post.
Beslutslogg
- 2026-05-22: Valt SQLite + Prisma 5 (inte 7) för MVP. SQLite-fil i Docker-volym räcker för ett event. Prisma 5 fungerar utan
prisma.config.ts. - 2026-05-22:
prisma db pushistället förmigrate deployi entrypoint — färre artefakter att hålla reda på i MVP. Byt vid stabilt schema. - 2026-05-22: Priser i öre (
Int) snarare änDecimal— enklare och säkrare för en valuta (SEK). - 2026-05-22: Egen inline HTML-mall i
src/lib/mailjet.tsistället för Mailjet Templates — färre externa beroenden för MVP, men ändras inte utan deploy. - 2026-05-22: NextAuth Credentials + lokal Admin-tabell (inte magic link) — användaren valde detta för flera admins.
- 2026-05-22: next-intl med
localePrefix: "as-needed"—/är svenska,/en/*engelska. Switch i header behåller path.