Fix #2001 and fix issue comments hidden (#2016)

* revert #2001 and fix issue comments hidden

* fix #2001

* fix import

* improve comment type

* reduce unnecessary join

* fix comment on FindCommentsOptions
This commit is contained in:
Lunny Xiao 2017-06-21 09:00:44 +08:00 committed by GitHub
parent 0a5dc640a1
commit d71fad2ab7
3 changed files with 68 additions and 27 deletions

View File

@ -174,7 +174,10 @@ func (issue *Issue) loadAttributes(e Engine) (err error) {
} }
if issue.Comments == nil { if issue.Comments == nil {
issue.Comments, err = getCommentsByIssueID(e, issue.ID) issue.Comments, err = findComments(e, FindCommentsOptions{
IssueID: issue.ID,
Type: CommentTypeUnknown,
})
if err != nil { if err != nil {
return fmt.Errorf("getCommentsByIssueID [%d]: %v", issue.ID, err) return fmt.Errorf("getCommentsByIssueID [%d]: %v", issue.ID, err)
} }

View File

@ -10,6 +10,7 @@ import (
"time" "time"
"github.com/Unknwon/com" "github.com/Unknwon/com"
"github.com/go-xorm/builder"
"github.com/go-xorm/xorm" "github.com/go-xorm/xorm"
api "code.gitea.io/sdk/gitea" api "code.gitea.io/sdk/gitea"
@ -21,6 +22,11 @@ import (
// CommentType defines whether a comment is just a simple comment, an action (like close) or a reference. // CommentType defines whether a comment is just a simple comment, an action (like close) or a reference.
type CommentType int type CommentType int
// define unknown comment type
const (
CommentTypeUnknown CommentType = -1
)
// Enumerate all the comment types // Enumerate all the comment types
const ( const (
// Plain comment, can be associated with a commit (CommitID > 0) and a line (LineNum > 0) // Plain comment, can be associated with a commit (CommitID > 0) and a line (LineNum > 0)
@ -568,47 +574,71 @@ func GetCommentByID(id int64) (*Comment, error) {
return c, nil return c, nil
} }
func getCommentsByIssueIDSince(e Engine, issueID, since int64) ([]*Comment, error) { // FindCommentsOptions describes the conditions to Find comments
comments := make([]*Comment, 0, 10) type FindCommentsOptions struct {
sess := e. RepoID int64
Where("issue_id = ?", issueID). IssueID int64
Where("type = ?", CommentTypeComment). Since int64
Asc("created_unix") Type CommentType
if since > 0 {
sess.And("updated_unix >= ?", since)
}
return comments, sess.Find(&comments)
} }
func getCommentsByRepoIDSince(e Engine, repoID, since int64) ([]*Comment, error) { func (opts *FindCommentsOptions) toConds() builder.Cond {
comments := make([]*Comment, 0, 10) var cond = builder.NewCond()
sess := e.Where("issue.repo_id = ?", repoID). if opts.RepoID > 0 {
Where("comment.type = ?", CommentTypeComment). cond = cond.And(builder.Eq{"issue.repo_id": opts.RepoID})
Join("INNER", "issue", "issue.id = comment.issue_id").
Asc("comment.created_unix")
if since > 0 {
sess.And("comment.updated_unix >= ?", since)
} }
return comments, sess.Find(&comments) if opts.IssueID > 0 {
cond = cond.And(builder.Eq{"comment.issue_id": opts.IssueID})
}
if opts.Since > 0 {
cond = cond.And(builder.Gte{"comment.updated_unix": opts.Since})
}
if opts.Type != CommentTypeUnknown {
cond = cond.And(builder.Eq{"comment.type": opts.Type})
}
return cond
} }
func getCommentsByIssueID(e Engine, issueID int64) ([]*Comment, error) { func findComments(e Engine, opts FindCommentsOptions) ([]*Comment, error) {
return getCommentsByIssueIDSince(e, issueID, -1) comments := make([]*Comment, 0, 10)
sess := e.Where(opts.toConds())
if opts.RepoID > 0 {
sess.Join("INNER", "issue", "issue.id = comment.issue_id")
}
return comments, sess.
Asc("comment.created_unix").
Find(&comments)
}
// FindComments returns all comments according options
func FindComments(opts FindCommentsOptions) ([]*Comment, error) {
return findComments(x, opts)
} }
// GetCommentsByIssueID returns all comments of an issue. // GetCommentsByIssueID returns all comments of an issue.
func GetCommentsByIssueID(issueID int64) ([]*Comment, error) { func GetCommentsByIssueID(issueID int64) ([]*Comment, error) {
return getCommentsByIssueID(x, issueID) return findComments(x, FindCommentsOptions{
IssueID: issueID,
Type: CommentTypeUnknown,
})
} }
// GetCommentsByIssueIDSince returns a list of comments of an issue since a given time point. // GetCommentsByIssueIDSince returns a list of comments of an issue since a given time point.
func GetCommentsByIssueIDSince(issueID, since int64) ([]*Comment, error) { func GetCommentsByIssueIDSince(issueID, since int64) ([]*Comment, error) {
return getCommentsByIssueIDSince(x, issueID, since) return findComments(x, FindCommentsOptions{
IssueID: issueID,
Type: CommentTypeUnknown,
Since: since,
})
} }
// GetCommentsByRepoIDSince returns a list of comments for all issues in a repo since a given time point. // GetCommentsByRepoIDSince returns a list of comments for all issues in a repo since a given time point.
func GetCommentsByRepoIDSince(repoID, since int64) ([]*Comment, error) { func GetCommentsByRepoIDSince(repoID, since int64) ([]*Comment, error) {
return getCommentsByRepoIDSince(x, repoID, since) return findComments(x, FindCommentsOptions{
RepoID: repoID,
Type: CommentTypeUnknown,
Since: since,
})
} }
// UpdateComment updates information of comment. // UpdateComment updates information of comment.

View File

@ -27,7 +27,11 @@ func ListIssueComments(ctx *context.APIContext) {
return return
} }
comments, err := models.GetCommentsByIssueIDSince(issue.ID, since.Unix()) comments, err := models.FindComments(models.FindCommentsOptions{
IssueID: issue.ID,
Since: since.Unix(),
Type: models.CommentTypeComment,
})
if err != nil { if err != nil {
ctx.Error(500, "GetCommentsByIssueIDSince", err) ctx.Error(500, "GetCommentsByIssueIDSince", err)
return return
@ -47,7 +51,11 @@ func ListRepoIssueComments(ctx *context.APIContext) {
since, _ = time.Parse(time.RFC3339, ctx.Query("since")) since, _ = time.Parse(time.RFC3339, ctx.Query("since"))
} }
comments, err := models.GetCommentsByRepoIDSince(ctx.Repo.Repository.ID, since.Unix()) comments, err := models.FindComments(models.FindCommentsOptions{
RepoID: ctx.Repo.Repository.ID,
Since: since.Unix(),
Type: models.CommentTypeComment,
})
if err != nil { if err != nil {
ctx.Error(500, "GetCommentsByRepoIDSince", err) ctx.Error(500, "GetCommentsByRepoIDSince", err)
return return