AddAnswer add answer @Summary Add Answer @Description add answer @Tags Answer @Accept json @Produce json @Security ApiKeyAuth @Param data body schema.AnswerAddReq true "add answer request" @Success 200 {object} handler.RespBody{} @Router /answer/api/v1/answer [post]
(ctx *gin.Context)
| 192 | // @Success 200 {object} handler.RespBody{} |
| 193 | // @Router /answer/api/v1/answer [post] |
| 194 | func (ac *AnswerController) AddAnswer(ctx *gin.Context) { |
| 195 | req := &schema.AnswerAddReq{} |
| 196 | if handler.BindAndCheck(ctx, req) { |
| 197 | return |
| 198 | } |
| 199 | reject, rejectKey := ac.rateLimitMiddleware.DuplicateRequestRejection(ctx, req) |
| 200 | if reject { |
| 201 | return |
| 202 | } |
| 203 | defer func() { |
| 204 | // If status is not 200 means that the bad request has been returned, so the record should be cleared |
| 205 | if ctx.Writer.Status() != http.StatusOK { |
| 206 | ac.rateLimitMiddleware.DuplicateRequestClear(ctx, rejectKey) |
| 207 | } |
| 208 | }() |
| 209 | req.QuestionID = uid.DeShortID(req.QuestionID) |
| 210 | req.UserID = middleware.GetLoginUserIDFromContext(ctx) |
| 211 | |
| 212 | canList, err := ac.rankService.CheckOperationPermissions(ctx, req.UserID, []string{ |
| 213 | permission.AnswerEdit, |
| 214 | permission.AnswerDelete, |
| 215 | permission.LinkUrlLimit, |
| 216 | }) |
| 217 | if err != nil { |
| 218 | handler.HandleResponse(ctx, err, nil) |
| 219 | return |
| 220 | } |
| 221 | |
| 222 | linkUrlLimitUser := canList[2] |
| 223 | isAdmin := middleware.GetUserIsAdminModerator(ctx) |
| 224 | if !isAdmin || !linkUrlLimitUser { |
| 225 | captchaPass := ac.actionService.ActionRecordVerifyCaptcha(ctx, entity.CaptchaActionAnswer, req.UserID, req.CaptchaID, req.CaptchaCode) |
| 226 | if !captchaPass { |
| 227 | errFields := append([]*validator.FormErrorField{}, &validator.FormErrorField{ |
| 228 | ErrorField: "captcha_code", |
| 229 | ErrorMsg: translator.Tr(handler.GetLangByCtx(ctx), reason.CaptchaVerificationFailed), |
| 230 | }) |
| 231 | handler.HandleResponse(ctx, errors.BadRequest(reason.CaptchaVerificationFailed), errFields) |
| 232 | return |
| 233 | } |
| 234 | } |
| 235 | |
| 236 | can, err := ac.rankService.CheckOperationPermission(ctx, req.UserID, permission.AnswerAdd, "") |
| 237 | if err != nil { |
| 238 | handler.HandleResponse(ctx, err, nil) |
| 239 | return |
| 240 | } |
| 241 | if !can { |
| 242 | handler.HandleResponse(ctx, errors.Forbidden(reason.RankFailToMeetTheCondition), nil) |
| 243 | return |
| 244 | } |
| 245 | |
| 246 | write, err := ac.siteInfoCommonService.GetSiteQuestion(ctx) |
| 247 | if err != nil { |
| 248 | handler.HandleResponse(ctx, err, nil) |
| 249 | return |
| 250 | } |
| 251 | if write.RestrictAnswer { |
nothing calls this directly
no test coverage detected