@@ -207,6 +207,10 @@ func ListIssues(ctx *context.APIContext) {
207207 // in: query
208208 // description: search string
209209 // type: string
210+ // - name: type
211+ // in: query
212+ // description: filter by type (issues / pulls) if set
213+ // type: string
210214 // responses:
211215 // "200":
212216 // "$ref": "#/responses/IssueList"
@@ -242,6 +246,16 @@ func ListIssues(ctx *context.APIContext) {
242246 }
243247 }
244248
249+ var isPull util.OptionalBool
250+ switch ctx .Query ("type" ) {
251+ case "pulls" :
252+ isPull = util .OptionalBoolTrue
253+ case "issues" :
254+ isPull = util .OptionalBoolFalse
255+ default :
256+ isPull = util .OptionalBoolNone
257+ }
258+
245259 // Only fetch the issues if we either don't have a keyword or the search returned issues
246260 // This would otherwise return all issues if no issues were found by the search.
247261 if len (keyword ) == 0 || len (issueIDs ) > 0 || len (labelIDs ) > 0 {
@@ -252,6 +266,7 @@ func ListIssues(ctx *context.APIContext) {
252266 IsClosed : isClosed ,
253267 IssueIDs : issueIDs ,
254268 LabelIDs : labelIDs ,
269+ IsPull : isPull ,
255270 })
256271 }
257272
@@ -476,14 +491,15 @@ func EditIssue(ctx *context.APIContext, form api.EditIssueOption) {
476491 return
477492 }
478493 issue .Repo = ctx .Repo .Repository
494+ canWrite := ctx .Repo .CanWriteIssuesOrPulls (issue .IsPull )
479495
480496 err = issue .LoadAttributes ()
481497 if err != nil {
482498 ctx .Error (http .StatusInternalServerError , "LoadAttributes" , err )
483499 return
484500 }
485501
486- if ! issue .IsPoster (ctx .User .ID ) && ! ctx . Repo . CanWrite ( models . UnitTypeIssues ) {
502+ if ! issue .IsPoster (ctx .User .ID ) && ! canWrite {
487503 ctx .Status (http .StatusForbidden )
488504 return
489505 }
@@ -496,7 +512,7 @@ func EditIssue(ctx *context.APIContext, form api.EditIssueOption) {
496512 }
497513
498514 // Update or remove the deadline, only if set and allowed
499- if (form .Deadline != nil || form .RemoveDeadline != nil ) && ctx . Repo . CanWrite ( models . UnitTypeIssues ) {
515+ if (form .Deadline != nil || form .RemoveDeadline != nil ) && canWrite {
500516 var deadlineUnix timeutil.TimeStamp
501517
502518 if (form .RemoveDeadline == nil || ! * form .RemoveDeadline ) && ! form .Deadline .IsZero () {
@@ -520,7 +536,7 @@ func EditIssue(ctx *context.APIContext, form api.EditIssueOption) {
520536 // Pass one or more user logins to replace the set of assignees on this Issue.
521537 // Send an empty array ([]) to clear all assignees from the Issue.
522538
523- if ctx . Repo . CanWrite ( models . UnitTypeIssues ) && (form .Assignees != nil || form .Assignee != nil ) {
539+ if canWrite && (form .Assignees != nil || form .Assignee != nil ) {
524540 oneAssignee := ""
525541 if form .Assignee != nil {
526542 oneAssignee = * form .Assignee
@@ -533,7 +549,7 @@ func EditIssue(ctx *context.APIContext, form api.EditIssueOption) {
533549 }
534550 }
535551
536- if ctx . Repo . CanWrite ( models . UnitTypeIssues ) && form .Milestone != nil &&
552+ if canWrite && form .Milestone != nil &&
537553 issue .MilestoneID != * form .Milestone {
538554 oldMilestoneID := issue .MilestoneID
539555 issue .MilestoneID = * form .Milestone
@@ -619,7 +635,7 @@ func UpdateIssueDeadline(ctx *context.APIContext, form api.EditDeadlineOption) {
619635 return
620636 }
621637
622- if ! ctx .Repo .CanWrite ( models . UnitTypeIssues ) {
638+ if ! ctx .Repo .CanWriteIssuesOrPulls ( issue . IsPull ) {
623639 ctx .Error (http .StatusForbidden , "" , "Not repo writer" )
624640 return
625641 }
0 commit comments