123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151 |
- package service
- import (
- "context"
- "fmt"
- "math/rand"
- "net/http"
- "net/url"
- "path"
- "go-common/app/admin/main/member/model"
- comodel "go-common/app/service/main/coin/model"
- "go-common/library/ecode"
- "go-common/library/log"
- )
- var upNameCostCoins = 6.0
- type auditHandler func(ctx context.Context, origin *model.UserPropertyReview, arg *model.ArgReviewAudit) error
- func (s *Service) initAuditHandler() {
- s.auditHandlers[auditKey(model.ReviewPropertySign, true)] = s.onSignAudit
- s.auditHandlers[auditKey(model.ReviewPropertyName, true)] = s.onNameAudit
- s.auditHandlers[auditKey(model.ReviewPropertyFace, true)] = s.onFaceMonitorAudit
- s.auditHandlers[auditKey(model.ReviewPropertyFace, false)] = s.onFaceAudit
- }
- func auditKey(property int8, isMonitor bool) string {
- return fmt.Sprintf("%d-%t", property, isMonitor)
- }
- func (s *Service) onSignAudit(ctx context.Context, origin *model.UserPropertyReview, arg *model.ArgReviewAudit) error {
- switch arg.State {
- case model.ReviewStatePass:
- return s.dao.UpSign(ctx, origin.Mid, origin.New)
- case model.ReviewStateNoPass:
- if err := s.dao.Message(ctx, "违规签名处理通知", "抱歉,由于你的签名涉嫌违规,系统已将你的签名回退。如有疑问请联系客服。", []int64{origin.Mid}); err != nil {
- log.Error("Failed to send message: mid: %d: %+v", origin.Mid, err)
- }
- return nil
- }
- return nil
- }
- func (s *Service) onNameAudit(ctx context.Context, origin *model.UserPropertyReview, arg *model.ArgReviewAudit) error {
- switch arg.State {
- case model.ReviewStatePass:
- if origin.NickFree() {
- return s.dao.UpdateUname(ctx, origin.Mid, origin.New)
- }
- coins, err := s.coinRPC.UserCoins(ctx, &comodel.ArgCoinInfo{Mid: origin.Mid})
- if err != nil {
- return err
- }
- if coins < upNameCostCoins {
- return ecode.UpdateUnameMoneyIsNot
- }
- if err := s.dao.UpdateUname(ctx, origin.Mid, origin.New); err != nil {
- log.Error("faild to update Name, mid: %d, name: %s, %+v", origin.Mid, origin.New, err)
- return err
- }
- arg := &comodel.ArgModifyCoin{
- Mid: origin.Mid,
- Count: -upNameCostCoins,
- Reason: fmt.Sprintf("UPDATE:NICK:%s=>%s", origin.Old, origin.New),
- }
- if _, err := s.coinRPC.ModifyCoin(ctx, arg); err != nil {
- log.Error("faild to modify coin, arg: %+v, %+v", arg, err)
- return err
- }
- case model.ReviewStateNoPass:
- if err := s.dao.Message(ctx, "违规昵称处理通知", "抱歉,由于你的昵称涉嫌违规,系统已将你的昵称回退。如有疑问请联系客服。", []int64{origin.Mid}); err != nil {
- log.Error("Failed to send message: mid: %d: %+v", origin.Mid, err)
- }
- return nil
- }
- return nil
- }
- func (s *Service) onFaceAudit(ctx context.Context, origin *model.UserPropertyReview, arg *model.ArgReviewAudit) error {
- switch arg.State {
- case model.ReviewStateNoPass:
- if err := s.dao.UpFace(ctx, origin.Mid, ""); err != nil {
- return err
- }
- return s.faceReject(ctx, origin, arg)
- }
- return nil
- }
- func (s *Service) onFaceMonitorAudit(ctx context.Context, origin *model.UserPropertyReview, arg *model.ArgReviewAudit) error {
- switch arg.State {
- case model.ReviewStatePass:
- return s.dao.UpFace(ctx, origin.Mid, origin.New)
- case model.ReviewStateNoPass:
- return s.faceReject(ctx, origin, arg)
- }
- return nil
- }
- func (s *Service) mvToPrivate(ctx context.Context, face string) (string, error) {
- file, err := s.dao.Image(buildURL(face))
- if err != nil {
- return "", err
- }
- ftype := http.DetectContentType(file)
- privURL, err := s.dao.UploadImage(ctx, ftype, file, s.c.FacePriBFS)
- if err != nil {
- return "", err
- }
- if err := s.dao.DelImage(ctx, path.Base(privURL), s.c.FaceBFS); err != nil {
- log.Error("s.dao.DelImage(%v) error(%+v)", privURL, err)
- }
- return urlPath(privURL), nil
- }
- func buildURL(path string) string {
- return fmt.Sprintf("http://i%d.hdslb.com%s", rand.Int63n(3), path)
- }
- func urlPath(in string) string {
- URL, err := url.Parse(in)
- if err != nil {
- return ""
- }
- return URL.Path
- }
- func (s *Service) faceReject(ctx context.Context, origin *model.UserPropertyReview, arg *model.ArgReviewAudit) error {
- privFace, err := s.mvToPrivate(ctx, origin.New)
- if err != nil {
- log.Error("s.mvToPrivate(%d) error(%+v)", origin.Mid, err)
- return err
- }
- if err := s.dao.UpdateReviewFace(ctx, origin.ID, privFace); err != nil {
- log.Error("Failed to update review face: id: %d face: %s: %+v", origin.ID, privFace, err)
- return err
- }
- if err := s.dao.MvArchivedFaceToPriv(ctx, origin.New, privFace, arg.Operator, arg.Remark); err != nil {
- log.Error("mv archived face to private bucket mid(%d) error(%v)", origin.Mid, err)
- return err
- }
- if err := s.dao.Message(ctx, "违规头像处理通知", "抱歉,由于你的头像涉嫌违规,系统已将你的头像回退。如有疑问请联系客服。", []int64{origin.Mid}); err != nil {
- log.Error("Failed to send message: mid: %d: %+v", origin.Mid, err)
- }
- if err := s.dao.IncrFaceReject(ctx, origin.Mid); err != nil {
- log.Error("IncrFaceReject faild: mid: %d: %+v", origin.Mid, err)
- }
- return nil
- }
|