Thanks to visit codestin.com
Credit goes to github.com

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)