Files
OmniOilPersonal/services/backend-api/migrations/20260509000000_access_request_provisioning.sql
2026-05-14 08:56:46 -05:00

42 lines
1.8 KiB
SQL

-- Access request provisioning and activation invitations.
-- Additive migration: does not modify existing request/user/project data.
ALTER TABLE access_requests
ADD COLUMN IF NOT EXISTS provisioned_user_id UUID REFERENCES users(id) ON DELETE SET NULL,
ADD COLUMN IF NOT EXISTS provisioned_project_id UUID REFERENCES edge_projects(id) ON DELETE SET NULL,
ADD COLUMN IF NOT EXISTS provisioned_at TIMESTAMPTZ;
CREATE TABLE IF NOT EXISTS access_request_invitations (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
access_request_id UUID NOT NULL REFERENCES access_requests(id) ON DELETE CASCADE,
user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
project_id UUID REFERENCES edge_projects(id) ON DELETE SET NULL,
token_hash TEXT NOT NULL UNIQUE,
email_status VARCHAR(30) NOT NULL DEFAULT 'pending'
CHECK (email_status IN ('pending', 'sent', 'failed')),
email_sent_at TIMESTAMPTZ,
email_error TEXT,
expires_at TIMESTAMPTZ NOT NULL,
consumed_at TIMESTAMPTZ,
revoked_at TIMESTAMPTZ,
revoked_reason TEXT,
created_by UUID REFERENCES users(id) ON DELETE SET NULL,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE INDEX IF NOT EXISTS idx_access_request_invitations_request_latest
ON access_request_invitations(access_request_id, created_at DESC);
CREATE INDEX IF NOT EXISTS idx_access_request_invitations_token_hash_open
ON access_request_invitations(token_hash)
WHERE consumed_at IS NULL AND revoked_at IS NULL;
CREATE INDEX IF NOT EXISTS idx_access_requests_provisioned_project
ON access_requests(provisioned_project_id)
WHERE provisioned_project_id IS NOT NULL;
CREATE INDEX IF NOT EXISTS idx_access_requests_provisioned_user
ON access_requests(provisioned_user_id)
WHERE provisioned_user_id IS NOT NULL;