in internal/service/review/review_service.go [239:319]
func (cs *ReviewService) updateObjectStatus(ctx context.Context, review *entity.Review, isApprove bool) (err error) {
objectType := constant.ObjectTypeNumberMapping[review.ObjectType]
switch objectType {
case constant.QuestionObjectType:
questionInfo, exist, err := cs.questionRepo.GetQuestion(ctx, review.ObjectID)
if err != nil {
return err
}
if !exist {
return errors.BadRequest(reason.ObjectNotFound)
}
if isApprove {
questionInfo.Status = entity.QuestionStatusAvailable
} else {
questionInfo.Status = entity.QuestionStatusDeleted
}
if err := cs.questionRepo.UpdateQuestionStatus(ctx, questionInfo.ID, questionInfo.Status); err != nil {
return err
}
if isApprove {
tags, err := cs.tagCommon.GetObjectEntityTag(ctx, questionInfo.ID)
if err != nil {
log.Errorf("get question tags failed, err: %v", err)
}
cs.externalNotificationQueueService.Send(ctx,
schema.CreateNewQuestionNotificationMsg(questionInfo.ID, questionInfo.Title, questionInfo.UserID, tags))
}
userQuestionCount, err := cs.questionRepo.GetUserQuestionCount(ctx, questionInfo.UserID, 0)
if err != nil {
log.Errorf("get user question count failed, err: %v", err)
} else {
err = cs.userCommon.UpdateQuestionCount(ctx, questionInfo.UserID, userQuestionCount)
if err != nil {
log.Errorf("update user question count failed, err: %v", err)
}
}
case constant.AnswerObjectType:
answerInfo, exist, err := cs.answerRepo.GetAnswer(ctx, review.ObjectID)
if err != nil {
return err
}
if !exist {
return errors.BadRequest(reason.ObjectNotFound)
}
if isApprove {
answerInfo.Status = entity.AnswerStatusAvailable
} else {
answerInfo.Status = entity.AnswerStatusDeleted
}
if err := cs.answerRepo.UpdateAnswerStatus(ctx, answerInfo.ID, answerInfo.Status); err != nil {
return err
}
questionInfo, exist, err := cs.questionRepo.GetQuestion(ctx, answerInfo.QuestionID)
if err != nil {
return err
}
if !exist {
return errors.BadRequest(reason.ObjectNotFound)
}
if isApprove {
cs.notificationAnswerTheQuestion(ctx, questionInfo.UserID, questionInfo.ID, answerInfo.ID,
answerInfo.UserID, questionInfo.Title, answerInfo.OriginalText)
}
if err := cs.questionCommon.UpdateAnswerCount(ctx, answerInfo.QuestionID); err != nil {
log.Errorf("update question answer count failed, err: %v", err)
}
if err := cs.questionCommon.UpdateLastAnswer(ctx, answerInfo.QuestionID, uid.DeShortID(answerInfo.ID)); err != nil {
log.Errorf("update question last answer failed, err: %v", err)
}
userAnswerCount, err := cs.answerRepo.GetCountByUserID(ctx, answerInfo.UserID)
if err != nil {
log.Errorf("get user answer count failed, err: %v", err)
} else {
err = cs.userCommon.UpdateAnswerCount(ctx, answerInfo.UserID, int(userAnswerCount))
if err != nil {
log.Errorf("update user answer count failed, err: %v", err)
}
}
}
return
}