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

Method AddAnswer

internal/controller/answer_controller.go:194–294  ·  view source on GitHub ↗

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)

Source from the content-addressed store, hash-verified

192// @Success 200 {object} handler.RespBody{}
193// @Router /answer/api/v1/answer [post]
194func (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 {

Callers

nothing calls this directly

Calls 15

BindAndCheckFunction · 0.92
DeShortIDFunction · 0.92
HandleResponseFunction · 0.92
GetUserIsAdminModeratorFunction · 0.92
TrFunction · 0.92
GetLangByCtxFunction · 0.92
GetAnswerPermissionFunction · 0.92
DuplicateRequestClearMethod · 0.80

Tested by

no test coverage detected