3504790216908cc41121e775d675690dcb4e6a2f
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
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 servernpm test(ornpx vitest run) — run the frontend test suitenpm run build— type-check and build for productionnpm run lint— run ESLintnpm 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 insupabase/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 byscripts/seed.ts(server-side, never expose the service role key to the browser). These are distinct from theVITE_-prefixed frontend variables above.
Description
Languages
TypeScript
77.5%
PLpgSQL
14.6%
CSS
7.1%
HTML
0.5%
JavaScript
0.3%