|
@@ -51,8 +51,9 @@ type Comment struct {
|
|
|
ID int64 `xorm:"pk autoincr"`
|
|
|
Type CommentType
|
|
|
PosterID int64
|
|
|
- Poster *User `xorm:"-"`
|
|
|
- IssueID int64 `xorm:"INDEX"`
|
|
|
+ Poster *User `xorm:"-"`
|
|
|
+ IssueID int64 `xorm:"INDEX"`
|
|
|
+ Issue *Issue `xorm:"-"`
|
|
|
CommitID int64
|
|
|
Line int64
|
|
|
Content string `xorm:"TEXT"`
|
|
@@ -82,84 +83,70 @@ func (c *Comment) BeforeUpdate() {
|
|
|
}
|
|
|
|
|
|
func (c *Comment) AfterSet(colName string, _ xorm.Cell) {
|
|
|
- var err error
|
|
|
switch colName {
|
|
|
- case "id":
|
|
|
- c.Attachments, err = GetAttachmentsByCommentID(c.ID)
|
|
|
- if err != nil {
|
|
|
- log.Error(3, "GetAttachmentsByCommentID[%d]: %v", c.ID, err)
|
|
|
- }
|
|
|
+ case "created_unix":
|
|
|
+ c.Created = time.Unix(c.CreatedUnix, 0).Local()
|
|
|
+ case "updated_unix":
|
|
|
+ c.Updated = time.Unix(c.UpdatedUnix, 0).Local()
|
|
|
+ }
|
|
|
+}
|
|
|
|
|
|
- case "poster_id":
|
|
|
+func (c *Comment) loadAttributes(e Engine) (err error) {
|
|
|
+ if c.Poster == nil {
|
|
|
c.Poster, err = GetUserByID(c.PosterID)
|
|
|
if err != nil {
|
|
|
if IsErrUserNotExist(err) {
|
|
|
c.PosterID = -1
|
|
|
c.Poster = NewGhostUser()
|
|
|
} else {
|
|
|
- log.Error(3, "GetUserByID[%d]: %v", c.ID, err)
|
|
|
+ return fmt.Errorf("getUserByID.(Poster) [%d]: %v", c.PosterID, err)
|
|
|
}
|
|
|
}
|
|
|
- case "created_unix":
|
|
|
- c.Created = time.Unix(c.CreatedUnix, 0).Local()
|
|
|
- case "updated_unix":
|
|
|
- c.Updated = time.Unix(c.UpdatedUnix, 0).Local()
|
|
|
}
|
|
|
-}
|
|
|
|
|
|
-func (c *Comment) AfterDelete() {
|
|
|
- _, err := DeleteAttachmentsByComment(c.ID, true)
|
|
|
+ if c.Issue == nil {
|
|
|
+ c.Issue, err = getRawIssueByID(e, c.IssueID)
|
|
|
+ if err != nil {
|
|
|
+ return fmt.Errorf("getIssueByID [%d]: %v", c.IssueID, err)
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- if err != nil {
|
|
|
- log.Info("Could not delete files for comment %d on issue #%d: %s", c.ID, c.IssueID, err)
|
|
|
+ if c.Attachments == nil {
|
|
|
+ c.Attachments, err = getAttachmentsByCommentID(e, c.ID)
|
|
|
+ if err != nil {
|
|
|
+ return fmt.Errorf("getAttachmentsByCommentID [%d]: %v", c.ID, err)
|
|
|
+ }
|
|
|
}
|
|
|
+
|
|
|
+ return nil
|
|
|
}
|
|
|
|
|
|
-func (c *Comment) HTMLURL() string {
|
|
|
- issue, err := GetIssueByID(c.IssueID)
|
|
|
- if err != nil { // Silently dropping errors :unamused:
|
|
|
- log.Error(4, "GetIssueByID(%d): %v", c.IssueID, err)
|
|
|
- return ""
|
|
|
- }
|
|
|
- return fmt.Sprintf("%s#issuecomment-%d", issue.HTMLURL(), c.ID)
|
|
|
+func (c *Comment) LoadAttributes() error {
|
|
|
+ return c.loadAttributes(x)
|
|
|
}
|
|
|
|
|
|
-func (c *Comment) IssueURL() string {
|
|
|
- issue, err := GetIssueByID(c.IssueID)
|
|
|
- if err != nil { // Silently dropping errors :unamused:
|
|
|
- log.Error(4, "GetIssueByID(%d): %v", c.IssueID, err)
|
|
|
- return ""
|
|
|
- }
|
|
|
+func (c *Comment) AfterDelete() {
|
|
|
+ _, err := DeleteAttachmentsByComment(c.ID, true)
|
|
|
|
|
|
- if issue.IsPull {
|
|
|
- return ""
|
|
|
+ if err != nil {
|
|
|
+ log.Info("Could not delete files for comment %d on issue #%d: %s", c.ID, c.IssueID, err)
|
|
|
}
|
|
|
- return issue.HTMLURL()
|
|
|
}
|
|
|
|
|
|
-func (c *Comment) PRURL() string {
|
|
|
- issue, err := GetIssueByID(c.IssueID)
|
|
|
- if err != nil { // Silently dropping errors :unamused:
|
|
|
- log.Error(4, "GetIssueByID(%d): %v", c.IssueID, err)
|
|
|
- return ""
|
|
|
- }
|
|
|
-
|
|
|
- if !issue.IsPull {
|
|
|
- return ""
|
|
|
- }
|
|
|
- return issue.HTMLURL()
|
|
|
+func (c *Comment) HTMLURL() string {
|
|
|
+ return fmt.Sprintf("%s#issuecomment-%d", c.Issue.HTMLURL(), c.ID)
|
|
|
}
|
|
|
|
|
|
+// This method assumes following fields have been assigned with valid values:
|
|
|
+// Required - Poster, Issue
|
|
|
func (c *Comment) APIFormat() *api.Comment {
|
|
|
return &api.Comment{
|
|
|
- ID: c.ID,
|
|
|
- Poster: c.Poster.APIFormat(),
|
|
|
- HTMLURL: c.HTMLURL(),
|
|
|
- IssueURL: c.IssueURL(),
|
|
|
- PRURL: c.PRURL(),
|
|
|
- Body: c.Content,
|
|
|
- Created: c.Created,
|
|
|
- Updated: c.Updated,
|
|
|
+ ID: c.ID,
|
|
|
+ HTMLURL: c.HTMLURL(),
|
|
|
+ Poster: c.Poster.APIFormat(),
|
|
|
+ Body: c.Content,
|
|
|
+ Created: c.Created,
|
|
|
+ Updated: c.Updated,
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -294,7 +281,7 @@ func createComment(e *xorm.Session, opts *CreateCommentOptions) (_ *Comment, err
|
|
|
comment.MailParticipants(act.OpType, opts.Issue)
|
|
|
}
|
|
|
|
|
|
- return comment, nil
|
|
|
+ return comment, comment.loadAttributes(e)
|
|
|
}
|
|
|
|
|
|
func createStatusComment(e *xorm.Session, doer *User, repo *Repository, issue *Issue) (*Comment, error) {
|
|
@@ -389,7 +376,18 @@ func GetCommentByID(id int64) (*Comment, error) {
|
|
|
} else if !has {
|
|
|
return nil, ErrCommentNotExist{id, 0}
|
|
|
}
|
|
|
- return c, nil
|
|
|
+ return c, c.LoadAttributes()
|
|
|
+}
|
|
|
+
|
|
|
+// FIXME: use CommentList to improve performance.
|
|
|
+func loadCommentsAttributes(e Engine, comments []*Comment) (err error) {
|
|
|
+ for i := range comments {
|
|
|
+ if err = comments[i].loadAttributes(e); err != nil {
|
|
|
+ return fmt.Errorf("loadAttributes [%d]: %v", comments[i].ID, err)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return nil
|
|
|
}
|
|
|
|
|
|
func getCommentsByIssueIDSince(e Engine, issueID, since int64) ([]*Comment, error) {
|
|
@@ -398,7 +396,11 @@ func getCommentsByIssueIDSince(e Engine, issueID, since int64) ([]*Comment, erro
|
|
|
if since > 0 {
|
|
|
sess.And("updated_unix >= ?", since)
|
|
|
}
|
|
|
- return comments, sess.Find(&comments)
|
|
|
+
|
|
|
+ if err := sess.Find(&comments); err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ return comments, loadCommentsAttributes(e, comments)
|
|
|
}
|
|
|
|
|
|
func getCommentsByRepoIDSince(e Engine, repoID, since int64) ([]*Comment, error) {
|
|
@@ -407,7 +409,10 @@ func getCommentsByRepoIDSince(e Engine, repoID, since int64) ([]*Comment, error)
|
|
|
if since > 0 {
|
|
|
sess.And("updated_unix >= ?", since)
|
|
|
}
|
|
|
- return comments, sess.Find(&comments)
|
|
|
+ if err := sess.Find(&comments); err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ return comments, loadCommentsAttributes(e, comments)
|
|
|
}
|
|
|
|
|
|
func getCommentsByIssueID(e Engine, issueID int64) ([]*Comment, error) {
|