42 lines
1.8 KiB
SQL
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;
|