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

Method UpdateQuestion

internal/controller/question_controller.go:623–705  ·  view source on GitHub ↗

UpdateQuestion update question @Summary update question @Description update question @Tags Question @Accept json @Produce json @Security ApiKeyAuth @Param data body schema.QuestionUpdate true "question" @Success 200 {object} handler.RespBody @Router /answer/api/v1/question [put]

(ctx *gin.Context)

Source from the content-addressed store, hash-verified

621// @Success 200 {object} handler.RespBody
622// @Router /answer/api/v1/question [put]
623func (qc *QuestionController) UpdateQuestion(ctx *gin.Context) {
624 req := &schema.QuestionUpdate{}
625 errFields := handler.BindAndCheckReturnErr(ctx, req)
626 if ctx.IsAborted() {
627 return
628 }
629 req.ID = uid.DeShortID(req.ID)
630 req.UserID = middleware.GetLoginUserIDFromContext(ctx)
631 canList, requireRanks, err := qc.rankService.CheckOperationPermissionsForRanks(ctx, req.UserID, []string{
632 permission.QuestionEdit,
633 permission.QuestionDelete,
634 permission.QuestionEditWithoutReview,
635 permission.TagUseReservedTag,
636 permission.TagAdd,
637 permission.LinkUrlLimit,
638 })
639 if err != nil {
640 handler.HandleResponse(ctx, err, nil)
641 return
642 }
643 linkUrlLimitUser := canList[5]
644 isAdmin := middleware.GetUserIsAdminModerator(ctx)
645 if !isAdmin || !linkUrlLimitUser {
646 captchaPass := qc.actionService.ActionRecordVerifyCaptcha(ctx, entity.CaptchaActionEdit, req.UserID, req.CaptchaID, req.CaptchaCode)
647 if !captchaPass {
648 errFields := append([]*validator.FormErrorField{}, &validator.FormErrorField{
649 ErrorField: "captcha_code",
650 ErrorMsg: translator.Tr(handler.GetLangByCtx(ctx), reason.CaptchaVerificationFailed),
651 })
652 handler.HandleResponse(ctx, errors.BadRequest(reason.CaptchaVerificationFailed), errFields)
653 return
654 }
655 }
656
657 objectOwner := qc.rankService.CheckOperationObjectOwner(ctx, req.UserID, req.ID)
658 req.CanEdit = canList[0] || objectOwner
659 req.CanDelete = canList[1]
660 req.NoNeedReview = canList[2] || objectOwner
661 req.CanUseReservedTag = canList[3]
662 req.CanAddTag = canList[4]
663 if !req.CanEdit {
664 handler.HandleResponse(ctx, errors.Forbidden(reason.RankFailToMeetTheCondition), nil)
665 return
666 }
667
668 errlist, err := qc.questionService.UpdateQuestionCheckTags(ctx, req)
669 if err != nil {
670 errFields = append(errFields, errlist...)
671 }
672
673 if len(errFields) > 0 {
674 handler.HandleResponse(ctx, errors.BadRequest(reason.RequestFormatError), errFields)
675 return
676 }
677
678 // can add tag
679 hasNewTag, err := qc.questionService.HasNewTag(ctx, req.Tags)
680 if err != nil {

Callers

nothing calls this directly

Calls 15

BindAndCheckReturnErrFunction · 0.92
DeShortIDFunction · 0.92
HandleResponseFunction · 0.92
GetUserIsAdminModeratorFunction · 0.92
TrFunction · 0.92
GetLangByCtxFunction · 0.92
TrWithDataFunction · 0.92

Tested by

no test coverage detected