Allow filtering PRs by poster in the ListPullRequests API (#32209)

as title

---
*Sponsored by Kithara Software GmbH*

(cherry picked from commit bdd655f2bde5facada4394f36fe54e364787de7a)
This commit is contained in:
6543 2024-10-07 23:21:07 +02:00 committed by Earl Warren
parent 059f08c00e
commit d0af8fe4dc
No known key found for this signature in database
GPG key ID: 0579CB2928A78A00
3 changed files with 57 additions and 15 deletions

View file

@ -26,6 +26,7 @@ type PullRequestsOptions struct {
SortType string SortType string
Labels []int64 Labels []int64
MilestoneID int64 MilestoneID int64
PosterID int64
} }
func listPullRequestStatement(ctx context.Context, baseRepoID int64, opts *PullRequestsOptions) *xorm.Session { func listPullRequestStatement(ctx context.Context, baseRepoID int64, opts *PullRequestsOptions) *xorm.Session {
@ -46,6 +47,10 @@ func listPullRequestStatement(ctx context.Context, baseRepoID int64, opts *PullR
sess.And("issue.milestone_id=?", opts.MilestoneID) sess.And("issue.milestone_id=?", opts.MilestoneID)
} }
if opts.PosterID > 0 {
sess.And("issue.poster_id=?", opts.PosterID)
}
return sess return sess
} }

View file

@ -52,56 +52,79 @@ func ListPullRequests(ctx *context.APIContext) {
// parameters: // parameters:
// - name: owner // - name: owner
// in: path // in: path
// description: owner of the repo // description: Owner of the repo
// type: string // type: string
// required: true // required: true
// - name: repo // - name: repo
// in: path // in: path
// description: name of the repo // description: Name of the repo
// type: string // type: string
// required: true // required: true
// - name: state // - name: state
// in: query // in: query
// description: "State of pull request: open or closed (optional)" // description: State of pull request
// type: string // type: string
// enum: [closed, open, all] // enum: [open, closed, all]
// default: open
// - name: sort // - name: sort
// in: query // in: query
// description: "Type of sort" // description: Type of sort
// type: string // type: string
// enum: [oldest, recentupdate, leastupdate, mostcomment, leastcomment, priority] // enum: [oldest, recentupdate, leastupdate, mostcomment, leastcomment, priority]
// - name: milestone // - name: milestone
// in: query // in: query
// description: "ID of the milestone" // description: ID of the milestone
// type: integer // type: integer
// format: int64 // format: int64
// - name: labels // - name: labels
// in: query // in: query
// description: "Label IDs" // description: Label IDs
// type: array // type: array
// collectionFormat: multi // collectionFormat: multi
// items: // items:
// type: integer // type: integer
// format: int64 // format: int64
// - name: poster
// in: query
// description: Filter by pull request author
// type: string
// - name: page // - name: page
// in: query // in: query
// description: page number of results to return (1-based) // description: Page number of results to return (1-based)
// type: integer // type: integer
// minimum: 1
// default: 1
// - name: limit // - name: limit
// in: query // in: query
// description: page size of results // description: Page size of results
// type: integer // type: integer
// minimum: 0
// responses: // responses:
// "200": // "200":
// "$ref": "#/responses/PullRequestList" // "$ref": "#/responses/PullRequestList"
// "404": // "404":
// "$ref": "#/responses/notFound" // "$ref": "#/responses/notFound"
// "500":
// "$ref": "#/responses/error"
labelIDs, err := base.StringsToInt64s(ctx.FormStrings("labels")) labelIDs, err := base.StringsToInt64s(ctx.FormStrings("labels"))
if err != nil { if err != nil {
ctx.Error(http.StatusInternalServerError, "PullRequests", err) ctx.Error(http.StatusInternalServerError, "PullRequests", err)
return return
} }
var posterID int64
if posterStr := ctx.FormString("poster"); posterStr != "" {
poster, err := user_model.GetUserByName(ctx, posterStr)
if err != nil {
if user_model.IsErrUserNotExist(err) {
ctx.Error(http.StatusBadRequest, "Poster not found", err)
} else {
ctx.Error(http.StatusInternalServerError, "GetUserByName", err)
}
return
}
posterID = poster.ID
}
listOptions := utils.GetListOptions(ctx) listOptions := utils.GetListOptions(ctx)
prs, maxResults, err := issues_model.PullRequests(ctx, ctx.Repo.Repository.ID, &issues_model.PullRequestsOptions{ prs, maxResults, err := issues_model.PullRequests(ctx, ctx.Repo.Repository.ID, &issues_model.PullRequestsOptions{
ListOptions: listOptions, ListOptions: listOptions,
@ -109,6 +132,7 @@ func ListPullRequests(ctx *context.APIContext) {
SortType: ctx.FormTrim("sort"), SortType: ctx.FormTrim("sort"),
Labels: labelIDs, Labels: labelIDs,
MilestoneID: ctx.FormInt64("milestone"), MilestoneID: ctx.FormInt64("milestone"),
PosterID: posterID,
}) })
if err != nil { if err != nil {
ctx.Error(http.StatusInternalServerError, "PullRequests", err) ctx.Error(http.StatusInternalServerError, "PullRequests", err)

View file

@ -12295,26 +12295,27 @@
"parameters": [ "parameters": [
{ {
"type": "string", "type": "string",
"description": "owner of the repo", "description": "Owner of the repo",
"name": "owner", "name": "owner",
"in": "path", "in": "path",
"required": true "required": true
}, },
{ {
"type": "string", "type": "string",
"description": "name of the repo", "description": "Name of the repo",
"name": "repo", "name": "repo",
"in": "path", "in": "path",
"required": true "required": true
}, },
{ {
"enum": [ "enum": [
"closed",
"open", "open",
"closed",
"all" "all"
], ],
"type": "string", "type": "string",
"description": "State of pull request: open or closed (optional)", "default": "open",
"description": "State of pull request",
"name": "state", "name": "state",
"in": "query" "in": "query"
}, },
@ -12351,14 +12352,23 @@
"in": "query" "in": "query"
}, },
{ {
"type": "string",
"description": "Filter by pull request author",
"name": "poster",
"in": "query"
},
{
"minimum": 1,
"type": "integer", "type": "integer",
"description": "page number of results to return (1-based)", "default": 1,
"description": "Page number of results to return (1-based)",
"name": "page", "name": "page",
"in": "query" "in": "query"
}, },
{ {
"minimum": 0,
"type": "integer", "type": "integer",
"description": "page size of results", "description": "Page size of results",
"name": "limit", "name": "limit",
"in": "query" "in": "query"
} }
@ -12369,6 +12379,9 @@
}, },
"404": { "404": {
"$ref": "#/responses/notFound" "$ref": "#/responses/notFound"
},
"500": {
"$ref": "#/responses/error"
} }
} }
}, },