Files
im_manager/server/internal/logic/sys/im_kafka_audit.go
T

142 lines
4.0 KiB
Go

package sys
import (
"context"
"hotgo/internal/library/imtenant"
"hotgo/internal/model/input/sysin"
"hotgo/internal/service"
"strings"
"github.com/gogf/gf/v2/errors/gerror"
)
type sSysImKafkaAudit struct{}
func NewSysImKafkaAudit() *sSysImKafkaAudit {
return &sSysImKafkaAudit{}
}
func init() {
service.RegisterSysImKafkaAudit(NewSysImKafkaAudit())
}
func (s *sSysImKafkaAudit) List(ctx context.Context, in *sysin.ImKafkaAuditListInp) (list []*sysin.ImKafkaAuditListModel, totalCount int, err error) {
if err = in.Filter(ctx); err != nil {
return
}
where, args := buildImKafkaAuditWhere(in)
db := imtenant.RegistryDB()
totalValue, err := db.GetValue(ctx, "SELECT COUNT(*) FROM im_audit_events "+where, args...)
if err != nil {
err = gerror.Wrap(err, "获取IM Kafka审计事件总数失败,请稍后重试!")
return
}
totalCount = totalValue.Int()
page := in.Page
if page <= 0 {
page = 1
}
perPage := in.PerPage
if perPage <= 0 {
perPage = 20
}
offset := (page - 1) * perPage
query := `SELECT id,event_id,tenant_code,event_type,biz_type,biz_id,actor_type,actor_id,
action,resource,resource_id,result,reason,occurred_at,received_at
FROM im_audit_events ` + where + ` ORDER BY id DESC LIMIT ? OFFSET ?`
queryArgs := append(append([]any{}, args...), perPage, offset)
rows, err := db.GetAll(ctx, query, queryArgs...)
if err != nil {
err = gerror.Wrap(err, "获取IM Kafka审计事件列表失败,请稍后重试!")
return
}
if err = rows.Structs(&list); err != nil {
err = gerror.Wrap(err, "解析IM Kafka审计事件列表失败,请稍后重试!")
}
return
}
func buildImKafkaAuditWhere(in *sysin.ImKafkaAuditListInp) (string, []any) {
parts := []string{"1=1"}
args := []any{}
if in.TenantCode != "" {
parts = append(parts, "tenant_code=?")
args = append(args, in.TenantCode)
}
if in.EventId != "" {
parts = append(parts, "event_id LIKE ?")
args = append(args, "%"+in.EventId+"%")
}
if in.EventType != "" {
parts = append(parts, "event_type LIKE ?")
args = append(args, "%"+in.EventType+"%")
}
if in.BizType != "" {
parts = append(parts, "biz_type=?")
args = append(args, in.BizType)
}
if in.BizId != "" {
parts = append(parts, "biz_id LIKE ?")
args = append(args, "%"+in.BizId+"%")
}
if in.ActorType != "" {
parts = append(parts, "actor_type=?")
args = append(args, in.ActorType)
}
if in.ActorId != "" {
parts = append(parts, "actor_id LIKE ?")
args = append(args, "%"+in.ActorId+"%")
}
if in.Action != "" {
parts = append(parts, "action LIKE ?")
args = append(args, "%"+in.Action+"%")
}
if in.Resource != "" {
parts = append(parts, "resource=?")
args = append(args, in.Resource)
}
if in.ResourceId != "" {
parts = append(parts, "resource_id LIKE ?")
args = append(args, "%"+in.ResourceId+"%")
}
if in.Result != "" {
parts = append(parts, "result=?")
args = append(args, in.Result)
}
if len(in.CreatedAt) == 2 {
parts = append(parts, "received_at BETWEEN ? AND ?")
args = append(args, in.CreatedAt[0], in.CreatedAt[1])
}
return "WHERE " + strings.Join(parts, " AND "), args
}
func (s *sSysImKafkaAudit) View(ctx context.Context, in *sysin.ImKafkaAuditViewInp) (res *sysin.ImKafkaAuditViewModel, err error) {
if err = in.Filter(ctx); err != nil {
return nil, err
}
query := `SELECT id,event_id,tenant_code,event_type,biz_type,biz_id,actor_type,actor_id,
action,resource,resource_id,result,reason,CAST(payload AS CHAR) payload,
CAST(envelope AS CHAR) envelope,occurred_at,received_at FROM im_audit_events WHERE `
args := []any{}
if in.Id > 0 {
query += "id=?"
args = append(args, in.Id)
} else {
query += "event_id=?"
args = append(args, in.EventId)
}
query += " LIMIT 1"
row, err := imtenant.RegistryDB().GetOne(ctx, query, args...)
if err != nil {
return nil, gerror.Wrap(err, "获取IM Kafka审计事件详情失败,请稍后重试!")
}
if row.IsEmpty() {
return nil, nil
}
if err = row.Struct(&res); err != nil {
return nil, gerror.Wrap(err, "解析IM Kafka审计事件详情失败,请稍后重试!")
}
return
}