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
 }

Reply via email to