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)
| 621 | // @Success 200 {object} handler.RespBody |
| 622 | // @Router /answer/api/v1/question [put] |
| 623 | func (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 { |
nothing calls this directly
no test coverage detected