Files
editor/packages/db
bee4613b82 Add project versioning & publish flow (#130)
* Add project versioning & publish flow

Introduce project model versioning and publishing support.

- DB: add published_model_version column to projects (migration + schema + types).
- Models: add version status types and helpers, implement getProjectVersionStatus, enhanced getProjectModel to load draft/published/legacy fallbacks, saveProjectModel now manages draft creation/updating and avoids no-op saves, saveProjectVersion to lock/save/publish versions and create next draft, publishProjectModel to republish specific saved versions. Includes scene-graph equality checks and authenticated project ownership checks.
- UI: AppSidebar shows publish/draft status, polling refresh, and Save / Save & publish / Publish actions that flush the editor scene before version operations. Hook update: load scene from result.data.model.scene_graph.
- Public project loader: prefer published version with legacy fallbacks.

This enables safe draft editing, explicit saves, publishing, and keeps autosave working across version locks.

* Add project versioning UI, APIs & preview mode

Introduce full version management support: UI, backend actions, and editor integration.

- UI: Add a Versions popover to the app sidebar with search, relative timestamps, preview, restore and publish controls; disable version actions while previewing and show proper labels/states. Imported new icons, popover and tooltip primitives and added formatRelativeTime helper.
- Actions: Add ProjectVersionListItem type and APIs getProjectVersionList and getProjectVersionByNumber to list and fetch saved (non-draft) versions.
- Hooks: Extract applySceneGraphToEditor and sync editor selection logic; ensure scene loading applies selection and supports preview mode (which suppresses autosave).
- Store: Add isVersionPreviewMode to project store with setter and isSceneLoading flag usage to prevent autosave while previewing.
- Misc: Wire up version list loading, previewing, restoring and publishing flows, and refresh version status/list after actions.

These changes enable browsing historical project versions, previewing them without triggering autosaves, and restoring or publishing selected versions.

* Improve version preview, restore flow & draft handling

- Add scene graph snapshot to preserve unsaved work during preview
- Include draft versions and metadata in version list
- Add getProjectVersionById for direct ID-based lookups
- Add autosave status to project store
- Refactor sidebar version UI (remove search, use save icon)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-03 23:56:46 -05:00
..
2026-02-18 01:51:17 -05:00
2026-02-26 22:09:40 -05:00
2026-02-11 15:23:18 +09:00

@pascal-app/db

Database package for Pascal Editor with Supabase.

Setup

1. Install Dependencies

From the monorepo root:

bun install

This installs Supabase CLI as a dev dependency.

2. Start Supabase locally

From the monorepo root:

bun db:start

This will start a local Supabase instance with PostgreSQL, PostgREST, and Studio.

3. Check Supabase status

bun db:status

You'll see output like:

API URL: http://127.0.0.1:54321
DB URL: postgresql://postgres:postgres@127.0.0.1:54322/postgres
Studio URL: http://127.0.0.1:54323
Anon key: eyJh...
Service role key: eyJh...

4. Configure environment variables

Add these to apps/editor/.env.local:

# Supabase
NEXT_PUBLIC_SUPABASE_URL=http://127.0.0.1:54321
NEXT_PUBLIC_SUPABASE_ANON_KEY=<your_anon_key>
SUPABASE_SERVICE_ROLE_KEY=<your_service_role_key>

# Better Auth
BETTER_AUTH_SECRET=<generate_with_openssl_rand_base64_32>
BETTER_AUTH_URL=http://localhost:3000

Generate a secret for BETTER_AUTH_SECRET:

openssl rand -base64 32

Migrations

Migrations are located in supabase/migrations/.

Apply migrations

bun db:reset  # Resets and applies all migrations

Create a new migration

cd packages/db
bunx supabase migration new <migration_name>

Database Schema

Auth Tables (Better Auth)

  • users - User accounts
  • sessions - Active sessions
  • accounts - OAuth provider accounts
  • verification_tokens - Magic link tokens

Application Tables

  • properties - User properties
  • properties_addresses - Property addresses with Google Maps data
  • properties_models - Scene graph models (versions)

Usage

Client-side (with RLS)

import { supabase } from '@pascal-app/db/client'

// RLS policies automatically filter by authenticated user
const { data } = await supabase.from('properties').select('*')

Server-side (service role)

import { supabaseAdmin } from '@pascal-app/db/server'

// Bypasses RLS - you must manually filter by user_id
const { data } = await supabaseAdmin
  .from('properties')
  .select('*')
  .eq('owner_id', userId)

Supabase Studio

Access the local Supabase Studio at: http://127.0.0.1:54323

Use this to:

  • Browse tables and data
  • Run SQL queries
  • View logs
  • Manage RLS policies