feat(server): tenant-registry skeleton boots against dev stack
Minimal Go service: /healthz + /v1/tenants/by-slug/:slug + /v1/tenants/:id with an in-memory store seeded with the acme tenant. Stdlib-only; pgx + JWT validation land in M4.1 follow-up.
This commit was merged in pull request #4.
This commit is contained in:
@@ -0,0 +1,52 @@
|
||||
-- Placeholder for the M4.1 schema (see PLATFORM_ARCHITECTURE.md §5c).
|
||||
-- The skeleton uses an in-memory store; this file lands the table shape
|
||||
-- the real M4.1 PR will use, so the schema review can happen alongside
|
||||
-- the rest of the boot scaffolding.
|
||||
|
||||
-- enums --------------------------------------------------------------------
|
||||
|
||||
CREATE TYPE tenant_status AS ENUM ('trial', 'active', 'frozen', 'archived', 'demo');
|
||||
CREATE TYPE tenant_kind AS ENUM ('customer', 'demo', 'stage', 'internal');
|
||||
|
||||
-- tenants ------------------------------------------------------------------
|
||||
|
||||
CREATE TABLE tenants (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
slug TEXT UNIQUE NOT NULL CHECK (slug ~ '^[a-z0-9-]{2,40}$'),
|
||||
name TEXT NOT NULL,
|
||||
status tenant_status NOT NULL DEFAULT 'trial',
|
||||
kind tenant_kind NOT NULL DEFAULT 'customer',
|
||||
plan TEXT NOT NULL DEFAULT 'starter',
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
trial_ends_at TIMESTAMPTZ
|
||||
);
|
||||
|
||||
CREATE INDEX tenants_status_idx ON tenants (status);
|
||||
|
||||
-- tenant ↔ product entitlements -------------------------------------------
|
||||
|
||||
CREATE TABLE tenant_products (
|
||||
tenant_id UUID NOT NULL REFERENCES tenants(id) ON DELETE CASCADE,
|
||||
product TEXT NOT NULL,
|
||||
enabled BOOLEAN NOT NULL DEFAULT TRUE,
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
PRIMARY KEY (tenant_id, product)
|
||||
);
|
||||
|
||||
-- audit log (Retraced-shape; PRODUCT_INTEGRATION_SPEC.md §8.4) ------------
|
||||
|
||||
CREATE TABLE audit_log (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
tenant_id UUID REFERENCES tenants(id),
|
||||
actor_id TEXT,
|
||||
actor_name TEXT,
|
||||
action TEXT NOT NULL,
|
||||
target_id TEXT,
|
||||
target_type TEXT,
|
||||
metadata JSONB NOT NULL DEFAULT '{}'::jsonb,
|
||||
source_ip INET,
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
||||
);
|
||||
|
||||
CREATE INDEX audit_log_tenant_idx ON audit_log (tenant_id, created_at DESC);
|
||||
Reference in New Issue
Block a user