diff options
author | Unknwon <u@gogs.io> | 2016-08-16 10:19:09 -0700 |
---|---|---|
committer | Unknwon <u@gogs.io> | 2016-08-16 10:19:09 -0700 |
commit | 6f9a95f83020e215ebe3942bd541da34791dd043 (patch) | |
tree | 9d95bc94e2346c808863377f79708d32decb8908 /models/issue.go | |
parent | 8bf57be9ba82d7b5289c894c902b5ecaaa1142bf (diff) | |
download | gitea-6f9a95f83020e215ebe3942bd541da34791dd043.tar.gz gitea-6f9a95f83020e215ebe3942bd541da34791dd043.zip |
#2246 add HTMLURL to webhook type
- Fill Milestone and Assignee field when available in webhook payload
Diffstat (limited to 'models/issue.go')
-rw-r--r-- | models/issue.go | 86 |
1 files changed, 54 insertions, 32 deletions
diff --git a/models/issue.go b/models/issue.go index 9b9dedb693..53f5b04f85 100644 --- a/models/issue.go +++ b/models/issue.go @@ -32,23 +32,23 @@ var ( type Issue struct { ID int64 `xorm:"pk autoincr"` RepoID int64 `xorm:"INDEX UNIQUE(repo_index)"` - Index int64 `xorm:"UNIQUE(repo_index)"` // Index in one repository. - Title string `xorm:"name"` Repo *Repository `xorm:"-"` + Index int64 `xorm:"UNIQUE(repo_index)"` // Index in one repository. PosterID int64 Poster *User `xorm:"-"` + Title string `xorm:"name"` + Content string `xorm:"TEXT"` + RenderedContent string `xorm:"-"` Labels []*Label `xorm:"-"` MilestoneID int64 Milestone *Milestone `xorm:"-"` + Priority int AssigneeID int64 Assignee *User `xorm:"-"` - IsRead bool `xorm:"-"` - IsPull bool // Indicates whether is a pull request or not. - *PullRequest `xorm:"-"` IsClosed bool - Content string `xorm:"TEXT"` - RenderedContent string `xorm:"-"` - Priority int + IsRead bool `xorm:"-"` + IsPull bool // Indicates whether is a pull request or not. + PullRequest *PullRequest `xorm:"-"` NumComments int Deadline time.Time `xorm:"-"` @@ -155,6 +155,16 @@ func (issue *Issue) LoadAttributes() error { return issue.loadAttributes(x) } +func (issue *Issue) HTMLURL() string { + var path string + if issue.IsPull { + path = "pulls" + } else { + path = "issues" + } + return fmt.Sprintf("%s/%s/%d", issue.Repo.HTMLURL(), path, issue.Index) +} + // State returns string representation of issue status. func (i *Issue) State() api.StateType { if i.IsClosed { @@ -175,11 +185,11 @@ func (issue *Issue) APIFormat() *api.Issue { apiIssue := &api.Issue{ ID: issue.ID, Index: issue.Index, - State: issue.State(), + Poster: issue.Poster.APIFormat(), Title: issue.Title, Body: issue.Content, - User: issue.Poster.APIFormat(), Labels: apiLabels, + State: issue.State(), Comments: issue.NumComments, Created: issue.Created, Updated: issue.Updated, @@ -208,16 +218,6 @@ func (i *Issue) HashTag() string { return "issue-" + com.ToStr(i.ID) } -func (issue *Issue) FullLink() string { - var path string - if issue.IsPull { - path = "pulls" - } else { - path = "issues" - } - return fmt.Sprintf("%s/%s/%d", issue.Repo.FullLink(), path, issue.Index) -} - // IsPoster returns true if given user by ID is the poster. func (i *Issue) IsPoster(uid int64) bool { return i.PosterID == uid @@ -591,16 +591,44 @@ func newIssue(e *xorm.Session, opts NewIssueOptions) (err error) { opts.Issue.Title = strings.TrimSpace(opts.Issue.Title) opts.Issue.Index = opts.Repo.NextIssueIndex() + if opts.Issue.MilestoneID > 0 { + milestone, err := getMilestoneByID(e, opts.Issue.MilestoneID) + if err != nil && !IsErrMilestoneNotExist(err) { + return fmt.Errorf("getMilestoneByID: %v", err) + } + + // Assume milestone is invalid and drop silently. + opts.Issue.MilestoneID = 0 + if milestone != nil { + opts.Issue.MilestoneID = milestone.ID + opts.Issue.Milestone = milestone + if err = changeMilestoneAssign(e, opts.Issue, -1); err != nil { + return err + } + } + } + if opts.Issue.AssigneeID > 0 { - // Silently drop invalid assignee. - valid, err := hasAccess(e, &User{ID: opts.Issue.AssigneeID}, opts.Repo, ACCESS_MODE_WRITE) - if err != nil { - return fmt.Errorf("hasAccess [user_id: %d, repo_id: %d]: %v", opts.Issue.AssigneeID, opts.Repo.ID, err) - } else if !valid { - opts.Issue.AssigneeID = 0 + assignee, err := getUserByID(e, opts.Issue.AssigneeID) + if err != nil && !IsErrUserNotExist(err) { + return fmt.Errorf("getUserByID: %v", err) + } + + // Assume assignee is invalid and drop silently. + opts.Issue.AssigneeID = 0 + if assignee != nil { + valid, err := hasAccess(e, assignee, opts.Repo, ACCESS_MODE_WRITE) + if err != nil { + return fmt.Errorf("hasAccess [user_id: %d, repo_id: %d]: %v", assignee.ID, opts.Repo.ID, err) + } + if valid { + opts.Issue.AssigneeID = assignee.ID + opts.Issue.Assignee = assignee + } } } + // Milestone and assignee validation should happen before insert actual object. if _, err = e.Insert(opts.Issue); err != nil { return err } @@ -634,12 +662,6 @@ func newIssue(e *xorm.Session, opts NewIssueOptions) (err error) { } } - if opts.Issue.MilestoneID > 0 { - if err = changeMilestoneAssign(e, opts.Issue, -1); err != nil { - return err - } - } - if err = newIssueUsers(e, opts.Repo, opts.Issue); err != nil { return err } |