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

Method AddComment

internal/controller/comment_controller.go:74–132  ·  view source on GitHub ↗

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)

Source from the content-addressed store, hash-verified

72// @Success 200 {object} handler.RespBody{data=schema.GetCommentResp}
73// @Router /answer/api/v1/comment [post]
74func (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)

Callers

nothing calls this directly

Calls 13

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

Tested by

no test coverage detected