belviskhoremk 3504790216 fix: address final whole-branch review findings for Phase 2B admin panel
Consolidated fix wave for 1 Critical + 6 Important findings from the final
review before merge:

- Critical: marking a booking completed no longer frees its booked_slots
  mirror row or the unique-slot index, closing a double-booking hole
  (new migration 20260812110508, with regression pgTAP tests added first
  and confirmed failing against the old trigger/index).
- uploadSalonImage() now returns the storage-relative path instead of an
  absolute public URL, so products/services.image stays one consistent
  format.
- The product/service Id field is disabled while editing, preventing
  accidental duplicate rows from an upsert keyed on a changed id.
- Cancel / Mark completed in AdminBookings now require window.confirm,
  matching the existing delete-confirmation pattern.
- /admin and any unmatched /admin/* path now redirect to /admin/products
  instead of rendering blank.
- Public signup is disabled in supabase/config.toml, and ProtectedRoute
  adds a defense-in-depth check that the session belongs to the admin
  user id, not just that a session exists.
- Product/service delete now surfaces a friendly message for FK-violation
  errors (23503) via a new friendlyError() helper, instead of a raw
  Postgres error string.

Claude-Session: https://claude.ai/code/session_01NhxA4npAXAxmCDEJt6kxSH
2026-08-12 13:12:41 +02:00
2026-08-12 12:52:25 +02:00

Braids by Mira

Public marketing site for Braids by Mira — landing page, product showcase, booking flow, and salon policies.

Scripts

  • npm run dev — start the local dev server
  • npm test (or npx vitest run) — run the frontend test suite
  • npm run build — type-check and build for production
  • npm run lint — run ESLint
  • npm run test:functions — run the Deno tests for the Edge Functions' shared email builders (requires Deno installed)
  • npm run seed — seed products, services, and the default schedule into a Supabase project (see below)

Backend (Supabase)

The backend lives in supabase/ — Postgres schema/RLS migrations, pgTAP tests, and Deno Edge Functions for booking/inquiry email notifications.

  • npx supabase start — start the local Docker-based Supabase dev stack (Postgres, Studio, Auth, Storage, Edge Functions runtime). Requires Docker.
  • npx supabase db reset — replay all migrations from scratch against the local database.
  • npx supabase test db — run the pgTAP test suite in supabase/tests/database/ against the local database.

Environment variables

Copy .env.example to .env.local and fill in:

  • VITE_SUPABASE_URL, VITE_SUPABASE_ANON_KEY — frontend Supabase client config (exposed to the browser).
  • SUPABASE_URL, SUPABASE_SERVICE_ROLE_KEY — used only by scripts/seed.ts (server-side, never expose the service role key to the browser). These are distinct from the VITE_-prefixed frontend variables above.
Description
No description provided
Readme 3.9 MiB
Languages
TypeScript 77.5%
PLpgSQL 14.6%
CSS 7.1%
HTML 0.5%
JavaScript 0.3%