MCPcopy
hub / github.com/apache/answer / AddQuestion

Method AddQuestion

internal/controller/question_controller.go:384–487  ·  view source on GitHub ↗

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)

Source from the content-addressed store, hash-verified

382// @Success 200 {object} handler.RespBody
383// @Router /answer/api/v1/question [post]
384func (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

Callers

nothing calls this directly

Calls 15

BindAndCheckReturnErrFunction · 0.92
HandleResponseFunction · 0.92
GetUserIsAdminModeratorFunction · 0.92
TrFunction · 0.92
GetLangByCtxFunction · 0.92
TrWithDataFunction · 0.92
DuplicateRequestClearMethod · 0.80
CheckAddQuestionMethod · 0.80

Tested by

no test coverage detected