You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

issue_comment.go 4.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. // Copyright 2020 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package convert
  4. import (
  5. "context"
  6. issues_model "code.gitea.io/gitea/models/issues"
  7. repo_model "code.gitea.io/gitea/models/repo"
  8. user_model "code.gitea.io/gitea/models/user"
  9. "code.gitea.io/gitea/modules/log"
  10. api "code.gitea.io/gitea/modules/structs"
  11. "code.gitea.io/gitea/modules/util"
  12. )
  13. // ToAPIComment converts a issues_model.Comment to the api.Comment format for API usage
  14. func ToAPIComment(ctx context.Context, repo *repo_model.Repository, c *issues_model.Comment) *api.Comment {
  15. return &api.Comment{
  16. ID: c.ID,
  17. Poster: ToUser(ctx, c.Poster, nil),
  18. HTMLURL: c.HTMLURL(ctx),
  19. IssueURL: c.IssueURL(ctx),
  20. PRURL: c.PRURL(ctx),
  21. Body: c.Content,
  22. Attachments: ToAPIAttachments(repo, c.Attachments),
  23. Created: c.CreatedUnix.AsTime(),
  24. Updated: c.UpdatedUnix.AsTime(),
  25. }
  26. }
  27. // ToTimelineComment converts a issues_model.Comment to the api.TimelineComment format
  28. func ToTimelineComment(ctx context.Context, repo *repo_model.Repository, c *issues_model.Comment, doer *user_model.User) *api.TimelineComment {
  29. err := c.LoadMilestone(ctx)
  30. if err != nil {
  31. log.Error("LoadMilestone: %v", err)
  32. return nil
  33. }
  34. err = c.LoadAssigneeUserAndTeam(ctx)
  35. if err != nil {
  36. log.Error("LoadAssigneeUserAndTeam: %v", err)
  37. return nil
  38. }
  39. err = c.LoadResolveDoer(ctx)
  40. if err != nil {
  41. log.Error("LoadResolveDoer: %v", err)
  42. return nil
  43. }
  44. err = c.LoadDepIssueDetails(ctx)
  45. if err != nil {
  46. log.Error("LoadDepIssueDetails: %v", err)
  47. return nil
  48. }
  49. err = c.LoadTime(ctx)
  50. if err != nil {
  51. log.Error("LoadTime: %v", err)
  52. return nil
  53. }
  54. err = c.LoadLabel(ctx)
  55. if err != nil {
  56. log.Error("LoadLabel: %v", err)
  57. return nil
  58. }
  59. if c.Content != "" {
  60. if (c.Type == issues_model.CommentTypeAddTimeManual ||
  61. c.Type == issues_model.CommentTypeStopTracking ||
  62. c.Type == issues_model.CommentTypeDeleteTimeManual) &&
  63. c.Content[0] == '|' {
  64. // TimeTracking Comments from v1.21 on store the seconds instead of an formatted string
  65. // so we check for the "|" delimiter and convert new to legacy format on demand
  66. c.Content = util.SecToTime(c.Content[1:])
  67. }
  68. }
  69. comment := &api.TimelineComment{
  70. ID: c.ID,
  71. Type: c.Type.String(),
  72. Poster: ToUser(ctx, c.Poster, nil),
  73. HTMLURL: c.HTMLURL(ctx),
  74. IssueURL: c.IssueURL(ctx),
  75. PRURL: c.PRURL(ctx),
  76. Body: c.Content,
  77. Created: c.CreatedUnix.AsTime(),
  78. Updated: c.UpdatedUnix.AsTime(),
  79. OldProjectID: c.OldProjectID,
  80. ProjectID: c.ProjectID,
  81. OldTitle: c.OldTitle,
  82. NewTitle: c.NewTitle,
  83. OldRef: c.OldRef,
  84. NewRef: c.NewRef,
  85. RefAction: c.RefAction.String(),
  86. RefCommitSHA: c.CommitSHA,
  87. ReviewID: c.ReviewID,
  88. RemovedAssignee: c.RemovedAssignee,
  89. }
  90. if c.OldMilestone != nil {
  91. comment.OldMilestone = ToAPIMilestone(c.OldMilestone)
  92. }
  93. if c.Milestone != nil {
  94. comment.Milestone = ToAPIMilestone(c.Milestone)
  95. }
  96. if c.Time != nil {
  97. err = c.Time.LoadAttributes(ctx)
  98. if err != nil {
  99. log.Error("Time.LoadAttributes: %v", err)
  100. return nil
  101. }
  102. comment.TrackedTime = ToTrackedTime(ctx, doer, c.Time)
  103. }
  104. if c.RefIssueID != 0 {
  105. issue, err := issues_model.GetIssueByID(ctx, c.RefIssueID)
  106. if err != nil {
  107. log.Error("GetIssueByID(%d): %v", c.RefIssueID, err)
  108. return nil
  109. }
  110. comment.RefIssue = ToAPIIssue(ctx, doer, issue)
  111. }
  112. if c.RefCommentID != 0 {
  113. com, err := issues_model.GetCommentByID(ctx, c.RefCommentID)
  114. if err != nil {
  115. log.Error("GetCommentByID(%d): %v", c.RefCommentID, err)
  116. return nil
  117. }
  118. err = com.LoadPoster(ctx)
  119. if err != nil {
  120. log.Error("LoadPoster: %v", err)
  121. return nil
  122. }
  123. comment.RefComment = ToAPIComment(ctx, repo, com)
  124. }
  125. if c.Label != nil {
  126. var org *user_model.User
  127. var repo *repo_model.Repository
  128. if c.Label.BelongsToOrg() {
  129. var err error
  130. org, err = user_model.GetUserByID(ctx, c.Label.OrgID)
  131. if err != nil {
  132. log.Error("GetUserByID(%d): %v", c.Label.OrgID, err)
  133. return nil
  134. }
  135. }
  136. if c.Label.BelongsToRepo() {
  137. var err error
  138. repo, err = repo_model.GetRepositoryByID(ctx, c.Label.RepoID)
  139. if err != nil {
  140. log.Error("GetRepositoryByID(%d): %v", c.Label.RepoID, err)
  141. return nil
  142. }
  143. }
  144. comment.Label = ToLabel(c.Label, repo, org)
  145. }
  146. if c.Assignee != nil {
  147. comment.Assignee = ToUser(ctx, c.Assignee, nil)
  148. }
  149. if c.AssigneeTeam != nil {
  150. comment.AssigneeTeam, _ = ToTeam(ctx, c.AssigneeTeam)
  151. }
  152. if c.ResolveDoer != nil {
  153. comment.ResolveDoer = ToUser(ctx, c.ResolveDoer, nil)
  154. }
  155. if c.DependentIssue != nil {
  156. comment.DependentIssue = ToAPIIssue(ctx, doer, c.DependentIssue)
  157. }
  158. return comment
  159. }