Skip to content

Commit 42c54d0

Browse files
committed
feat: add pagination support and update swagger documentation
1 parent f3f6908 commit 42c54d0

File tree

8 files changed

+157
-76
lines changed

8 files changed

+157
-76
lines changed

modules/structs/project_column.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,15 @@ type Column struct {
1212

1313
// EditProjectColumnOption options for editing a project column
1414
type EditProjectColumnOption struct {
15-
Title string `binding:"MaxSize(100)"`
16-
Sorting int8
17-
Color string `binding:"MaxSize(7)"`
15+
Title string `json:"title" binding:"MaxSize(100)"`
16+
Sorting int8 `json:"sorting"`
17+
Color string `json:"color" binding:"MaxSize(7)"`
1818
}
1919

2020
// CreateProjectColumnOption options for creating a project column
2121
type CreateProjectColumnOption struct {
2222
// required:true
23-
Title string `binding:"Required;MaxSize(100)"`
24-
Sorting int8
25-
Color string `binding:"MaxSize(7)"`
23+
Title string `json:"title" binding:"Required;MaxSize(100)"`
24+
Sorting int8 `json:"sorting"`
25+
Color string `json:"color" binding:"MaxSize(7)"`
2626
}

routers/api/v1/api.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1158,7 +1158,7 @@ func Routes() *web.Router {
11581158
m.Group("", func() {
11591159
m.Patch("", bind(api.EditProjectColumnOption{}), project.EditProjectColumn)
11601160
m.Delete("", project.DeleteProjectColumn)
1161-
m.Post("/default", project.SetDefaultProjectColumn)
1161+
m.Put("/default", project.SetDefaultProjectColumn)
11621162
}, reqRepoWriter(unit.TypeProjects), mustNotBeArchived, reqUnitAccess(unit.TypeProjects, perm.AccessModeWrite, true), reqProjectOwner())
11631163
})
11641164
}, tokenRequiresScopes(auth_model.AccessTokenScopeCategoryOrganization, auth_model.AccessTokenScopeCategoryRepository), reqToken(), projectIDAssignmentAPI(), columnAssignment(), individualPermsChecker, reqRepoReader(unit.TypeProjects), mustEnableRepoProjects, reqUnitAccess(unit.TypeProjects, perm.AccessModeRead, true))

routers/api/v1/org/project.go

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,14 @@ import (
1212
"code.gitea.io/gitea/modules/optional"
1313
api "code.gitea.io/gitea/modules/structs"
1414
"code.gitea.io/gitea/modules/web"
15+
"code.gitea.io/gitea/routers/api/v1/utils"
1516
"code.gitea.io/gitea/services/context"
1617
"code.gitea.io/gitea/services/convert"
1718
)
1819

1920
// CreateProject creates a new project for organization
2021
func CreateProject(ctx *context.APIContext) {
21-
// swagger:operation POST /orgs/{org}/projects project createProject
22+
// swagger:operation POST /orgs/{org}/projects project orgCreateProject
2223
// ---
2324
// summary: Create a new project
2425
// consumes:
@@ -71,7 +72,7 @@ func CreateProject(ctx *context.APIContext) {
7172

7273
// GetProjects returns a list of projects that belong to an organization
7374
func GetProjects(ctx *context.APIContext) {
74-
// swagger:operation GET /orgs/{org}/projects project getProjects
75+
// swagger:operation GET /orgs/{org}/projects project orgGetProjects
7576
// ---
7677
// summary: Get a list of projects
7778
// produces:
@@ -82,6 +83,14 @@ func GetProjects(ctx *context.APIContext) {
8283
// description: organization name that the project belongs to
8384
// required: true
8485
// type: string
86+
// - name: page
87+
// in: query
88+
// description: page number of results to return (1-based)
89+
// type: integer
90+
// - name: limit
91+
// in: query
92+
// description: page size of results
93+
// type: integer
8594
// responses:
8695
// "200":
8796
// "$ref": "#/responses/ProjectList"
@@ -92,23 +101,27 @@ func GetProjects(ctx *context.APIContext) {
92101
// "423":
93102
// "$ref": "#/responses/repoArchivedError"
94103

104+
listOptions := utils.GetListOptions(ctx)
95105
sortType := ctx.FormTrim("sort")
96106

97107
isShowClosed := strings.ToLower(ctx.FormTrim("state")) == "closed"
98108

99109
searchOptions := project_model.SearchOptions{
100-
IsClosed: optional.Some(isShowClosed),
101-
OrderBy: project_model.GetSearchOrderByBySortType(sortType),
102-
OwnerID: ctx.ContextUser.ID,
103-
Type: project_model.TypeOrganization,
110+
ListOptions: listOptions,
111+
IsClosed: optional.Some(isShowClosed),
112+
OrderBy: project_model.GetSearchOrderByBySortType(sortType),
113+
OwnerID: ctx.ContextUser.ID,
114+
Type: project_model.TypeOrganization,
104115
}
105116

106-
projects, err := db.Find[project_model.Project](ctx, &searchOptions)
117+
projects, maxResults, err := db.FindAndCount[project_model.Project](ctx, &searchOptions)
107118

108119
if err != nil {
109-
ctx.ServerError("FindProjects", err)
120+
ctx.Error(http.StatusInternalServerError, "db.FindAndCount[project_model.Project]", err)
110121
return
111122
}
112123

124+
ctx.SetLinkHeader(int(maxResults), listOptions.PageSize)
125+
ctx.SetTotalCountHeader(maxResults)
113126
ctx.JSON(http.StatusOK, convert.ToProjects(ctx, projects))
114127
}

routers/api/v1/project/project.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import (
1616

1717
// GetProject returns a project
1818
func GetProject(ctx *context.APIContext) {
19-
// swagger:operation GET /projects/{project_id} project getProject
19+
// swagger:operation GET /projects/{project_id} project projectGetProject
2020
// ---
2121
// summary: Get a project
2222
// produces:
@@ -73,7 +73,7 @@ func GetProject(ctx *context.APIContext) {
7373

7474
// EditProject edits a project
7575
func EditProject(ctx *context.APIContext) {
76-
// swagger:operation PATCH /projects/{project_id} project editProject
76+
// swagger:operation PATCH /projects/{project_id} project projectEditProject
7777
// ---
7878
// summary: Edit a project
7979
// produces:
@@ -119,7 +119,7 @@ func EditProject(ctx *context.APIContext) {
119119

120120
// DeleteProject deletes a project
121121
func DeleteProject(ctx *context.APIContext) {
122-
// swagger:operation DELETE /projects/{project_id} project deleteProject
122+
// swagger:operation DELETE /projects/{project_id} project projectDeleteProject
123123
// ---
124124
// summary: Delete a project
125125
// description: Deletes a specific project for a given user and repository.
@@ -151,7 +151,7 @@ func DeleteProject(ctx *context.APIContext) {
151151

152152
// ChangeProjectStatus updates the status of a project between "open" and "close"
153153
func ChangeProjectStatus(ctx *context.APIContext) {
154-
// swagger:operation PATCH /projects/{project_id}/{action} project changeProjectStatus
154+
// swagger:operation PATCH /projects/{project_id}/{action} project projectProjectChangeProjectStatus
155155
// ---
156156
// summary: Change the status of a project
157157
// produces:

routers/api/v1/project/project_column.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import (
1818

1919
// GetProjectColumn returns a project column
2020
func GetProjectColumn(ctx *context.APIContext) {
21-
// swagger:operation GET /projects/columns/{column_id} project getProject
21+
// swagger:operation GET /projects/columns/{column_id} project projectGetProjectColumn
2222
// ---
2323
// summary: Get a project column
2424
// produces:
@@ -51,7 +51,7 @@ func GetProjectColumn(ctx *context.APIContext) {
5151

5252
// GetProjectColumns returns a list of project columns
5353
func GetProjectColumns(ctx *context.APIContext) {
54-
// swagger:operation GET /projects/{project_id}/columns project getProject
54+
// swagger:operation GET /projects/{project_id}/columns project projectGetProjectColumns
5555
// ---
5656
// summary: Get a list of project columns
5757
// produces:
@@ -91,7 +91,7 @@ func GetProjectColumns(ctx *context.APIContext) {
9191

9292
// AddColumnToProject adds a new column to a project
9393
func AddColumnToProject(ctx *context.APIContext) {
94-
// swagger:operation POST /projects/{project_id}/columns project addColumnToProject
94+
// swagger:operation POST /projects/{project_id}/columns project projectAddColumnToProject
9595
// ---
9696
// summary: Add a column to a project
9797
// consumes:
@@ -153,7 +153,7 @@ func AddColumnToProject(ctx *context.APIContext) {
153153

154154
// EditProjectColumn edits a project column
155155
func EditProjectColumn(ctx *context.APIContext) {
156-
// swagger:operation PATCH /projects/columns/{column_id} project editProjectColumn
156+
// swagger:operation PATCH /projects/columns/{column_id} project projectEditProjectColumn
157157
// ---
158158
// summary: Edit a project column
159159
// consumes:
@@ -212,7 +212,7 @@ func EditProjectColumn(ctx *context.APIContext) {
212212

213213
// DeleteProjectColumn deletes a project column
214214
func DeleteProjectColumn(ctx *context.APIContext) {
215-
// swagger:operation DELETE /projects/columns/{column_id} project deleteProjectColumn
215+
// swagger:operation DELETE /projects/columns/{column_id} project projectDeleteProjectColumn
216216
// ---
217217
// summary: Delete a project column
218218
// parameters:
@@ -241,7 +241,7 @@ func DeleteProjectColumn(ctx *context.APIContext) {
241241

242242
// SetDefaultProjectColumn set default column for issues/pulls
243243
func SetDefaultProjectColumn(ctx *context.APIContext) {
244-
// swagger:operation PUT /projects/columns/{column_id}/default project setDefaultProjectColumn
244+
// swagger:operation PUT /projects/columns/{column_id}/default project projectSetDefaultProjectColumn
245245
// ---
246246
// summary: Set default column for issues/pulls
247247
// parameters:
@@ -276,7 +276,7 @@ func SetDefaultProjectColumn(ctx *context.APIContext) {
276276

277277
// MoveColumns moves or keeps columns in a project and sorts them inside that project
278278
func MoveColumns(ctx *context.APIContext) {
279-
// swagger:operation PATCH /projects/{project_id}/columns/move project moveColumns
279+
// swagger:operation PATCH /projects/{project_id}/columns/move project projectMoveColumns
280280
// ---
281281
// summary: Move columns in a project
282282
// consumes:
@@ -337,7 +337,7 @@ func MoveColumns(ctx *context.APIContext) {
337337

338338
// MoveIssues moves or keeps issues in a column and sorts them inside that column
339339
func MoveIssues(ctx *context.APIContext) {
340-
// swagger:operation PATCH /projects/{project_id}/columns/{column_id}/move project moveIssues
340+
// swagger:operation PATCH /projects/{project_id}/columns/{column_id}/move project projectMoveIssues
341341
// ---
342342
// summary: Move issues in a column
343343
// consumes:

routers/api/v1/repo/project.go

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,14 @@ import (
1717
api "code.gitea.io/gitea/modules/structs"
1818
"code.gitea.io/gitea/modules/util"
1919
"code.gitea.io/gitea/modules/web"
20+
"code.gitea.io/gitea/routers/api/v1/utils"
2021
"code.gitea.io/gitea/services/context"
2122
"code.gitea.io/gitea/services/convert"
2223
)
2324

2425
// GetProjects returns a list of projects for a given user and repository.
2526
func GetProjects(ctx *context.APIContext) {
26-
// swagger:operation GET /repos/{owner}/{reponame}/projects project getProjects
27+
// swagger:operation GET /repos/{owner}/{reponame}/projects project repoGetProjects
2728
// ---
2829
// summary: Get a list of projects
2930
// description: Returns a list of projects for a given user and repository.
@@ -40,6 +41,14 @@ func GetProjects(ctx *context.APIContext) {
4041
// description: repository name.
4142
// required: true
4243
// type: string
44+
// - name: page
45+
// in: query
46+
// description: page number of results to return (1-based)
47+
// type: integer
48+
// - name: limit
49+
// in: query
50+
// description: page size of results
51+
// type: integer
4352
// responses:
4453
// "200":
4554
// "$ref": "#/responses/ProjectList"
@@ -50,30 +59,34 @@ func GetProjects(ctx *context.APIContext) {
5059
// "423":
5160
// "$ref": "#/responses/repoArchivedError"
5261

62+
listOptions := utils.GetListOptions(ctx)
5363
sortType := ctx.FormTrim("sort")
5464

5565
isShowClosed := strings.ToLower(ctx.FormTrim("state")) == "closed"
5666

5767
searchOptions := project_model.SearchOptions{
58-
IsClosed: optional.Some(isShowClosed),
59-
OrderBy: project_model.GetSearchOrderByBySortType(sortType),
60-
RepoID: ctx.Repo.Repository.ID,
61-
Type: project_model.TypeRepository,
68+
ListOptions: listOptions,
69+
IsClosed: optional.Some(isShowClosed),
70+
OrderBy: project_model.GetSearchOrderByBySortType(sortType),
71+
RepoID: ctx.Repo.Repository.ID,
72+
Type: project_model.TypeRepository,
6273
}
6374

64-
projects, err := db.Find[project_model.Project](ctx, &searchOptions)
75+
projects, maxResults, err := db.FindAndCount[project_model.Project](ctx, &searchOptions)
6576

6677
if err != nil {
67-
ctx.ServerError("FindProjects", err)
78+
ctx.Error(http.StatusInternalServerError, "db.FindAndCount[project_model.Project]", err)
6879
return
6980
}
7081

82+
ctx.SetLinkHeader(int(maxResults), listOptions.PageSize)
83+
ctx.SetTotalCountHeader(maxResults)
7184
ctx.JSON(http.StatusOK, convert.ToProjects(ctx, projects))
7285
}
7386

7487
// CreateProject creates a new project
7588
func CreateProject(ctx *context.APIContext) {
76-
// swagger:operation POST /repos/{owner}/{reponame}/projects project createProject
89+
// swagger:operation POST /repos/{owner}/{reponame}/projects project repoCreateProject
7790
// ---
7891
// summary: Create a new project
7992
// description: Creates a new project for a given user and repository.
@@ -132,7 +145,7 @@ func CreateProject(ctx *context.APIContext) {
132145

133146
// UpdateIssueProject change an issue's project to another project in a repository
134147
func UpdateIssueProject(ctx *context.APIContext) {
135-
// swagger:operation PUT /repos/{owner}/{reponame}/projects/{type} project updateIssueProject
148+
// swagger:operation PUT /repos/{owner}/{reponame}/projects/{type} project repoUpdateIssueProject
136149
// ---
137150
// summary: Change an issue's project
138151
// consumes:

routers/api/v1/user/project.go

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,14 @@ import (
1212
"code.gitea.io/gitea/modules/optional"
1313
api "code.gitea.io/gitea/modules/structs"
1414
"code.gitea.io/gitea/modules/web"
15+
"code.gitea.io/gitea/routers/api/v1/utils"
1516
"code.gitea.io/gitea/services/context"
1617
"code.gitea.io/gitea/services/convert"
1718
)
1819

1920
// CreateProject creates a new project for a user
2021
func CreateProject(ctx *context.APIContext) {
21-
// swagger:operation POST /user/projects project createProject
22+
// swagger:operation POST /user/projects project userCreateProject
2223
// ---
2324
// summary: Create a new project for user
2425
// consumes:
@@ -66,7 +67,7 @@ func CreateProject(ctx *context.APIContext) {
6667

6768
// GetProjects returns a list of projects that belong to a user
6869
func GetProjects(ctx *context.APIContext) {
69-
// swagger:operation GET /users/{username}/projects project getProjects
70+
// swagger:operation GET /users/{username}/projects project userGetProjects
7071
// ---
7172
// summary: Get a list of projects
7273
// produces:
@@ -77,6 +78,14 @@ func GetProjects(ctx *context.APIContext) {
7778
// description: owner of the project
7879
// required: true
7980
// type: string
81+
// - name: page
82+
// in: query
83+
// description: page number of results to return (1-based)
84+
// type: integer
85+
// - name: limit
86+
// in: query
87+
// description: page size of results
88+
// type: integer
8089
// responses:
8190
// "200":
8291
// "$ref": "#/responses/ProjectList"
@@ -87,23 +96,27 @@ func GetProjects(ctx *context.APIContext) {
8796
// "423":
8897
// "$ref": "#/responses/repoArchivedError"
8998

99+
listOptions := utils.GetListOptions(ctx)
90100
sortType := ctx.FormTrim("sort")
91101

92102
isShowClosed := strings.ToLower(ctx.FormTrim("state")) == "closed"
93103

94104
searchOptions := project_model.SearchOptions{
95-
IsClosed: optional.Some(isShowClosed),
96-
OrderBy: project_model.GetSearchOrderByBySortType(sortType),
97-
OwnerID: ctx.ContextUser.ID,
98-
Type: project_model.TypeIndividual,
105+
ListOptions: listOptions,
106+
IsClosed: optional.Some(isShowClosed),
107+
OrderBy: project_model.GetSearchOrderByBySortType(sortType),
108+
OwnerID: ctx.ContextUser.ID,
109+
Type: project_model.TypeIndividual,
99110
}
100111

101-
projects, err := db.Find[project_model.Project](ctx, &searchOptions)
112+
projects, maxResults, err := db.FindAndCount[project_model.Project](ctx, &searchOptions)
102113

103114
if err != nil {
104-
ctx.ServerError("FindProjects", err)
115+
ctx.Error(http.StatusInternalServerError, "db.FindAndCount[project_model.Project]", err)
105116
return
106117
}
107118

119+
ctx.SetLinkHeader(int(maxResults), listOptions.PageSize)
120+
ctx.SetTotalCountHeader(maxResults)
108121
ctx.JSON(http.StatusOK, convert.ToProjects(ctx, projects))
109122
}

0 commit comments

Comments
 (0)