Refatcor policies management

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
This commit is contained in:
Bryan Frimin
2025-04-28 16:03:42 -07:00
parent c208131b85
commit a7cd94956a
59 changed files with 10112 additions and 2303 deletions

View File

@@ -0,0 +1,60 @@
CREATE TABLE policy_versions (
id TEXT PRIMARY KEY,
tenant_id TEXT NOT NULL,
policy_id TEXT NOT NULL REFERENCES policies(id) ON DELETE CASCADE,
version_number INTEGER NOT NULL,
content TEXT NOT NULL,
changelog TEXT NOT NULL,
created_by TEXT NOT NULL,
status policy_status NOT NULL,
published_by TEXT REFERENCES peoples(id),
published_at TIMESTAMP WITH TIME ZONE,
created_at TIMESTAMP WITH TIME ZONE NOT NULL,
updated_at TIMESTAMP WITH TIME ZONE NOT NULL,
UNIQUE(policy_id, version_number)
);
INSERT INTO policy_versions (
id,
tenant_id,
policy_id,
version_number,
content,
changelog,
created_by,
status,
published_by,
published_at,
created_at,
updated_at
)
SELECT
generate_gid(decode_base64_unpadded(p.tenant_id), 16),
p.tenant_id,
p.id,
1,
'',
'Initial version',
p.owner_id,
'DRAFT',
NULL,
NULL,
p.created_at,
p.updated_at
FROM policies p;
ALTER TABLE policies RENAME COLUMN name TO title;
ALTER TABLE policies DROP COLUMN content;
ALTER TABLE policies ADD COLUMN description TEXT NOT NULL DEFAULT '';
ALTER TABLE policies ALTER COLUMN owner_id DROP NOT NULL;
ALTER TABLE policies DROP COLUMN review_date;
ALTER TABLE policies DROP COLUMN status;
ALTER TABLE policies ADD COLUMN current_published_version INTEGER;
UPDATE policies p
SET current_published_version = 1
WHERE EXISTS (
SELECT 1 FROM policy_versions pv
WHERE pv.policy_id = p.id
AND pv.status = 'published'
);

View File

@@ -0,0 +1,22 @@
CREATE TYPE policy_status_new AS ENUM ('DRAFT', 'PUBLISHED');
ALTER TABLE policy_versions ADD COLUMN temp_status TEXT;
UPDATE policy_versions SET temp_status =
CASE WHEN status::TEXT = 'ACTIVE' THEN 'PUBLISHED'
ELSE status::TEXT
END;
ALTER TABLE policy_versions DROP COLUMN status;
ALTER TABLE policy_versions ADD COLUMN status policy_status_new;
UPDATE policy_versions SET status = temp_status::policy_status_new;
ALTER TABLE policy_versions DROP COLUMN temp_status;
DROP TYPE policy_status;
ALTER TYPE policy_status_new RENAME TO policy_status;
CREATE UNIQUE INDEX policy_one_draft_version_idx ON policy_versions (policy_id, status)
WHERE status = 'DRAFT';

View File

@@ -0,0 +1,15 @@
CREATE TYPE policy_version_signature_state AS ENUM ('REQUESTED', 'SIGNED');
CREATE TABLE policy_version_signatures (
id TEXT PRIMARY KEY,
tenant_id TEXT NOT NULL,
policy_version_id TEXT NOT NULL REFERENCES policy_versions(id) ON DELETE CASCADE,
state policy_version_signature_state NOT NULL,
signed_by TEXT NOT NULL REFERENCES peoples(id),
signed_at TIMESTAMP WITH TIME ZONE,
requested_at TIMESTAMP WITH TIME ZONE NOT NULL,
requested_by TEXT NOT NULL REFERENCES peoples(id),
created_at TIMESTAMP WITH TIME ZONE NOT NULL,
updated_at TIMESTAMP WITH TIME ZONE NOT NULL,
UNIQUE (policy_version_id, signed_by)
);