AddQuestion add question @Summary add question @Description add question @Tags Question @Accept json @Produce json @Security ApiKeyAuth @Param data body schema.QuestionAdd true "question" @Success 200 {object} handler.RespBody @Router /answer/api/v1/question [post]
(ctx *gin.Context)
| 382 | // @Success 200 {object} handler.RespBody |
| 383 | // @Router /answer/api/v1/question [post] |
| 384 | func (qc *QuestionController) AddQuestion(ctx *gin.Context) { |
| 385 | req := &schema.QuestionAdd{} |
| 386 | errFields := handler.BindAndCheckReturnErr(ctx, req) |
| 387 | if ctx.IsAborted() { |
| 388 | return |
| 389 | } |
| 390 | reject, rejectKey := qc.rateLimitMiddleware.DuplicateRequestRejection(ctx, req) |
| 391 | if reject { |
| 392 | return |
| 393 | } |
| 394 | defer func() { |
| 395 | // If status is not 200 means that the bad request has been returned, so the record should be cleared |
| 396 | if ctx.Writer.Status() != http.StatusOK { |
| 397 | qc.rateLimitMiddleware.DuplicateRequestClear(ctx, rejectKey) |
| 398 | } |
| 399 | }() |
| 400 | |
| 401 | req.UserID = middleware.GetLoginUserIDFromContext(ctx) |
| 402 | canList, requireRanks, err := qc.rankService.CheckOperationPermissionsForRanks(ctx, req.UserID, []string{ |
| 403 | permission.QuestionAdd, |
| 404 | permission.QuestionEdit, |
| 405 | permission.QuestionDelete, |
| 406 | permission.QuestionClose, |
| 407 | permission.QuestionReopen, |
| 408 | permission.TagUseReservedTag, |
| 409 | permission.TagAdd, |
| 410 | permission.LinkUrlLimit, |
| 411 | }) |
| 412 | if err != nil { |
| 413 | handler.HandleResponse(ctx, err, nil) |
| 414 | return |
| 415 | } |
| 416 | linkUrlLimitUser := canList[7] |
| 417 | isAdmin := middleware.GetUserIsAdminModerator(ctx) |
| 418 | if !isAdmin || !linkUrlLimitUser { |
| 419 | captchaPass := qc.actionService.ActionRecordVerifyCaptcha(ctx, entity.CaptchaActionQuestion, req.UserID, req.CaptchaID, req.CaptchaCode) |
| 420 | if !captchaPass { |
| 421 | errFields := append([]*validator.FormErrorField{}, &validator.FormErrorField{ |
| 422 | ErrorField: "captcha_code", |
| 423 | ErrorMsg: translator.Tr(handler.GetLangByCtx(ctx), reason.CaptchaVerificationFailed), |
| 424 | }) |
| 425 | handler.HandleResponse(ctx, errors.BadRequest(reason.CaptchaVerificationFailed), errFields) |
| 426 | return |
| 427 | } |
| 428 | } |
| 429 | |
| 430 | req.CanAdd = canList[0] |
| 431 | req.CanEdit = canList[1] |
| 432 | req.CanDelete = canList[2] |
| 433 | req.CanClose = canList[3] |
| 434 | req.CanReopen = canList[4] |
| 435 | req.CanUseReservedTag = canList[5] |
| 436 | req.CanAddTag = canList[6] |
| 437 | if !req.CanAdd { |
| 438 | handler.HandleResponse(ctx, errors.Forbidden(reason.RankFailToMeetTheCondition), nil) |
| 439 | return |
| 440 | } |
| 441 |
nothing calls this directly
no test coverage detected