AddComment add comment @Summary add comment @Description add comment @Tags Comment @Accept json @Produce json @Security ApiKeyAuth @Param data body schema.AddCommentReq true "comment" @Success 200 {object} handler.RespBody{data=schema.GetCommentResp} @Router /answer/api/v1/comment [post]
(ctx *gin.Context)
| 72 | // @Success 200 {object} handler.RespBody{data=schema.GetCommentResp} |
| 73 | // @Router /answer/api/v1/comment [post] |
| 74 | func (cc *CommentController) AddComment(ctx *gin.Context) { |
| 75 | req := &schema.AddCommentReq{} |
| 76 | if handler.BindAndCheck(ctx, req) { |
| 77 | return |
| 78 | } |
| 79 | reject, rejectKey := cc.rateLimitMiddleware.DuplicateRequestRejection(ctx, req) |
| 80 | if reject { |
| 81 | return |
| 82 | } |
| 83 | defer func() { |
| 84 | // If status is not 200 means that the bad request has been returned, so the record should be cleared |
| 85 | if ctx.Writer.Status() != http.StatusOK { |
| 86 | cc.rateLimitMiddleware.DuplicateRequestClear(ctx, rejectKey) |
| 87 | } |
| 88 | }() |
| 89 | req.ObjectID = uid.DeShortID(req.ObjectID) |
| 90 | req.UserID = middleware.GetLoginUserIDFromContext(ctx) |
| 91 | |
| 92 | canList, err := cc.rankService.CheckOperationPermissions(ctx, req.UserID, []string{ |
| 93 | permission.CommentAdd, |
| 94 | permission.CommentEdit, |
| 95 | permission.CommentDelete, |
| 96 | permission.LinkUrlLimit, |
| 97 | }) |
| 98 | if err != nil { |
| 99 | handler.HandleResponse(ctx, err, nil) |
| 100 | return |
| 101 | } |
| 102 | linkUrlLimitUser := canList[3] |
| 103 | isAdmin := middleware.GetUserIsAdminModerator(ctx) |
| 104 | if !isAdmin || !linkUrlLimitUser { |
| 105 | captchaPass := cc.actionService.ActionRecordVerifyCaptcha(ctx, entity.CaptchaActionComment, req.UserID, req.CaptchaID, req.CaptchaCode) |
| 106 | if !captchaPass { |
| 107 | errFields := append([]*validator.FormErrorField{}, &validator.FormErrorField{ |
| 108 | ErrorField: "captcha_code", |
| 109 | ErrorMsg: translator.Tr(handler.GetLangByCtx(ctx), reason.CaptchaVerificationFailed), |
| 110 | }) |
| 111 | handler.HandleResponse(ctx, errors.BadRequest(reason.CaptchaVerificationFailed), errFields) |
| 112 | return |
| 113 | } |
| 114 | } |
| 115 | |
| 116 | req.CanAdd = canList[0] |
| 117 | req.CanEdit = canList[1] |
| 118 | req.CanDelete = canList[2] |
| 119 | if !req.CanAdd { |
| 120 | handler.HandleResponse(ctx, errors.Forbidden(reason.RankFailToMeetTheCondition), nil) |
| 121 | return |
| 122 | } |
| 123 | |
| 124 | req.UserAgent = ctx.GetHeader("User-Agent") |
| 125 | req.IP = ctx.ClientIP() |
| 126 | |
| 127 | resp, err := cc.commentService.AddComment(ctx, req) |
| 128 | if !isAdmin || !linkUrlLimitUser { |
| 129 | cc.actionService.ActionRecordAdd(ctx, entity.CaptchaActionComment, req.UserID) |
| 130 | } |
| 131 | handler.HandleResponse(ctx, err, resp) |
nothing calls this directly
no test coverage detected