2026-08-17 00:39:25 +02:00
|
|
|
-- +goose Up
|
|
|
|
|
-- Company owner is the billing representative (distinct from membership admin|member).
|
|
|
|
|
-- Platform staff remain above all tenants.
|
|
|
|
|
|
|
|
|
|
ALTER TABLE companies
|
|
|
|
|
ADD COLUMN IF NOT EXISTS owner_user_id UUID REFERENCES users(id) ON DELETE SET NULL;
|
|
|
|
|
|
|
|
|
|
CREATE INDEX IF NOT EXISTS companies_owner_user_id_idx ON companies(owner_user_id);
|
|
|
|
|
|
|
|
|
|
-- Backfill: prefer earliest active admin, else earliest active member.
|
|
|
|
|
UPDATE companies c
|
|
|
|
|
SET owner_user_id = sub.user_id
|
|
|
|
|
FROM (
|
|
|
|
|
SELECT DISTINCT ON (m.company_id) m.company_id, m.user_id
|
|
|
|
|
FROM memberships m
|
|
|
|
|
WHERE m.status = 'active'
|
|
|
|
|
ORDER BY m.company_id,
|
|
|
|
|
CASE WHEN m.role = 'admin' THEN 0 ELSE 1 END,
|
|
|
|
|
m.created_at ASC,
|
|
|
|
|
m.user_id ASC
|
|
|
|
|
) sub
|
|
|
|
|
WHERE c.id = sub.company_id
|
|
|
|
|
AND c.owner_user_id IS NULL;
|
|
|
|
|
|
|
|
|
|
-- Prefer a1-primary as owner on the A1 cohort tenant when present.
|
|
|
|
|
UPDATE companies c
|
|
|
|
|
SET owner_user_id = u.id
|
|
|
|
|
FROM users u
|
2026-08-17 00:40:46 +02:00
|
|
|
INNER JOIN memberships m ON m.user_id = u.id AND m.status = 'active'
|
|
|
|
|
WHERE c.id = m.company_id
|
|
|
|
|
AND c.legacy_company_id = '97e1a309-3d23-4aa2-b518-8e8d7afdfec7'
|
2026-08-17 00:39:25 +02:00
|
|
|
AND lower(u.email) = 'a1-primary@descrybe.local';
|
|
|
|
|
|
|
|
|
|
-- +goose Down
|
|
|
|
|
DROP INDEX IF EXISTS companies_owner_user_id_idx;
|
2026-08-17 00:40:46 +02:00
|
|
|
ALTER TABLE companies DROP COLUMN IF EXISTS owner_user_id;
|