* fix(HH-597): repair assignment policy schema migration * fix(HH-597): harden assignment policy migration --------- Co-authored-by: Rogee <rogee@ipao.vip>
65 lines
2.4 KiB
SQL
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);
|