Files
im_manager/server/storage/data/generate/im_policy_template.sql
T

116 lines
6.6 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- IM 安全策略模板表迁移(幂等,可重复执行)
-- 背景:全局默认策略从 im_security_policy.tenant_id=0 记录改为独立模板表 im_security_policy_template(单行)。
-- 每次新增商户时从模板复制一份为商户初始策略,商户后续修改只改副本。
-- 1. 建模板表(永远单行 id=1,平台级,宵禁规则以 JSON 数组存储)
CREATE TABLE IF NOT EXISTS `im_security_policy_template` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
`policy_name` varchar(100) NOT NULL DEFAULT '默认安全策略模板',
`password_policy` text,
`login_rate_limit` text,
`sensitive_word_policy` text,
`file_review_policy` text,
`realname_policy` text,
`risk_challenge_policy` text,
`global_friend_enabled` tinyint NOT NULL DEFAULT 1,
`friend_disabled_policy` text,
`message_curfew_enabled` tinyint NOT NULL DEFAULT 0,
`curfew_rules` text COMMENT '宵禁规则JSON数组',
`remark` varchar(255) DEFAULT '',
`created_at` datetime DEFAULT NULL,
`created_by` bigint DEFAULT 0,
`updated_at` datetime DEFAULT NULL,
`updated_by` bigint DEFAULT 0,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='IM安全策略模板(新建商户初始策略来源)';
-- 2. 从 tenant_id=0 published 记录迁入模板字段(仅当模板表为空)
INSERT INTO `im_security_policy_template`
(`policy_name`, `password_policy`, `login_rate_limit`, `sensitive_word_policy`, `file_review_policy`, `realname_policy`, `risk_challenge_policy`, `global_friend_enabled`, `friend_disabled_policy`, `message_curfew_enabled`, `curfew_rules`, `remark`, `created_at`, `created_by`)
SELECT
IFNULL(sp.policy_name, '默认安全策略模板'),
IFNULL(CAST(sp.password_policy AS CHAR), '{}'),
IFNULL(CAST(sp.login_rate_limit AS CHAR), '{"enabled":false}'),
IFNULL(CAST(sp.sensitive_word_policy AS CHAR), '{}'),
IFNULL(CAST(sp.file_review_policy AS CHAR), '{}'),
IFNULL(CAST(sp.realname_policy AS CHAR), '{}'),
IFNULL(CAST(sp.risk_challenge_policy AS CHAR), '{}'),
IFNULL(sp.global_friend_enabled, 1),
IFNULL(CAST(sp.friend_disabled_policy AS CHAR), '{}'),
IFNULL(sp.message_curfew_enabled, 0),
'[]',
'由全局默认策略迁移',
NOW(), 0
FROM (SELECT 1) dummy
LEFT JOIN `im_security_policy` sp ON sp.tenant_id = 0 AND sp.publish_status = 'published' AND sp.deleted_at IS NULL
WHERE (SELECT COUNT(*) FROM `im_security_policy_template`) = 0
ORDER BY sp.policy_version DESC
LIMIT 1;
-- 3. 模板宵禁规则:从 tenant_id=0 记录的宵禁规则聚合为 JSON(仅当模板 curfew_rules 为空数组)
UPDATE `im_security_policy_template` t
SET t.curfew_rules = (
SELECT COALESCE(JSON_ARRAYAGG(JSON_OBJECT(
'ruleCode', r.rule_code, 'ruleName', r.rule_name, 'dateType', r.date_type,
'customDates', CAST(r.custom_dates AS JSON), 'weekdays', CAST(r.weekdays AS JSON),
'timezone', r.timezone,
'startTime', TIME_FORMAT(r.start_time, '%H:%i'), 'endTime', TIME_FORMAT(r.end_time, '%H:%i'),
'scope', r.scope,
'whitelistUserIds', CAST(r.whitelist_user_ids AS JSON), 'whitelistGroupIds', CAST(r.whitelist_group_ids AS JSON),
'message', r.message, 'status', r.status, 'sort', r.sort
)), JSON_ARRAY())
FROM `im_message_curfew_rules` r
WHERE r.tenant_id = 0 AND r.deleted_at IS NULL
AND r.policy_id = (SELECT sp.id FROM `im_security_policy` sp WHERE sp.tenant_id = 0 AND sp.publish_status = 'published' AND sp.deleted_at IS NULL ORDER BY sp.policy_version DESC LIMIT 1)
)
WHERE (t.curfew_rules IS NULL OR JSON_LENGTH(t.curfew_rules) = 0);
-- 4. 存量商户补齐:tenant_id>0 且无 published 记录的商户,从模板复制策略行(version=1, published)
INSERT INTO `im_security_policy`
(`tenant_id`, `policy_version`, `policy_name`, `publish_status`, `password_policy`, `login_rate_limit`, `sensitive_word_policy`, `file_review_policy`, `realname_policy`, `risk_challenge_policy`, `global_friend_enabled`, `friend_disabled_policy`, `message_curfew_enabled`, `remark`, `published_at`, `published_by`, `created_at`, `created_by`, `updated_at`, `updated_by`)
SELECT
tt.id, 1, t.policy_name, 'published',
t.password_policy, t.login_rate_limit, t.sensitive_word_policy, t.file_review_policy, t.realname_policy, t.risk_challenge_policy,
t.global_friend_enabled, t.friend_disabled_policy, t.message_curfew_enabled,
'由默认模板补齐', NOW(), 0, NOW(), 0, NOW(), 0
FROM `im_tenant` tt
JOIN `im_security_policy_template` t ON t.id = (SELECT MIN(x.id) FROM `im_security_policy_template` x)
WHERE tt.id > 0 AND tt.state = 1
AND NOT EXISTS (
SELECT 1 FROM `im_security_policy` sp
WHERE sp.tenant_id = tt.id AND sp.publish_status = 'published' AND sp.deleted_at IS NULL
);
-- 5. 存量商户补齐宵禁规则:从模板 JSON 展开(仅对当前无任何宵禁规则的商户策略,已有配置的商户不覆盖)
INSERT INTO `im_message_curfew_rules`
(`tenant_id`, `policy_id`, `rule_code`, `rule_name`, `date_type`, `custom_dates`, `weekdays`, `timezone`, `start_time`, `end_time`, `scope`, `whitelist_user_ids`, `whitelist_group_ids`, `message`, `status`, `sort`, `created_at`, `created_by`, `updated_at`, `updated_by`)
SELECT
sp.tenant_id, sp.id,
JSON_UNQUOTE(JSON_EXTRACT(jt.r, '$.ruleCode')),
JSON_UNQUOTE(JSON_EXTRACT(jt.r, '$.ruleName')),
JSON_UNQUOTE(JSON_EXTRACT(jt.r, '$.dateType')),
JSON_EXTRACT(jt.r, '$.customDates'),
JSON_EXTRACT(jt.r, '$.weekdays'),
JSON_UNQUOTE(JSON_EXTRACT(jt.r, '$.timezone')),
STR_TO_DATE(JSON_UNQUOTE(JSON_EXTRACT(jt.r, '$.startTime')), '%H:%i'),
STR_TO_DATE(JSON_UNQUOTE(JSON_EXTRACT(jt.r, '$.endTime')), '%H:%i'),
JSON_UNQUOTE(JSON_EXTRACT(jt.r, '$.scope')),
JSON_EXTRACT(jt.r, '$.whitelistUserIds'),
JSON_EXTRACT(jt.r, '$.whitelistGroupIds'),
JSON_UNQUOTE(JSON_EXTRACT(jt.r, '$.message')),
CAST(JSON_EXTRACT(jt.r, '$.status') AS SIGNED),
CAST(JSON_EXTRACT(jt.r, '$.sort') AS SIGNED),
NOW(), 0, NOW(), 0
FROM `im_security_policy` sp
JOIN `im_security_policy_template` tpl
JOIN JSON_TABLE(tpl.curfew_rules, '$[*]' COLUMNS (r JSON PATH '$')) jt
WHERE tpl.id = (SELECT MIN(x.id) FROM `im_security_policy_template` x)
AND sp.tenant_id > 0 AND sp.publish_status = 'published' AND sp.deleted_at IS NULL
AND NOT EXISTS (SELECT 1 FROM `im_message_curfew_rules` r WHERE r.policy_id = sp.id AND r.deleted_at IS NULL);
-- 6. 软删 tenant_id=0 的策略记录与其宵禁规则(模板化后不再使用,保留软删可回溯)
UPDATE `im_security_policy` SET deleted_at = NOW(), deleted_by = 0
WHERE tenant_id = 0 AND deleted_at IS NULL;
UPDATE `im_message_curfew_rules` SET deleted_at = NOW(), deleted_by = 0
WHERE tenant_id = 0 AND deleted_at IS NULL;