diff --git a/internal/app/api/handler/bilbil_picture.go b/internal/app/api/handler/bilbil_picture.go index e6cb8f7..aa49d6d 100644 --- a/internal/app/api/handler/bilbil_picture.go +++ b/internal/app/api/handler/bilbil_picture.go @@ -54,9 +54,9 @@ func BilibiliRandomPic(s *service.BilbilPicture) func(ctx *gin.Context) { } } -func BilibiliPicFeedback(s *service.BilbilPicture) func(ctx *gin.Context) { +func BilibiliPicVerify(s *service.BilbilPicture) func(ctx *gin.Context) { return func(ctx *gin.Context) { - var req idl.BilibiliPictureFeedbackReq + var req idl.BilibiliPictureVerifyReq if err := ctx.ShouldBindJSON(&req); err != nil { _ = ctx.Error(apperrors.NewValidationError(400, err.Error()).Wrap(err)) return @@ -70,7 +70,7 @@ func BilibiliPicFeedback(s *service.BilbilPicture) func(ctx *gin.Context) { _ = ctx.Error(apperrors.NewValidationError(400, "invalid dynamic_id")) return } - if err := s.FeedBack(ctx, req.FeedBack, dynamicID); err != nil { + if err := s.Verify(ctx, req, dynamicID); err != nil { _ = ctx.Error(err) return } else { diff --git a/internal/app/api/idl/bilibili_picture.go b/internal/app/api/idl/bilibili_picture.go index 9328e3b..8421804 100644 --- a/internal/app/api/idl/bilibili_picture.go +++ b/internal/app/api/idl/bilibili_picture.go @@ -127,9 +127,10 @@ type BilibiliPictureLatestReq struct { TopicID int `form:"topic_id"` } -type BilibiliPictureFeedbackReq struct { +type BilibiliPictureVerifyReq struct { DynamicIDStr string `json:"dynamic_id_str"` FeedBack DynamicFeedback `json:"feedback"` + ImgID uint64 `json:"img_id"` } type BilibiliPictureRecommendReq struct { Page int `form:"page,default=1" binding:"omitempty,gt=0"` @@ -160,6 +161,7 @@ type BilibiliDynamicDTO struct { Pictures BilibiliDynamicPictures `json:"pictures"` SentAt uint64 `json:"sent_at"` DynamicIDStr string `json:"dynamic_id_str"` + Verify bool `json:"verify"` } type BilibiliRandomPictures []BilibiliRandomPicture type BilibiliRandomPicture struct { @@ -211,5 +213,5 @@ type BilibiliPictureRepository interface { Latest(page, size, topicID int) (list []*BilibiliDynamic, err error) Recommend(from, to time.Time, page, size, topicID int) (list []*BilibiliDynamic, err error) Random(rand float64) (list []*BilibiliPicture, err error) - FeedBack(feedback DynamicFeedback, dynamicID uint64) error + Verify(req BilibiliPictureVerifyReq, dynamicID uint64) error } diff --git a/internal/app/api/router/router.go b/internal/app/api/router/router.go index 65c429e..de83842 100644 --- a/internal/app/api/router/router.go +++ b/internal/app/api/router/router.go @@ -34,7 +34,7 @@ func InitRouters( picApi.GET("/latest", handler.BilibiliLatestPics(picService)) picApi.GET("/recommend", handler.BilibiliRecommendPics(picService)) picApi.GET("/random", handler.BilibiliRandomPic(picService)) - picApi.POST("/feedback", handler.BilibiliPicFeedback(picService)) + picApi.POST("/feedback", handler.BilibiliPicVerify(picService)) } // Auth相关 authApi := r.Group("/v1/auth") diff --git a/internal/app/api/service/bilbil_picture.go b/internal/app/api/service/bilbil_picture.go index d2c9e41..f9284a0 100644 --- a/internal/app/api/service/bilbil_picture.go +++ b/internal/app/api/service/bilbil_picture.go @@ -129,7 +129,11 @@ func (service *BilbilPicture) Latest(ctx context.Context, req idl.BilibiliPictur SentAt: list[i].SentAt, DynamicIDStr: fmt.Sprintf("%d", list[i].DynamicID), } + verifyCount := 0 for j := range list[i].Pics { + if list[i].Pics[j].Verify { + verifyCount += 1 + } pic := idl.BilibiliDynamicPicture{ ImgSrc: list[i].Pics[j].ImgSrc, ImgID: list[i].Pics[j].ID, @@ -137,6 +141,9 @@ func (service *BilbilPicture) Latest(ctx context.Context, req idl.BilibiliPictur pic.BilibiliPictureAttr = list[i].Pics[j].ImgAttr dto.Pictures = append(dto.Pictures, pic) } + if verifyCount == len(list[i].Pics) { + dto.Verify = true + } resp.Result = append(resp.Result, dto) } return &resp, nil @@ -160,7 +167,11 @@ func (service *BilbilPicture) Recommend(ctx context.Context, req idl.BilibiliPic SentAt: list[i].SentAt, DynamicIDStr: fmt.Sprintf("%d", list[i].DynamicID), } + verifyCount := 0 for j := range list[i].Pics { + if list[i].Pics[j].Verify { + verifyCount += 1 + } pic := idl.BilibiliDynamicPicture{ ImgSrc: list[i].Pics[j].ImgSrc, ImgID: list[i].Pics[j].ID, @@ -168,6 +179,9 @@ func (service *BilbilPicture) Recommend(ctx context.Context, req idl.BilibiliPic pic.BilibiliPictureAttr = list[i].Pics[j].ImgAttr dto.Pictures = append(dto.Pictures, pic) } + if verifyCount == len(list[i].Pics) { + dto.Verify = true + } resp.Result = append(resp.Result, dto) } return &resp, nil @@ -230,8 +244,8 @@ func (service *BilbilPicture) Random(ctx context.Context) (*idl.BilibiliPictureR return resp, nil } -func (service *BilbilPicture) FeedBack(ctx context.Context, feedback idl.DynamicFeedback, dynamicID uint64) error { +func (service *BilbilPicture) Verify(ctx context.Context, req idl.BilibiliPictureVerifyReq, dynamicID uint64) error { tx := service.db.WithContext(ctx) picRepository := repository.NewBilibiliPicture(tx) - return picRepository.FeedBack(feedback, dynamicID) + return picRepository.Verify(req, dynamicID) } diff --git a/internal/repository/bilibili_picture.go b/internal/repository/bilibili_picture.go index 5dff3ac..31bdd42 100644 --- a/internal/repository/bilibili_picture.go +++ b/internal/repository/bilibili_picture.go @@ -85,7 +85,7 @@ func (impl *BilibiliPictureMysqlImpl) FindMaxDynamicID(topicName string) (*uint6 func (impl *BilibiliPictureMysqlImpl) FindAllByPubDate(from, to time.Time, page, size int64) (list []*idl.BilibiliDynamic, err error) { err = impl.tx.Table(idl.BilibiliDynamic{}.TableName()). - Where("sent_at >= ? AND sent_at <= ?", from.Unix(), to.Unix()). + Where("sent_at >= ? AND sent_at <= ? AND pictures_num > 0", from.Unix(), to.Unix()). Select("dynamic_id"). Offset(int((page - 1) * size)).Limit(int(size)). Order("sent_at DESC"). @@ -105,10 +105,10 @@ func (impl *BilibiliPictureMysqlImpl) Latest(page, size, topicID int) (list []*i if offset < 0 { offset = -1 } - err = conn.Where("pictures_num <> 0").Select("dynamic_id,sent_at"). + err = conn.Where("pictures_num > 0").Select("dynamic_id,sent_at"). Order("sent_at DESC"). Offset(offset). - Limit(size).Preload("Pics").Find(&list).Error + Limit(size).Preload("Pics", "feedback = ?", 0).Find(&list).Error if err != nil { return nil, err } @@ -125,10 +125,10 @@ func (impl *BilibiliPictureMysqlImpl) Recommend(from, to time.Time, page, size, offset = -1 } err = conn.Select("dynamic_id,sent_at"). - Where("sent_at >= ? AND sent_at <= ? AND pictures_num <> 0", from.Unix(), to.Unix()). + Where("sent_at >= ? AND sent_at <= ? AND pictures_num > 0", from.Unix(), to.Unix()). Order("favor DESC"). Offset(offset). - Limit(size).Preload("Pics").Find(&list).Error + Limit(size).Preload("Pics", "feedback = ?", 0).Find(&list).Error if err != nil { return nil, err } @@ -147,7 +147,7 @@ func (impl *BilibiliPictureMysqlImpl) Random(rand float64) (list []*idl.Bilibili return nil, err } offset := math.Floor((pair.MaxId - pair.MinId) * rand) - err = conn.Where("id >= ?", uint64(pair.MinId+offset)). + err = conn.Where("id >= ? AND feedback = 0", uint64(pair.MinId+offset)). Select("id,dynamic_id,img_src,img_attr,verify"). Preload("Dynamic").Limit(5).Find(&list).Error if err != nil { @@ -156,18 +156,27 @@ func (impl *BilibiliPictureMysqlImpl) Random(rand float64) (list []*idl.Bilibili return list, nil } -func (impl *BilibiliPictureMysqlImpl) FeedBack(feedback idl.DynamicFeedback, dynamicID uint64) error { - var dynamic idl.BilibiliDynamic - err := impl.tx.Table(idl.BilibiliDynamic{}.TableName()). - Where("dynamic_id = ?", dynamicID). - Select("verify").First(&dynamic).Error - if err != nil { - return err - } - if dynamic.Verify { - return nil - } - return impl.tx.Table(idl.BilibiliDynamic{}.TableName()). - Where("dynamic_id = ?", dynamicID). - UpdateColumn("feedback", feedback).Error +func (impl *BilibiliPictureMysqlImpl) Verify(req idl.BilibiliPictureVerifyReq, dynamicID uint64) error { + return impl.tx.Transaction(func(_tx *gorm.DB) error { + conn := _tx.Table(idl.BilibiliPicture{}.TableName()) + if req.ImgID != 0 { + conn = conn.Where("id = ?", req.ImgID) + } else { + conn = conn.Where("dynamic_id = ?", dynamicID) + } + updates := map[string]interface{}{ + "feedback": req.FeedBack, + "verify": true, + } + conn = conn.Where("verify = ?", false).Updates(&updates) + if conn.Error != nil { + return conn.Error + } + if conn.RowsAffected == 0 || req.FeedBack == 0 { + return nil + } + return _tx.Table(idl.BilibiliDynamic{}.TableName()). + Where("dynamic_id = ?", dynamicID). + UpdateColumn("pictures_num", gorm.Expr("pictures_num - ?", conn.RowsAffected)).Error + }) }