feat: 将安全策略模板化,新建商户时自动复制初始策略

This commit is contained in:
Austin
2026-09-22 18:32:08 +08:00
parent 9a9e30f94e
commit dc3c45cd53
17 changed files with 1172 additions and 795 deletions
@@ -10,8 +10,10 @@ import (
"hotgo/internal/library/imkafka"
"hotgo/internal/library/imtenant"
"hotgo/internal/model/entity"
"hotgo/internal/model/input/sysin"
"hotgo/internal/service"
"github.com/gogf/gf/v2/database/gdb"
"github.com/gogf/gf/v2/encoding/gjson"
"github.com/gogf/gf/v2/errors/gerror"
)
@@ -43,6 +45,38 @@ func policyJSON(value *gjson.Json, fallback string) string {
return value.String()
}
// imPolicyTemplateTable 安全策略模板表(平台级单行,新建商户初始策略来源)
const imPolicyTemplateTable = "im_security_policy_template"
// loadPolicyTemplateRow 读取安全策略模板单行(取最小 id),返回 nil 表示模板未初始化。
func loadPolicyTemplateRow(model *gdb.Model) (gdb.Record, error) {
row, err := model.Order("id ASC").Limit(1).One()
if err != nil {
return nil, err
}
if row.IsEmpty() {
return nil, nil
}
return row, nil
}
// templateCurfewRules 解析模板行 curfew_rules JSON 为宵禁规则输入列表
func templateCurfewRules(tpl gdb.Record) []*sysin.ImMessageCurfewRuleInp {
rules := make([]*sysin.ImMessageCurfewRuleInp, 0)
for _, item := range gjson.New(tpl["curfew_rules"].String()).Array() {
j := gjson.New(item)
rules = append(rules, &sysin.ImMessageCurfewRuleInp{
RuleCode: j.Get("ruleCode").String(), RuleName: j.Get("ruleName").String(), DateType: j.Get("dateType").String(),
CustomDates: gjson.New(j.Get("customDates").String()), Weekdays: gjson.New(j.Get("weekdays").String()),
Timezone: j.Get("timezone").String(), StartTime: j.Get("startTime").String(), EndTime: j.Get("endTime").String(),
Scope: j.Get("scope").String(),
WhitelistUserIds: gjson.New(j.Get("whitelistUserIds").String()), WhitelistGroupIds: gjson.New(j.Get("whitelistGroupIds").String()),
Message: j.Get("message").String(), Status: j.Get("status").Int(), Sort: j.Get("sort").Int(),
})
}
return rules
}
func publishImPolicyEvent(ctx context.Context, tenantID int64, tenantCode, eventType, group string, version uint) error {
return imkafka.PublishConfigEvent(ctx, imkafka.ConfigEventInput{
TenantID: tenantID,