Files
gochat/backend/migrations/000086_repair_assignment_policy_schema.up.sql
T
Rogeeandrogee 4eeb0f8957 HH-597: repair assignment policy migration parity (#156)
* fix(HH-597): repair assignment policy schema migration

* fix(HH-597): harden assignment policy migration

---------

Co-authored-by: Rogee <rogee@ipao.vip>
2026-08-24 13:09:13 +08:00

65 lines
2.4 KiB
SQL

ALTER TABLE assignment_policies
ADD COLUMN IF NOT EXISTS name VARCHAR(255),
ADD COLUMN IF NOT EXISTS description TEXT NOT NULL DEFAULT '',
ADD COLUMN IF NOT EXISTS assignment_order INTEGER NOT NULL DEFAULT 0,
ADD COLUMN IF NOT EXISTS conversation_priority INTEGER NOT NULL DEFAULT 0,
ADD COLUMN IF NOT EXISTS fair_distribution_limit INTEGER NOT NULL DEFAULT 100,
ADD COLUMN IF NOT EXISTS fair_distribution_window INTEGER NOT NULL DEFAULT 3600;
UPDATE assignment_policies
SET name = COALESCE(NULLIF(policy_type, ''), 'Policy') || ' ' || id
WHERE name IS NULL OR name = '';
ALTER TABLE assignment_policies
ALTER COLUMN name SET NOT NULL;
CREATE UNIQUE INDEX IF NOT EXISTS idx_account_policy_name
ON assignment_policies(account_id, name);
DO $$
BEGIN
IF EXISTS (
SELECT 1
FROM assignment_policies
WHERE inbox_id IS NOT NULL
GROUP BY inbox_id
HAVING COUNT(*) > 1
) THEN
RAISE EXCEPTION 'migration 000086: multiple legacy assignment policies target one inbox';
END IF;
IF EXISTS (
SELECT 1
FROM assignment_policies
JOIN inboxes ON inboxes.id = assignment_policies.inbox_id
WHERE assignment_policies.inbox_id IS NOT NULL
AND assignment_policies.account_id <> inboxes.account_id
) THEN
RAISE EXCEPTION 'migration 000086: legacy assignment policy and inbox belong to different accounts';
END IF;
END
$$;
CREATE TABLE IF NOT EXISTS inbox_assignment_policies (
id BIGSERIAL PRIMARY KEY,
inbox_id BIGINT NOT NULL REFERENCES inboxes(id) ON DELETE CASCADE,
assignment_policy_id BIGINT NOT NULL REFERENCES assignment_policies(id) ON DELETE CASCADE,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
INSERT INTO inbox_assignment_policies(inbox_id, assignment_policy_id, created_at, updated_at)
SELECT assignment_policies.inbox_id, assignment_policies.id, assignment_policies.created_at, assignment_policies.updated_at
FROM assignment_policies
WHERE assignment_policies.inbox_id IS NOT NULL
AND NOT EXISTS (
SELECT 1
FROM inbox_assignment_policies
WHERE inbox_assignment_policies.inbox_id = assignment_policies.inbox_id
);
CREATE UNIQUE INDEX IF NOT EXISTS idx_inbox_assignment_policies_inbox_id
ON inbox_assignment_policies(inbox_id);
CREATE INDEX IF NOT EXISTS idx_inbox_assignment_policies_assignment_policy_id
ON inbox_assignment_policies(assignment_policy_id);