package sys import ( "context" "net/url" "strings" "github.com/gogf/gf/v2/errors/gerror" "github.com/gogf/gf/v2/os/gctx" "hotgo/internal/library/contexts" "hotgo/internal/library/maoyuadmin" "hotgo/internal/model/input/sysin" "hotgo/internal/service" ) // 毛隅内容治理:概览、动态/评论审核、举报、操作日志。 // 与养成内容治理同一套页面协议,业务数据经 maoyu-server 内部接口处理,Manager 不直连毛隅业务库。 func init() { service.RegisterSysMaoyuContent(NewSysMaoyuContent()) } type sSysMaoyuContent struct{} func NewSysMaoyuContent() *sSysMaoyuContent { return &sSysMaoyuContent{} } // maoyuAdminScope 从管理员登录态构造毛隅内部接口调用范围。 func maoyuAdminScope(ctx context.Context) (maoyuadmin.Scope, error) { tenant, err := resolveImAdminTenant(ctx, cultivateTenantID(ctx)) if err != nil { return maoyuadmin.Scope{}, err } operatorID := contexts.GetUserId(ctx) if operatorID <= 0 { return maoyuadmin.Scope{}, gerror.New("当前管理员身份无效") } return maoyuadmin.Scope{ TenantID: tenant.Id, TenantCode: tenant.Code, OperatorID: operatorID, RoleKey: contexts.GetRoleKey(ctx), RequestID: gctx.CtxId(ctx), }, nil } func (s *sSysMaoyuContent) client(ctx context.Context) *maoyuadmin.Client { return maoyuadmin.DefaultClient(ctx) } func (s *sSysMaoyuContent) Dashboard(ctx context.Context, _ *sysin.MaoyuDashboardInp) (*sysin.MaoyuDashboardModel, error) { scope, err := maoyuAdminScope(ctx) if err != nil { return nil, err } result := new(sysin.MaoyuDashboardModel) if err = s.client(ctx).Get(ctx, scope, "/dashboard", nil, result); err != nil { return nil, err } return result, nil } func (s *sSysMaoyuContent) List(ctx context.Context, in *sysin.CultivateContentListInp) (list []*sysin.CultivateContentListModel, totalCount int, err error) { if err = in.Filter(ctx); err != nil { return nil, 0, err } scope, err := maoyuAdminScope(ctx) if err != nil { return nil, 0, err } normalizeCultivatePage(&in.PageReq) values := cultivatePageValues(in.Page, in.PerPage) cultivateSetQuery(values, "object_type", in.ObjectType) cultivateSetQuery(values, "author_id", in.AuthorId) cultivateSetQuery(values, "status", in.Status) cultivateSetQuery(values, "keyword", strings.TrimSpace(in.Keyword)) setTimeRange(values, in.CreatedAt) var page maoyuadmin.Page[*sysin.CultivateContentListModel] if err = s.client(ctx).Get(ctx, scope, "/content-reviews", values, &page); err != nil { return nil, 0, err } if page.Items == nil { page.Items = []*sysin.CultivateContentListModel{} } return page.Items, page.Total, nil } func (s *sSysMaoyuContent) View(ctx context.Context, in *sysin.CultivateContentViewInp) (*sysin.CultivateContentViewModel, error) { if err := in.Filter(ctx); err != nil { return nil, err } scope, err := maoyuAdminScope(ctx) if err != nil { return nil, err } result := new(sysin.CultivateContentViewModel) path := "/content-reviews/" + url.PathEscape(in.ObjectType) + "/" + url.PathEscape(in.Id) if err = s.client(ctx).Get(ctx, scope, path, nil, result); err != nil { return nil, err } return result, nil } func (s *sSysMaoyuContent) Review(ctx context.Context, in *sysin.CultivateContentReviewInp) error { if err := in.Filter(ctx); err != nil { return err } scope, err := maoyuAdminScope(ctx) if err != nil { return err } path := "/content-reviews/" + url.PathEscape(in.ObjectType) + "/" + url.PathEscape(in.Id) + "/actions" return s.client(ctx).Post(ctx, scope, path, map[string]any{"action": in.Action, "reason": strings.TrimSpace(in.Reason)}, nil) } func (s *sSysMaoyuContent) BatchReview(ctx context.Context, in *sysin.CultivateContentBatchReviewInp) (*sysin.CultivateContentBatchReviewModel, error) { if err := in.Filter(ctx); err != nil { return nil, err } scope, err := maoyuAdminScope(ctx) if err != nil { return nil, err } result := new(sysin.CultivateContentBatchReviewModel) err = s.client(ctx).Post(ctx, scope, "/content-reviews/batch-actions", map[string]any{ "object_type": in.ObjectType, "ids": in.Ids, "action": in.Action, "reason": strings.TrimSpace(in.Reason), }, result) if err != nil { return nil, err } return result, nil } func (s *sSysMaoyuContent) ReportList(ctx context.Context, in *sysin.CultivateReportListInp) (list []*sysin.CultivateReportListModel, totalCount int, err error) { if err = in.Filter(ctx); err != nil { return nil, 0, err } scope, err := maoyuAdminScope(ctx) if err != nil { return nil, 0, err } normalizeCultivatePage(&in.PageReq) values := cultivatePageValues(in.Page, in.PerPage) cultivateSetQuery(values, "object_type", in.ObjectType) cultivateSetQuery(values, "status", in.Status) cultivateSetQuery(values, "reporter_id", in.ReporterId) setTimeRange(values, in.CreatedAt) var page maoyuadmin.Page[*sysin.CultivateReportListModel] if err = s.client(ctx).Get(ctx, scope, "/reports", values, &page); err != nil { return nil, 0, err } if page.Items == nil { page.Items = []*sysin.CultivateReportListModel{} } return page.Items, page.Total, nil } func (s *sSysMaoyuContent) ReportView(ctx context.Context, in *sysin.CultivateReportViewInp) (*sysin.CultivateReportViewModel, error) { if err := in.Filter(ctx); err != nil { return nil, err } scope, err := maoyuAdminScope(ctx) if err != nil { return nil, err } result := new(sysin.CultivateReportViewModel) if err = s.client(ctx).Get(ctx, scope, "/reports/"+url.PathEscape(in.Id), nil, result); err != nil { return nil, err } return result, nil } func (s *sSysMaoyuContent) ReportHandle(ctx context.Context, in *sysin.CultivateReportHandleInp) error { if err := in.Filter(ctx); err != nil { return err } scope, err := maoyuAdminScope(ctx) if err != nil { return err } return s.client(ctx).Post(ctx, scope, "/reports/"+url.PathEscape(in.Id)+"/actions", map[string]any{ "action": in.Action, "handle_result": in.HandleResult, "content_action": in.ContentAction, "user_action": in.UserAction, "reason": in.Reason, }, nil) } func (s *sSysMaoyuContent) LogList(ctx context.Context, in *sysin.CultivateOperationLogListInp) (list []*sysin.CultivateOperationLogListModel, totalCount int, err error) { if err = in.Filter(ctx); err != nil { return nil, 0, err } scope, err := maoyuAdminScope(ctx) if err != nil { return nil, 0, err } normalizeCultivatePage(&in.PageReq) values := cultivatePageValues(in.Page, in.PerPage) cultivateSetQuery(values, "operator_id", in.OperatorId) cultivateSetQuery(values, "operation_type", in.OperationType) cultivateSetQuery(values, "target_type", in.TargetType) cultivateSetQuery(values, "target_id", in.TargetId) cultivateSetQuery(values, "request_id", in.RequestId) setTimeRange(values, in.CreatedAt) var page maoyuadmin.Page[*sysin.CultivateOperationLogListModel] if err = s.client(ctx).Get(ctx, scope, "/operation-logs", values, &page); err != nil { return nil, 0, err } if page.Items == nil { page.Items = []*sysin.CultivateOperationLogListModel{} } return page.Items, page.Total, nil }