This is an automated email from the ASF dual-hosted git repository. linkinstar pushed a commit to branch feat/1.3.1/review in repository https://gitbox.apache.org/repos/asf/incubator-answer.git
commit c7f9d08ec777df01f356507ce38de81d061a14e3 Author: LinkinStars <[email protected]> AuthorDate: Wed Mar 27 17:12:46 2024 +0800 feat(plugin): add review status --- internal/service/content/answer_service.go | 9 +++---- internal/service/content/question_service.go | 9 +++---- internal/service/review/review_service.go | 38 ++++++++++++++++++++-------- plugin/reviewer.go | 10 ++++++++ 4 files changed, 44 insertions(+), 22 deletions(-) diff --git a/internal/service/content/answer_service.go b/internal/service/content/answer_service.go index d96d75c5..1b113270 100644 --- a/internal/service/content/answer_service.go +++ b/internal/service/content/answer_service.go @@ -241,12 +241,9 @@ func (as *AnswerService) Insert(ctx context.Context, req *schema.AnswerAddReq) ( if err = as.answerRepo.AddAnswer(ctx, insertData); err != nil { return "", err } - if as.reviewService.AddAnswerReview(ctx, insertData) { - if err := as.answerRepo.UpdateAnswerStatus(ctx, insertData.ID, entity.AnswerStatusAvailable); err != nil { - return "", err - } else { - insertData.Status = entity.AnswerStatusAvailable - } + insertData.Status = as.reviewService.AddAnswerReview(ctx, insertData) + if err := as.answerRepo.UpdateAnswerStatus(ctx, insertData.ID, insertData.Status); err != nil { + return "", err } err = as.questionCommon.UpdateAnswerCount(ctx, req.QuestionID) if err != nil { diff --git a/internal/service/content/question_service.go b/internal/service/content/question_service.go index e4f2b499..d717a465 100644 --- a/internal/service/content/question_service.go +++ b/internal/service/content/question_service.go @@ -327,12 +327,9 @@ func (qs *QuestionService) AddQuestion(ctx context.Context, req *schema.Question if err != nil { return } - if qs.reviewService.AddQuestionReview(ctx, question, req.Tags) { - if err := qs.questionRepo.UpdateQuestionStatus(ctx, question.ID, entity.QuestionStatusAvailable); err != nil { - return nil, err - } else { - question.Status = entity.AnswerStatusAvailable - } + question.Status = qs.reviewService.AddQuestionReview(ctx, question, req.Tags) + if err := qs.questionRepo.UpdateQuestionStatus(ctx, question.ID, question.Status); err != nil { + return nil, err } objectTagData := schema.TagChange{} objectTagData.ObjectID = question.ID diff --git a/internal/service/review/review_service.go b/internal/service/review/review_service.go index 80c318b1..2d928f6a 100644 --- a/internal/service/review/review_service.go +++ b/internal/service/review/review_service.go @@ -99,7 +99,7 @@ func NewReviewService( // AddQuestionReview add review for question if needed func (cs *ReviewService) AddQuestionReview(ctx context.Context, - question *entity.Question, tags []*schema.TagItem) (needReview bool) { + question *entity.Question, tags []*schema.TagItem) (questionStatus int) { reviewContent := &plugin.ReviewContent{ ObjectType: constant.QuestionObjectType, Title: question.Title, @@ -109,18 +109,36 @@ func (cs *ReviewService) AddQuestionReview(ctx context.Context, reviewContent.Tags = append(reviewContent.Tags, tag.SlugName) } reviewContent.Author = cs.getReviewContentAuthorInfo(ctx, question.UserID) - return cs.callPluginToReview(ctx, question.UserID, question.ID, reviewContent) + reviewStatus := cs.callPluginToReview(ctx, question.UserID, question.ID, reviewContent) + switch reviewStatus { + case plugin.ReviewStatusApproved: + questionStatus = entity.QuestionStatusAvailable + case plugin.ReviewStatusNeedReview: + questionStatus = entity.QuestionStatusPending + case plugin.ReviewStatusDeleteDirectly: + questionStatus = entity.QuestionStatusDeleted + } + return questionStatus } // AddAnswerReview add review for answer if needed func (cs *ReviewService) AddAnswerReview(ctx context.Context, - answer *entity.Answer) (needReview bool) { + answer *entity.Answer) (answerStatus int) { reviewContent := &plugin.ReviewContent{ ObjectType: constant.AnswerObjectType, Content: answer.ParsedText, } reviewContent.Author = cs.getReviewContentAuthorInfo(ctx, answer.UserID) - return cs.callPluginToReview(ctx, answer.UserID, answer.ID, reviewContent) + reviewStatus := cs.callPluginToReview(ctx, answer.UserID, answer.ID, reviewContent) + switch reviewStatus { + case plugin.ReviewStatusApproved: + answerStatus = entity.AnswerStatusAvailable + case plugin.ReviewStatusNeedReview: + answerStatus = entity.AnswerStatusPending + case plugin.ReviewStatusDeleteDirectly: + answerStatus = entity.AnswerStatusDeleted + } + return answerStatus } // get review content author info @@ -143,9 +161,9 @@ func (cs *ReviewService) getReviewContentAuthorInfo(ctx context.Context, userID // call plugin to review func (cs *ReviewService) callPluginToReview(ctx context.Context, userID, objectID string, - reviewContent *plugin.ReviewContent) (approved bool) { + reviewContent *plugin.ReviewContent) (reviewStatus plugin.ReviewStatus) { // As default, no need review - approved = true + reviewStatus = plugin.ReviewStatusApproved objectID = uid.DeShortID(objectID) r := &entity.Review{ @@ -161,23 +179,23 @@ func (cs *ReviewService) callPluginToReview(ctx context.Context, userID, objectI _ = plugin.CallReviewer(func(reviewer plugin.Reviewer) error { // If one of the reviewer plugin return false, then the review is not approved - if !approved { + if reviewStatus != plugin.ReviewStatusApproved { return nil } if result := reviewer.Review(reviewContent); !result.Approved { - approved = false + reviewStatus = result.ReviewStatus r.Reason = result.Reason r.Submitter = reviewer.Info().SlugName } return nil }) - if !approved { + if reviewStatus == plugin.ReviewStatusNeedReview { if err := cs.reviewRepo.AddReview(ctx, r); err != nil { log.Errorf("add review failed, err: %v", err) } } - return approved + return reviewStatus } // UpdateReview update review diff --git a/plugin/reviewer.go b/plugin/reviewer.go index 4c9165c6..ac193af3 100644 --- a/plugin/reviewer.go +++ b/plugin/reviewer.go @@ -52,10 +52,20 @@ type ReviewContentAuthor struct { Role int } +type ReviewStatus string + +const ( + ReviewStatusApproved ReviewStatus = "approved" + ReviewStatusDeleteDirectly ReviewStatus = "delete_directly" + ReviewStatusNeedReview ReviewStatus = "need_review" +) + // ReviewResult is a struct that contains the result of a review type ReviewResult struct { // If the review is approved Approved bool + // The status of the review + ReviewStatus ReviewStatus // The reason for the result Reason string }
