diff --git a/database/init.sql b/database/init.sql index 0314a35..74a9bf1 100644 --- a/database/init.sql +++ b/database/init.sql @@ -128,4 +128,6 @@ create table bilibili_dynamics ( index idx_sent_at(sent_at) comment '发送时间索引' )Engine=InnoDB comment '动态' charset 'utf8mb4'; -alter table bilibili_dynamics add column topic_details json default null comment '动态的#xxx#' after pictures; \ No newline at end of file +alter table bilibili_dynamics add column topic_details json default null comment '动态的#xxx#' after pictures; +alter table bilibili_dynamics add column feedback int default 0 comment '反馈类型' after dynamic_id; +alter table bilibili_dynamics add column verify boolean default false comment '是否审核过' after feedback; \ No newline at end of file diff --git a/internal/app/api/handler/bilbil_picture.go b/internal/app/api/handler/bilbil_picture.go index 3127ddc..e6cb8f7 100644 --- a/internal/app/api/handler/bilbil_picture.go +++ b/internal/app/api/handler/bilbil_picture.go @@ -2,6 +2,7 @@ package handler import ( "net/http" + "strconv" "git.vtb.link/eoefans/internal/app/api/apperrors" "git.vtb.link/eoefans/internal/app/api/help" @@ -52,3 +53,28 @@ func BilibiliRandomPic(s *service.BilbilPicture) func(ctx *gin.Context) { } } } + +func BilibiliPicFeedback(s *service.BilbilPicture) func(ctx *gin.Context) { + return func(ctx *gin.Context) { + var req idl.BilibiliPictureFeedbackReq + if err := ctx.ShouldBindJSON(&req); err != nil { + _ = ctx.Error(apperrors.NewValidationError(400, err.Error()).Wrap(err)) + return + } + if _, ok := idl.DynamicFeedbackMap[req.FeedBack]; !ok { + _ = ctx.Error(apperrors.NewValidationError(400, "invalid feedback value")) + return + } + dynamicID, err := strconv.ParseUint(req.DynamicIDStr, 10, 64) + if err != nil { + _ = ctx.Error(apperrors.NewValidationError(400, "invalid dynamic_id")) + return + } + if err := s.FeedBack(ctx, req.FeedBack, dynamicID); err != nil { + _ = ctx.Error(err) + return + } else { + ctx.JSON(http.StatusOK, help.SuccessJson(req)) + } + } +} diff --git a/internal/app/api/idl/bilibili_picture.go b/internal/app/api/idl/bilibili_picture.go index 4b1034a..6f591b3 100644 --- a/internal/app/api/idl/bilibili_picture.go +++ b/internal/app/api/idl/bilibili_picture.go @@ -7,11 +7,31 @@ import ( "time" ) +type DynamicFeedback int + +const ( + Default DynamicFeedback = 0 //无反馈 + Unrelated DynamicFeedback = 1 //不相关的图 + IncorrectTags DynamicFeedback = 2 //不正确的标签 + OnPeriod DynamicFeedback = 3 //不适宜在工作期间观看 + Uncomfortable DynamicFeedback = 4 //不适宜的内容 +) + +var DynamicFeedbackMap = map[DynamicFeedback]struct{}{ + Default: {}, + Unrelated: {}, + IncorrectTags: {}, + OnPeriod: {}, + Uncomfortable: {}, +} + // 图片来源于动态,以动态为单位 type BilibiliDynamic struct { ID uint64 `gorm:"primarykey"` UID uint64 `gorm:"column:uid"` DynamicID uint64 `gorm:"column:dynamic_id"` + Feedback DynamicFeedback `gorm:"column:feedback"` + Verify bool `gorm:"column:verify"` Pictures BilibiliDynamicPictures `gorm:"column:pictures"` TopicDetails *BilibiliDynamicTopicDetails `gorm:"topic_details"` TopicName string `gorm:"column:topic_name"` @@ -69,6 +89,10 @@ type BilibiliPictureLatestReq struct { TopicID int `form:"topic_id"` } +type BilibiliPictureFeedbackReq struct { + DynamicIDStr string `json:"dynamic_id_str"` + FeedBack DynamicFeedback `json:"feedback"` +} type BilibiliPictureRecommendReq struct { Page int `form:"page,default=1" binding:"omitempty,gt=0"` TopicID int `form:"topic_id"` @@ -137,4 +161,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 []*BilibiliDynamic, err error) + FeedBack(feedback DynamicFeedback, dynamicID uint64) error } diff --git a/internal/app/api/router/router.go b/internal/app/api/router/router.go index f6bcdc6..65c429e 100644 --- a/internal/app/api/router/router.go +++ b/internal/app/api/router/router.go @@ -34,6 +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)) } // 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 a78ae4f..a1c7955 100644 --- a/internal/app/api/service/bilbil_picture.go +++ b/internal/app/api/service/bilbil_picture.go @@ -211,3 +211,9 @@ func (service *BilbilPicture) Random(ctx context.Context) (*idl.BilibiliPictureR resp.DynamicURL = fmt.Sprintf(DynamicURL, pictures[idx].DynamicID) return resp, nil } + +func (service *BilbilPicture) FeedBack(ctx context.Context, feedback idl.DynamicFeedback, dynamicID uint64) error { + tx := service.db.WithContext(ctx) + picRepository := repository.NewBilibiliPicture(tx) + return picRepository.FeedBack(feedback, dynamicID) +} diff --git a/internal/repository/bilibili_picture.go b/internal/repository/bilibili_picture.go index 5c77ac8..3525a50 100644 --- a/internal/repository/bilibili_picture.go +++ b/internal/repository/bilibili_picture.go @@ -110,3 +110,19 @@ 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 +}