Skip to content

Commit b07e039

Browse files
authored
When updating comment, if the content is the same, just return and not update the databse (#34422)
Fix #34318
1 parent 4a98ab0 commit b07e039

File tree

3 files changed

+89
-31
lines changed

3 files changed

+89
-31
lines changed

routers/api/v1/repo/issue_comment.go

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -609,15 +609,17 @@ func editIssueComment(ctx *context.APIContext, form api.EditIssueCommentOption)
609609
return
610610
}
611611

612-
oldContent := comment.Content
613-
comment.Content = form.Body
614-
if err := issue_service.UpdateComment(ctx, comment, comment.ContentVersion, ctx.Doer, oldContent); err != nil {
615-
if errors.Is(err, user_model.ErrBlockedUser) {
616-
ctx.APIError(http.StatusForbidden, err)
617-
} else {
618-
ctx.APIErrorInternal(err)
612+
if form.Body != comment.Content {
613+
oldContent := comment.Content
614+
comment.Content = form.Body
615+
if err := issue_service.UpdateComment(ctx, comment, comment.ContentVersion, ctx.Doer, oldContent); err != nil {
616+
if errors.Is(err, user_model.ErrBlockedUser) {
617+
ctx.APIError(http.StatusForbidden, err)
618+
} else {
619+
ctx.APIErrorInternal(err)
620+
}
621+
return
619622
}
620-
return
621623
}
622624

623625
ctx.JSON(http.StatusOK, convert.ToAPIComment(ctx, ctx.Repo.Repository, comment))

routers/web/repo/issue_comment.go

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -239,21 +239,28 @@ func UpdateCommentContent(ctx *context.Context) {
239239
return
240240
}
241241

242-
oldContent := comment.Content
243242
newContent := ctx.FormString("content")
244243
contentVersion := ctx.FormInt("content_version")
244+
if contentVersion != comment.ContentVersion {
245+
ctx.JSONError(ctx.Tr("repo.comments.edit.already_changed"))
246+
return
247+
}
245248

246-
// allow to save empty content
247-
comment.Content = newContent
248-
if err = issue_service.UpdateComment(ctx, comment, contentVersion, ctx.Doer, oldContent); err != nil {
249-
if errors.Is(err, user_model.ErrBlockedUser) {
250-
ctx.JSONError(ctx.Tr("repo.issues.comment.blocked_user"))
251-
} else if errors.Is(err, issues_model.ErrCommentAlreadyChanged) {
252-
ctx.JSONError(ctx.Tr("repo.comments.edit.already_changed"))
253-
} else {
254-
ctx.ServerError("UpdateComment", err)
249+
if newContent != comment.Content {
250+
// allow to save empty content
251+
oldContent := comment.Content
252+
comment.Content = newContent
253+
254+
if err = issue_service.UpdateComment(ctx, comment, contentVersion, ctx.Doer, oldContent); err != nil {
255+
if errors.Is(err, user_model.ErrBlockedUser) {
256+
ctx.JSONError(ctx.Tr("repo.issues.comment.blocked_user"))
257+
} else if errors.Is(err, issues_model.ErrCommentAlreadyChanged) {
258+
ctx.JSONError(ctx.Tr("repo.comments.edit.already_changed"))
259+
} else {
260+
ctx.ServerError("UpdateComment", err)
261+
}
262+
return
255263
}
256-
return
257264
}
258265

259266
if err := comment.LoadAttachments(ctx); err != nil {

tests/integration/repo_webhook_test.go

Lines changed: 61 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -241,19 +241,68 @@ func Test_WebhookIssueComment(t *testing.T) {
241241

242242
testAPICreateWebhookForRepo(t, session, "user2", "repo1", provider.URL(), "issue_comment")
243243

244-
// 2. trigger the webhook
245-
issueURL := testNewIssue(t, session, "user2", "repo1", "Title2", "Description2")
246-
testIssueAddComment(t, session, issueURL, "issue title2 comment1", "")
244+
t.Run("create comment", func(t *testing.T) {
245+
// 2. trigger the webhook
246+
issueURL := testNewIssue(t, session, "user2", "repo1", "Title2", "Description2")
247+
testIssueAddComment(t, session, issueURL, "issue title2 comment1", "")
248+
249+
// 3. validate the webhook is triggered
250+
assert.Equal(t, "issue_comment", triggeredEvent)
251+
assert.Len(t, payloads, 1)
252+
assert.EqualValues(t, "created", payloads[0].Action)
253+
assert.Equal(t, "repo1", payloads[0].Issue.Repo.Name)
254+
assert.Equal(t, "user2/repo1", payloads[0].Issue.Repo.FullName)
255+
assert.Equal(t, "Title2", payloads[0].Issue.Title)
256+
assert.Equal(t, "Description2", payloads[0].Issue.Body)
257+
assert.Equal(t, "issue title2 comment1", payloads[0].Comment.Body)
258+
})
247259

248-
// 3. validate the webhook is triggered
249-
assert.Equal(t, "issue_comment", triggeredEvent)
250-
assert.Len(t, payloads, 1)
251-
assert.EqualValues(t, "created", payloads[0].Action)
252-
assert.Equal(t, "repo1", payloads[0].Issue.Repo.Name)
253-
assert.Equal(t, "user2/repo1", payloads[0].Issue.Repo.FullName)
254-
assert.Equal(t, "Title2", payloads[0].Issue.Title)
255-
assert.Equal(t, "Description2", payloads[0].Issue.Body)
256-
assert.Equal(t, "issue title2 comment1", payloads[0].Comment.Body)
260+
t.Run("update comment", func(t *testing.T) {
261+
payloads = make([]api.IssueCommentPayload, 0, 2)
262+
triggeredEvent = ""
263+
264+
// 2. trigger the webhook
265+
issueURL := testNewIssue(t, session, "user2", "repo1", "Title3", "Description3")
266+
commentID := testIssueAddComment(t, session, issueURL, "issue title3 comment1", "")
267+
modifiedContent := "issue title2 comment1 - modified"
268+
req := NewRequestWithValues(t, "POST", fmt.Sprintf("/%s/%s/comments/%d", "user2", "repo1", commentID), map[string]string{
269+
"_csrf": GetUserCSRFToken(t, session),
270+
"content": modifiedContent,
271+
})
272+
session.MakeRequest(t, req, http.StatusOK)
273+
274+
// 3. validate the webhook is triggered
275+
assert.Equal(t, "issue_comment", triggeredEvent)
276+
assert.Len(t, payloads, 2)
277+
assert.EqualValues(t, "edited", payloads[1].Action)
278+
assert.Equal(t, "repo1", payloads[1].Issue.Repo.Name)
279+
assert.Equal(t, "user2/repo1", payloads[1].Issue.Repo.FullName)
280+
assert.Equal(t, "Title3", payloads[1].Issue.Title)
281+
assert.Equal(t, "Description3", payloads[1].Issue.Body)
282+
assert.Equal(t, modifiedContent, payloads[1].Comment.Body)
283+
})
284+
285+
t.Run("Update comment with no content change", func(t *testing.T) {
286+
payloads = make([]api.IssueCommentPayload, 0, 2)
287+
triggeredEvent = ""
288+
commentContent := "issue title3 comment1"
289+
290+
// 2. trigger the webhook
291+
issueURL := testNewIssue(t, session, "user2", "repo1", "Title3", "Description3")
292+
commentID := testIssueAddComment(t, session, issueURL, commentContent, "")
293+
294+
payloads = make([]api.IssueCommentPayload, 0, 2)
295+
triggeredEvent = ""
296+
req := NewRequestWithValues(t, "POST", fmt.Sprintf("/%s/%s/comments/%d", "user2", "repo1", commentID), map[string]string{
297+
"_csrf": GetUserCSRFToken(t, session),
298+
"content": commentContent,
299+
})
300+
session.MakeRequest(t, req, http.StatusOK)
301+
302+
// 3. validate the webhook is not triggered because no content change
303+
assert.Empty(t, triggeredEvent)
304+
assert.Empty(t, payloads)
305+
})
257306
})
258307
}
259308

0 commit comments

Comments
 (0)