in internal/service/importer/importer_service.go [73:172]
func (ip *ImporterService) ImportQuestion(ctx context.Context, questionInfo plugin.QuestionImporterInfo) (err error) {
req := &schema.QuestionAdd{}
errFields := make([]*validator.FormErrorField, 0)
// To limit rate, remove the following code from comment: Part 1/2
// reject, rejectKey := ipc.rateLimitMiddleware.DuplicateRequestRejection(ctx, req)
// if reject {
// return
// }
userInfo, exist, err := ip.userCommon.GetByEmail(ctx, questionInfo.UserEmail)
if err != nil {
log.Errorf("error: %v", err)
return err
}
if !exist {
return fmt.Errorf("User not found")
}
// To limit rate, remove the following code from comment: Part 2/2
// defer func() {
// // If status is not 200 means that the bad request has been returned, so the record should be cleared
// if ctx.Writer.Status() != http.StatusOK {
// ipc.rateLimitMiddleware.DuplicateRequestClear(ctx, rejectKey)
// }
// }()
req.UserID = userInfo.ID
req.Title = questionInfo.Title
req.Content = questionInfo.Content
req.HTML = "<p>" + questionInfo.Content + "</p>"
req.Tags = make([]*schema.TagItem, len(questionInfo.Tags))
for i, tag := range questionInfo.Tags {
req.Tags[i] = &schema.TagItem{
SlugName: tag,
DisplayName: tag,
}
}
canList, requireRanks, err := ip.rankService.CheckOperationPermissionsForRanks(ctx, req.UserID, []string{
permission.QuestionAdd,
permission.QuestionEdit,
permission.QuestionDelete,
permission.QuestionClose,
permission.QuestionReopen,
permission.TagUseReservedTag,
permission.TagAdd,
permission.LinkUrlLimit,
})
if err != nil {
log.Errorf("error: %v", err)
return err
}
req.CanAdd = canList[0]
req.CanEdit = canList[1]
req.CanDelete = canList[2]
req.CanClose = canList[3]
req.CanReopen = canList[4]
req.CanUseReservedTag = canList[5]
req.CanAddTag = canList[6]
if !req.CanAdd {
log.Errorf("error: %v", err)
return err
}
hasNewTag, err := ip.questionService.HasNewTag(ctx.(*gin.Context), req.Tags)
if err != nil {
log.Errorf("error: %v", err)
return err
}
if !req.CanAddTag && hasNewTag {
lang := handler.GetLang(ctx.(*gin.Context))
msg := translator.TrWithData(lang, reason.NoEnoughRankToOperate, &schema.PermissionTrTplData{Rank: requireRanks[6]})
log.Errorf("error: %v", msg)
return errors.BadRequest(msg)
}
errList, err := ip.questionService.CheckAddQuestion(ctx, req)
if err != nil {
errlist, ok := errList.([]*validator.FormErrorField)
if ok {
errFields = append(errFields, errlist...)
}
}
if len(errFields) > 0 {
return errors.BadRequest(reason.RequestFormatError)
}
ginCtx := ctx.(*gin.Context)
req.UserAgent = ginCtx.GetHeader("User-Agent")
req.IP = ginCtx.ClientIP()
resp, err := ip.questionService.AddQuestion(ctx, req)
if err != nil {
errlist, ok := resp.([]*validator.FormErrorField)
if ok {
errFields = append(errFields, errlist...)
}
}
if len(errFields) > 0 {
log.Errorf("error: RequestFormatError")
return errors.BadRequest(reason.RequestFormatError)
}
log.Info("Add Question Successfully")
return nil
}