| title | Equinet - Bokningsplattform för Hästtjänster | ||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| description | Projektöversikt, setup-guide, teknisk stack och implementerade funktioner | ||||||||||||||
| category | root | ||||||||||||||
| tags |
|
||||||||||||||
| status | active | ||||||||||||||
| last_updated | 2026-04-11 | ||||||||||||||
| related |
|
||||||||||||||
| sections |
|
Equinet är en modern bokningsplattform som kopplar samman hästägare med tjänsteleverantörer som hovslagare, veterinärer och andra hästspecialister.
- Node.js: v20 eller senare
- npm: v10 eller senare
- Docker Desktop: Krävs av Supabase CLI för lokal utveckling
- Supabase CLI:
brew install supabase/tap/supabase(lokal auth + DB + RLS) - Git: För version control
- VS Code (rekommenderat) med: ESLint, Prettier, Prisma, Tailwind CSS IntelliSense
-
Klona projektet
git clone <repository-url> cd equinet
-
Installera beroenden
npm install
-
Sätt upp environment variables
# Kopiera example-fil till .env cp .env.example .envViktiga environment variables:
DATABASE_URL: PostgreSQL connection string (lokal Supabase port 54322)NEXT_PUBLIC_SUPABASE_URL: Supabase projekt-URL (lokal:http://127.0.0.1:54321)NEXT_PUBLIC_SUPABASE_ANON_KEY: Supabase anon keySUPABASE_SERVICE_ROLE_KEY: Supabase service role key (server-only)
.env.examplehar lokal Supabase som default med standardnycklar. För produktion: avkommentera alternativ 2. -
Starta lokal databas och seeda
# Starta lokal Supabase (PostgreSQL + Auth + RLS + triggers) npm run db:up # Kör migrationer + generera Prisma Client npm run setup # Seeda med testdata npm run db:seed
-
Starta utvecklingsservern
npm run dev
Öppna http://localhost:3000 i din browser.
-
Verifiera installation
# Kör tester för att säkerställa allt fungerar npm run test:run # Unit tests npm run test:e2e # E2E tests (kräver seedat data) npm run typecheck # TypeScript check
npm run dev # Starta utvecklingsserverStoppa server: Ctrl + C
- Kund: test@example.com / TestPassword123!
- Provider: provider@example.com / ProviderPass123!
Se package.json för alla tillgängliga scripts. De vanligaste:
| Kommando | Beskrivning |
|---|---|
npm run dev |
Utvecklingsserver (port 3000) |
npm run db:up |
Starta lokal Supabase (DB + Auth + RLS) |
npm run db:down |
Stoppa lokal Supabase (data bevaras) |
npm run db:nuke |
Aterstall lokal databas (kor om migrationer) |
npm run db:status |
Visa Supabase-status (portar, nycklar) |
npm run db:studio |
Prisma Studio för databasinspektering |
npm run db:reset |
Återställ databas (raderar all data!) |
npm run db:backup |
Backup av Supabase-data (kräver Docker) |
npm run db:restore |
Återställ backup till lokal databas |
npm run db:drift-check |
Jämför lokala migrationer med Supabase (namnbaserad) |
npm run migrate:status |
Fullständig migrationsstatus (pending, drift, misslyckade) |
npm test |
Unit/integration tester (watch mode) |
npm run test:e2e |
E2E-tester med Playwright |
npm run test:coverage |
Coverage report |
npm run deploy |
Kvalitetscheckar + drift-check + auto-backup + push |
npm run check:all |
Alla quality gates i ett kommando (färgkodad output) |
npm run flags:validate |
Validera feature flag gates (server + klient) |
Automatiserade quality gates säkerställer kodkvalitet:
Allt-i-ett: npm run check:all (typecheck + test + lint + swedish med färgkodad output)
Lokal Gate (Husky):
- Pre-commit: Swedish character check + TypeScript (om .ts/.tsx staged)
- Pre-push: Swedish character check + Unit tests + TypeScript + Lint
CI Gate (GitHub Actions):
- Unit Tests & Coverage
- E2E Tests
- Offline E2E Smoke (prod-build + Serwist SW)
- TypeScript Check
- Build Check
Branch Protection: Kräver PR för merge till main, CI måste passera. Ingen force push tillåten.
- Framework: Next.js 16 (App Router)
- Språk: TypeScript (strict mode)
- Styling: Tailwind CSS v4
- UI: shadcn/ui + Radix UI
- Databas: PostgreSQL (Supabase) via Prisma ORM
- Autentisering: Supabase Auth (managed, med Custom Access Token Hook)
- Validering: Zod + React Hook Form
- Testning: Vitest (4327 unit/integration) + Playwright (22 E2E-specs) + 312 iOS XCTest = 70% coverage
- CI/CD: GitHub Actions (quality gates, E2E tests)
- Caching/Flaggor: Upstash Redis (feature flags, rate limiting)
- Grafer: Recharts (dashboard- och insiktsgrafer)
- Arkitektur: DDD-Light med Repository Pattern
- Säkerhet: Supabase Auth, MFA för admin (TOTP), RLS (Row Level Security), Upstash Redis rate limiting, Stripe webhook idempotens, input sanitization, admin audit log, Sentry monitoring
equinet/
├── ios/ # iOS-app (Swift/SwiftUI, WKWebView hybrid)
├── prisma/ # Databasschema & migrationer
├── src/
│ ├── app/ # Next.js App Router
│ │ ├── (auth)/ # Login, registrering
│ │ ├── api/ # API routes (auth, bookings, horses, providers, ...)
│ │ ├── admin/ # Admin-sidor
│ │ ├── customer/ # Kundsidor
│ │ └── provider/ # Leverantörssidor
│ ├── components/ # React-komponenter (layout, provider, review, ui)
│ ├── domain/ # Affärslogik (booking, due-for-service, group-booking, notification, payment, reminder, subscription)
│ ├── infrastructure/ # Repositories (Prisma-implementationer)
│ ├── hooks/ # Custom hooks (useAuth, useNotifications)
│ ├── lib/ # Utilities (auth, email, prisma, rate-limit, validations)
│ └── types/ # TypeScript-typer
└── e2e/ # E2E-tester (Playwright)
Equinet använder DDD-Light - en pragmatisk approach till Domain-Driven Design.
src/
├── app/api/ # API Routes (HTTP-hantering)
├── domain/ # Affärslogik, entiteter, value objects
├── infrastructure/ # Repositories, externa tjänster
└── lib/ # Utilities utan affärslogik
Kärndomäner (Booking, Provider, Service, CustomerReview, Horse, Subscription) använder repository pattern:
- IBookingRepository - Interface för bokningsoperationer
- PrismaBookingRepository - Prisma-implementation
- MockBookingRepository - In-memory för tester
Säkerhet: Alla auth-aware metoder använder atomära WHERE-klausuler för IDOR-prevention.
Se CLAUDE.md för fullständiga arkitekturriktlinjer.
43 modeller -- se prisma/schema.prisma för fullständig definition och docs/architecture/database.md för arkitekturbeskrivning.
Kärnmodeller:
- User - Användarkonton (kunder + leverantörer + admin)
- Provider - Leverantörsprofiler med företagsinformation och verifieringsstatus
- Booking - Bokningar med fast tid (kan kopplas till Horse)
- Horse - Hästregister med namn, ras, födelseår, kön, UELN, mikrochip, specialbehov
- RouteOrder - Flexibla beställningar utan fast tid
- Review / CustomerReview - Recensioner i båda riktningar
- BookingSeries - Återkommande bokningsserier med intervall
- GroupBookingRequest - Gruppbokningsförfrågningar
- ProviderCustomerNote - Leverantörens privata kundanteckningar
- ProviderCustomer - Manuellt registrerade kunder
- Autentisering (rollval, email-verifiering, sessions)
- Bokning (fast tid + flexibla beställningar, mobil-först med stegvis Drawer, självservice-ombokning)
- Leverantörshantering (profil, tjänster, öppettider, kalender)
- Hästregister med hälsotidslinje och delbar hästprofil (UELN + mikrochip)
- Mobil-först UI med responsiva dialoger, 44px touch targets och stegvist bokningsflöde
- Stallprofiler och stallplatser (skapa stall, publicera lediga platser, publik sökning med kommun-autocomplete)
- Meddelanden mellan kund och leverantör per bokning (tråd-vy, polling var 10s, push-notiser vid nytt meddelande)
- Snabbsvar i leverantörens meddelande-tråd (feature flag
smart_replies, default off)
- Ruttplanering med kartvy, optimering, Google Maps-navigation och geolokalisering
- Ruttannonsering med kundvy (tjänstefilter, datumavgränsning, HorseSelect, "Via rutt"-badge)
- Kundregister med manuell kundregistrering, inbjudan och kontoslagning, och privata anteckningar (CRUD)
- Besöksplanering ("Dags för besök") med statusbadges
- Kompetenser och verifiering (admin-granskning)
- Stäng för nya kunder (befintliga kunder kan fortfarande boka)
- Ombokningsinställningar (tillåt/neka, tidsfönster, max antal, kräv godkännande)
- Återkommande bokningar (serier med intervall, feature flag-skyddad)
- Kundrecensioner (leverantör betygsätter kund, 1-5 stjärnor)
- Röstloggning / arbetslogg (diktera eller skriv, AI tolkar och mappar till bokningar)
- No-show-spårning (markera ej infunnit, kundvarningar vid 2+)
- AI-drivna kundinsikter (frekvens, VIP-score, riskflaggor)
- Dashboard med trendgrafer och onboarding-wizard (guidar nya leverantörer genom setup)
- Affärsinsikter (populära tjänster, tidsanalys, kundretention)
- Native SwiftUI-vyer för dashboard, kalender, bokningslista och kundhantering (ersätter WebView steg för steg)
- Native-Web bridge (JS <-> Swift) för push-notiser, kalendersynk och nätverksstatus
- Push-notiser via APNs med actionable notifications (bekräfta/avvisa bokningar)
- EventKit-kalendersynk -- bekräftade bokningar synkas till iOS Kalender (Apple Watch-påminnelser, Siri-förslag)
- WidgetKit -- Small/Medium widget som visar nästa bokning på hemskärmen
- Native taligenkänning (Speech framework) för röstloggning i appen
- JWT-baserad mobiltoken-auth (jose HS256, 90 dagars livstid, Keychain-lagring)
- Branded splash screen med mjuk övergång
- Pull-to-refresh med haptic feedback
- Native offline-detektion (NWPathMonitor) med amber/grön banner
- HTTP 5xx-felhantering med native felvy
- VoiceOver-stöd och 44pt touch targets
- App lifecycle-events (
appDidBecomeActive/appDidEnterBackground) via bridge - Portrait-låst, ingen zoom/länkförhandsgranskning
- Dashboard med KPI-kort (användare, bokningar, leverantörer, intäkter)
- Användarhantering (sök, filtrera, blockera, ge admin-rättigheter)
- Bokningshantering (lista, avboka med admin-anledning)
- Recensionsmoderation (granska, ta bort)
- Verifieringsgranskning (godkänn/avvisa med kommentar)
- Bulk-notifikationer (till alla/kunder/leverantörer)
- Systeminställningar (e-post-toggle, runtime-inställningar)
- Recensioner och betyg (båda riktningar)
- Gruppbokning för stallgemenskaper
- Ruttannonsering med kundvy (kunder ser lediga tider och bokar sig på annonserade rutter)
- Följ leverantör med personliga ruttannonser (due-for-service-kontext i notiser)
- In-app notifikationer + email
- Automatiska återbesökspåminnelser
- Bokningspåminnelser 24h före (med opt-out via unsubscribe-länk)
- Betalningsabstraktion (PaymentGateway) + Stripe-prenumerationer (SubscriptionGateway, feature flag-skyddad)
- Bokföringsabstraktion (Fortnox)
- Bilduppladdning (Supabase Storage)
- Rate limiting, CSRF, XSS, SQL injection-skydd
- GDPR-dataexport (JSON/CSV)
- Redis-backade feature flags med admin-toggle
- Demo-läge (
NEXT_PUBLIC_DEMO_MODE=trueeller feature flagdemo_mode) -- strippar ner UI:t till kärnflödet för demo, se docs/demo-mode.md - Installbar PWA med offline-stöd (Serwist service worker + IndexedDB-cache + offline mutation queue med automatisk synk vid återanslutning)
Se docs/guides/feature-docs.md för detaljerade beskrivningar.
4661+ tester (4327 Vitest unit/integration + 312 iOS XCTest + 22 E2E-specs) med 70% coverage.
# Unit/Integration (Vitest)
npm test # Watch mode
npm run test:ui # Visuellt interface
npm run test:coverage # Med coverage
# E2E (Playwright)
npm run db:up # Starta lokal Supabase (om inte redan igång)
npm run test:e2e:bootstrap # Verifiera Supabase + kör prisma migrate deploy
npm run test:e2e # Kör alla E2E-tester
npm run test:e2e:smoke # Smoke: app startar, login fungerar
npm run test:e2e:critical # Kritiska flöden: bokning, betalning, leverantör
npm run test:e2e:ui # Playwright UI (bäst för utveckling)
npm run test:e2e:offline # Offline PWA E2E-tester (bygger prod + testar offline-läge)
# Mobil viewport körs automatiskt som separat Playwright-projekt (Pixel 7, Chromium)Testanvändare:
- Kund:
test@example.com/TestPassword123! - Leverantör:
provider@example.com/ProviderPass123!
Se e2e/README.md och individuella .test.ts filer för detaljer.
Inför lansering: kör docs/testing/release-checklist.md -- täcker automatiska gates, kritiska flöden, feature-specifika flöden och pre-launch-blockerare.
Snabb guide:
- Registrera leverantör -> Lägg till tjänster -> Sätt öppettider
- Registrera kund -> Bläddra leverantörer -> Gör bokning
- Logga in som leverantör -> Acceptera bokning -> Markera som klar
- Verifiera som kund -> Se uppdaterad status -> Lämna recension
- Logga in som leverantör -> Se recension -> Svara på recension
- Som kund -> Mina hästar -> Se historik -> Lägg till anteckning
- Som leverantör -> Verifiering -> Skicka ansökan
lsof -ti:3000 | xargs kill -9
# eller
npm run dev -- -p 3001npm run db:reset && npm run setupnpx prisma generate
# Starta om TS server i VS Code: Cmd+Shift+P -> "TypeScript: Restart TS Server"# MaxClientsInSessionMode: Prisma Studio-processer stängs inte automatiskt
ps aux | grep prisma
pkill -f "prisma studio"Tips: Stäng alltid Prisma Studio med Ctrl+C. Kontrollera med ps aux | grep prisma vid 503-fel.
rm -rf .next && npm run devEquinet är konfigurerat för Vercel (hosting) + Supabase (databas).
Kort sammanfattning:
- Skapa Supabase-projekt och kopiera connection string (Session Pooler IPv4)
- Importera repo på Vercel och lägg till environment variables
- Vercel kör automatiskt
prisma generateochnext build
Se docs/operations/deployment.md för fullständig steg-för-steg guide.
- README.md (denna fil) - Vad som är byggt, setup, testning
- CLAUDE.md - Utvecklingsguide, arbetsprocesser, patterns
- NFR.md - Non-Functional Requirements (säkerhet, performance, etc.)
- docs/INDEX.md - Centralt dokumentationsindex med alla sektioner
- docs/guides/gotchas.md - Vanliga problem och losningar
- docs/operations/deployment.md - Komplett deployment-guide
- docs/security/pentest-2026-02-15.md - Pentest-rapport (feb 2026)
- docs/retrospectives/ - Konsoliderade retrospectives
- docs/plans/rutt-baserad-levering.md - Fullständig feature-spec för rutt-funktionen
- Realtidsspårning - Leverantörens position och ETA-uppdateringar
- Push/SMS-notifikationer - Komplement till befintliga notifikationer
- Betalningsintegration - Swish/Stripe via PaymentGateway (Stripe subscription-infrastruktur implementerad, väntar på konfiguration)
Feature-backlog hanteras i Trello.
Skapad: November 2025 Version: v0.4.0+ Utvecklad med: Next.js 16, TypeScript, Tailwind CSS, Claude Code