95 lines
3.2 KiB
Go
95 lines
3.2 KiB
Go
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),
|
|
})
|
|
}
|