in internal/service/content/answer_service.go [116:197]
func (as *AnswerService) RemoveAnswer(ctx context.Context, req *schema.RemoveAnswerReq) (err error) {
answerInfo, exist, err := as.answerRepo.GetByID(ctx, req.ID)
if err != nil {
return err
}
if !exist {
return nil
}
// if the status is deleted, return directly
if answerInfo.Status == entity.AnswerStatusDeleted {
return nil
}
roleID, err := as.roleService.GetUserRole(ctx, req.UserID)
if err != nil {
return err
}
if roleID != role.RoleAdminID && roleID != role.RoleModeratorID {
if answerInfo.UserID != req.UserID {
return errors.BadRequest(reason.AnswerCannotDeleted)
}
if answerInfo.VoteCount > 0 {
return errors.BadRequest(reason.AnswerCannotDeleted)
}
if answerInfo.Accepted == schema.AnswerAcceptedEnable {
return errors.BadRequest(reason.AnswerCannotDeleted)
}
_, exist, err := as.questionRepo.GetQuestion(ctx, answerInfo.QuestionID)
if err != nil {
return errors.BadRequest(reason.AnswerCannotDeleted)
}
if !exist {
return errors.BadRequest(reason.AnswerCannotDeleted)
}
}
err = as.answerRepo.RemoveAnswer(ctx, req.ID)
if err != nil {
return err
}
// user add question count
err = as.questionCommon.UpdateAnswerCount(ctx, answerInfo.QuestionID)
if err != nil {
log.Error("IncreaseAnswerCount error", err.Error())
}
userAnswerCount, err := as.answerRepo.GetCountByUserID(ctx, answerInfo.UserID)
if err != nil {
log.Error("GetCountByUserID error", err.Error())
}
err = as.userCommon.UpdateAnswerCount(ctx, answerInfo.UserID, int(userAnswerCount))
if err != nil {
log.Error("user IncreaseAnswerCount error", err.Error())
}
err = as.questionRepo.RemoveQuestionLink(ctx, &entity.QuestionLink{
FromQuestionID: answerInfo.QuestionID,
FromAnswerID: answerInfo.ID,
}, &entity.QuestionLink{
ToQuestionID: answerInfo.QuestionID,
ToAnswerID: answerInfo.ID,
})
if err != nil {
log.Error("RemoveQuestionLink error", err.Error())
}
// #2372 In order to simplify the process and complexity, as well as to consider if it is in-house,
// facing the problem of recovery.
//err = as.answerActivityService.DeleteAnswer(ctx, answerInfo.ID, answerInfo.CreatedAt, answerInfo.VoteCount)
//if err != nil {
// log.Errorf("delete answer activity change failed: %s", err.Error())
//}
as.activityQueueService.Send(ctx, &schema.ActivityMsg{
UserID: req.UserID,
TriggerUserID: converter.StringToInt64(req.UserID),
ObjectID: answerInfo.ID,
OriginalObjectID: answerInfo.ID,
ActivityTypeKey: constant.ActAnswerDeleted,
})
as.eventQueueService.Send(ctx, schema.NewEvent(constant.EventAnswerDelete, req.UserID).TID(answerInfo.ID).
AID(answerInfo.ID, answerInfo.UserID))
return
}