package sys import ( "context" "fmt" "strconv" "hotgo/internal/dao" "hotgo/internal/library/contexts" "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" ) func resolveImPolicyTenant(ctx context.Context, selectedTenantID int64) (tenantID int64, tenantCode string, err error) { operatorID := contexts.GetUserId(ctx) if service.AdminMember().VerifySuperId(ctx, operatorID) && selectedTenantID == 0 { return 0, "*", nil } scope, err := resolveImAdminScope(ctx, selectedTenantID) if err != nil { return 0, "", err } var tenant *entity.ImTenant if err = imtenant.RegistryDB().Model(dao.ImTenant.Table()).Safe().Ctx(ctx). Where(dao.ImTenant.Columns().Id, scope.TenantId).Scan(&tenant); err != nil { return 0, "", gerror.Wrap(err, "获取IM租户失败") } if tenant == nil { return 0, "", gerror.New("IM租户不存在") } return tenant.Id, tenant.Code, nil } func policyJSON(value *gjson.Json, fallback string) string { if value == nil || value.String() == "" || value.String() == "null" { return fallback } 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, TenantCode: tenantCode, EventType: eventType, Group: group, Keys: []string{"version", "payload"}, BizID: fmt.Sprintf("%s:%d:%d", group, tenantID, version), Actor: &imkafka.Actor{ Type: "admin", ID: strconv.FormatInt(contexts.GetUserId(ctx), 10), }, CreatedBy: contexts.GetUserId(ctx), }) }