@@ -206,6 +206,10 @@ func ListIssues(ctx *context.APIContext) {
206206 // in: query
207207 // description: search string
208208 // type: string
209+ // - name: type
210+ // in: query
211+ // description: filter by type (issues / pulls) if set
212+ // type: string
209213 // responses:
210214 // "200":
211215 // "$ref": "#/responses/IssueList"
@@ -241,6 +245,16 @@ func ListIssues(ctx *context.APIContext) {
241245 }
242246 }
243247
248+ var isPull util.OptionalBool
249+ switch ctx .Query ("type" ) {
250+ case "pulls" :
251+ isPull = util .OptionalBoolTrue
252+ case "issues" :
253+ isPull = util .OptionalBoolFalse
254+ default :
255+ isPull = util .OptionalBoolNone
256+ }
257+
244258 // Only fetch the issues if we either don't have a keyword or the search returned issues
245259 // This would otherwise return all issues if no issues were found by the search.
246260 if len (keyword ) == 0 || len (issueIDs ) > 0 || len (labelIDs ) > 0 {
@@ -251,6 +265,7 @@ func ListIssues(ctx *context.APIContext) {
251265 IsClosed : isClosed ,
252266 IssueIDs : issueIDs ,
253267 LabelIDs : labelIDs ,
268+ IsPull : isPull ,
254269 })
255270 }
256271
@@ -475,14 +490,15 @@ func EditIssue(ctx *context.APIContext, form api.EditIssueOption) {
475490 return
476491 }
477492 issue .Repo = ctx .Repo .Repository
493+ canWrite := ctx .Repo .CanWriteIssuesOrPulls (issue .IsPull )
478494
479495 err = issue .LoadAttributes ()
480496 if err != nil {
481497 ctx .Error (http .StatusInternalServerError , "LoadAttributes" , err )
482498 return
483499 }
484500
485- if ! issue .IsPoster (ctx .User .ID ) && ! ctx . Repo . CanWrite ( models . UnitTypeIssues ) {
501+ if ! issue .IsPoster (ctx .User .ID ) && ! canWrite {
486502 ctx .Status (http .StatusForbidden )
487503 return
488504 }
@@ -495,7 +511,7 @@ func EditIssue(ctx *context.APIContext, form api.EditIssueOption) {
495511 }
496512
497513 // Update or remove the deadline, only if set and allowed
498- if (form .Deadline != nil || form .RemoveDeadline != nil ) && ctx . Repo . CanWrite ( models . UnitTypeIssues ) {
514+ if (form .Deadline != nil || form .RemoveDeadline != nil ) && canWrite {
499515 var deadlineUnix timeutil.TimeStamp
500516
501517 if (form .RemoveDeadline == nil || ! * form .RemoveDeadline ) && ! form .Deadline .IsZero () {
@@ -519,7 +535,7 @@ func EditIssue(ctx *context.APIContext, form api.EditIssueOption) {
519535 // Pass one or more user logins to replace the set of assignees on this Issue.
520536 // Send an empty array ([]) to clear all assignees from the Issue.
521537
522- if ctx . Repo . CanWrite ( models . UnitTypeIssues ) && (form .Assignees != nil || form .Assignee != nil ) {
538+ if canWrite && (form .Assignees != nil || form .Assignee != nil ) {
523539 oneAssignee := ""
524540 if form .Assignee != nil {
525541 oneAssignee = * form .Assignee
@@ -532,7 +548,7 @@ func EditIssue(ctx *context.APIContext, form api.EditIssueOption) {
532548 }
533549 }
534550
535- if ctx . Repo . CanWrite ( models . UnitTypeIssues ) && form .Milestone != nil &&
551+ if canWrite && form .Milestone != nil &&
536552 issue .MilestoneID != * form .Milestone {
537553 oldMilestoneID := issue .MilestoneID
538554 issue .MilestoneID = * form .Milestone
@@ -618,7 +634,7 @@ func UpdateIssueDeadline(ctx *context.APIContext, form api.EditDeadlineOption) {
618634 return
619635 }
620636
621- if ! ctx .Repo .CanWrite ( models . UnitTypeIssues ) {
637+ if ! ctx .Repo .CanWriteIssuesOrPulls ( issue . IsPull ) {
622638 ctx .Error (http .StatusForbidden , "" , "Not repo writer" )
623639 return
624640 }
0 commit comments