Skip to content

cola500/equinet

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2,128 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

title Equinet - Bokningsplattform för Hästtjänster
description Projektöversikt, setup-guide, teknisk stack och implementerade funktioner
category root
tags
setup
overview
getting-started
status active
last_updated 2026-04-11
related
CLAUDE.md
NFR.md
docs/architecture/database.md
docs/operations/deployment.md
docs/guides/gotchas.md
docs/guides/feature-docs.md
sections
Getting Started
Viktiga Kommandon
Quality Gates
Teknisk Stack
Projektstruktur
Arkitektur
Databasschema
Implementerade Funktioner
Testning
Testa Appen Manuellt
Felsökning
Deploy till Produktion
Dokumentation
Roadmap

Equinet - Bokningsplattform för Hästtjänster

Equinet är en modern bokningsplattform som kopplar samman hästägare med tjänsteleverantörer som hovslagare, veterinärer och andra hästspecialister.

Getting Started

Prerequisites

  • 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

Initial Setup

  1. Klona projektet

    git clone <repository-url>
    cd equinet
  2. Installera beroenden

    npm install
  3. Sätt upp environment variables

    # Kopiera example-fil till .env
    cp .env.example .env

    Viktiga 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 key
    • SUPABASE_SERVICE_ROLE_KEY: Supabase service role key (server-only)

    .env.example har lokal Supabase som default med standardnycklar. För produktion: avkommentera alternativ 2.

  4. 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
  5. Starta utvecklingsservern

    npm run dev

    Öppna http://localhost:3000 i din browser.

  6. 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

Snabbstart (om du redan har setup)

npm run dev              # Starta utvecklingsserver

Stoppa server: Ctrl + C

Testanvändare (efter seeding)

Viktiga Kommandon

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)

Quality Gates

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.

Teknisk Stack

  • 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

Projektstruktur

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)

Arkitektur

Equinet använder DDD-Light - en pragmatisk approach till Domain-Driven Design.

Lagerstruktur

src/
├── app/api/          # API Routes (HTTP-hantering)
├── domain/           # Affärslogik, entiteter, value objects
├── infrastructure/   # Repositories, externa tjänster
└── lib/              # Utilities utan affärslogik

Repository Pattern

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.

Databasschema

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

Implementerade Funktioner

Kärnfunktioner

  • 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)

Kommunikation

  • 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)

Leverantörsverktyg

  • 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)

iOS-app (hybrid + native SwiftUI)

  • 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

Admin-gränssnitt

  • 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)

Samarbete och kommunikation

  • 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)

Integrationer och säkerhet

  • 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=true eller feature flag demo_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.

Testning

4661+ tester (4327 Vitest unit/integration + 312 iOS XCTest + 22 E2E-specs) med 70% coverage.

Kör Tester

# 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.

Manuell release-checklista

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.

Testa Appen Manuellt

Snabb guide:

  1. Registrera leverantör -> Lägg till tjänster -> Sätt öppettider
  2. Registrera kund -> Bläddra leverantörer -> Gör bokning
  3. Logga in som leverantör -> Acceptera bokning -> Markera som klar
  4. Verifiera som kund -> Se uppdaterad status -> Lämna recension
  5. Logga in som leverantör -> Se recension -> Svara på recension
  6. Som kund -> Mina hästar -> Se historik -> Lägg till anteckning
  7. Som leverantör -> Verifiering -> Skicka ansökan

Felsökning

Port upptagen

lsof -ti:3000 | xargs kill -9
# eller
npm run dev -- -p 3001

Databasfel

npm run db:reset && npm run setup

TypeScript-fel

npx prisma generate
# Starta om TS server i VS Code: Cmd+Shift+P -> "TypeScript: Restart TS Server"

Prisma Studio zombie-processer (503-fel)

# 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.

Stale cache

rm -rf .next && npm run dev

Deploy till Produktion

Equinet är konfigurerat för Vercel (hosting) + Supabase (databas).

Kort sammanfattning:

  1. Skapa Supabase-projekt och kopiera connection string (Session Pooler IPv4)
  2. Importera repo på Vercel och lägg till environment variables
  3. Vercel kör automatiskt prisma generate och next build

Se docs/operations/deployment.md för fullständig steg-för-steg guide.

Dokumentation

Huvuddokument

  • README.md (denna fil) - Vad som är byggt, setup, testning
  • CLAUDE.md - Utvecklingsguide, arbetsprocesser, patterns
  • NFR.md - Non-Functional Requirements (säkerhet, performance, etc.)

Fullstandig dokumentation

Features

Roadmap

Framtida Features

  • 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

About

Bokningsplattform för hästtjänster - MVP med Next.js 16, TypeScript, Prisma och NextAuth

Resources

Stars

Watchers

Forks

Packages

 
 
 

Contributors