Skip to content

Commit 521b095

Browse files
committed
When updating comment, if the content is the same, just return and not update the databse
1 parent 0f63a5e commit 521b095

File tree

3 files changed

+74
-12
lines changed

3 files changed

+74
-12
lines changed

routers/api/v1/repo/issue_comment.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -610,6 +610,11 @@ func editIssueComment(ctx *context.APIContext, form api.EditIssueCommentOption)
610610
}
611611

612612
oldContent := comment.Content
613+
if form.Body == oldContent {
614+
ctx.JSON(http.StatusOK, convert.ToAPIComment(ctx, ctx.Repo.Repository, comment))
615+
return
616+
}
617+
613618
comment.Content = form.Body
614619
if err := issue_service.UpdateComment(ctx, comment, comment.ContentVersion, ctx.Doer, oldContent); err != nil {
615620
if errors.Is(err, user_model.ErrBlockedUser) {

routers/web/repo/issue_comment.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,14 @@ func UpdateCommentContent(ctx *context.Context) {
242242
oldContent := comment.Content
243243
newContent := ctx.FormString("content")
244244
contentVersion := ctx.FormInt("content_version")
245+
if newContent == oldContent {
246+
ctx.JSON(http.StatusOK, map[string]any{
247+
"content": oldContent,
248+
"contentVersion": comment.ContentVersion,
249+
"attachments": attachmentsHTML(ctx, comment.Attachments, oldContent),
250+
})
251+
return
252+
}
245253

246254
// allow to save empty content
247255
comment.Content = newContent

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.Equal(t, "", triggeredEvent)
304+
assert.Len(t, payloads, 0)
305+
})
257306
})
258307
}
259308

0 commit comments

Comments
 (0)