package logic import ( "context" "strings" "time" "spark-server/internal/module/friend/entity" "spark-server/internal/pkg/errs" "spark-server/internal/pkg/i18n" "spark-server/internal/pkg/reqctx" "spark-server/internal/pkg/validate" ) type ReportInput struct { Reason entity.ReportReason `json:"reason" validate:"required,oneof=1 2 3 4" label:"field.report_reason" errmsg:"required:validate.friend.report_reason_required;oneof:validate.friend.report_reason_invalid"` Detail string `json:"detail" validate:"omitempty,max=512" label:"field.report_detail" errmsg:"max:validate.friend.report_detail_invalid"` } func (s *Service) Report(ctx context.Context, userID, targetID int64, in ReportInput) error { if !s.ready() || userID <= 0 { return errs.ErrUnauthorized } if err := validate.StructLang(reqctx.Lang(ctx), in); err != nil { return err } if targetID <= 0 || entity.SameUser(userID, targetID) { return errs.ErrInvalidArgument.WithMsg(i18n.T(reqctx.Lang(ctx), i18n.KeyFriendSelf, nil)) } if _, err := s.activeUser(ctx, targetID); err != nil { return err } id, err := s.ids.NextID() if err != nil { return err } return s.repo.CreateReport(ctx, &entity.Report{ ID: id, UserID: userID, TargetID: targetID, Reason: in.Reason, Detail: strings.TrimSpace(in.Detail), CreatedAt: time.Now(), }) }