From 1b90692844c1b714d9c03cf7c96e7f62923236c0 Mon Sep 17 00:00:00 2001
From: Shashvat Kedia <sk261@snu.edu.in>
Date: Thu, 24 Jan 2019 04:00:19 +0530
Subject: [PATCH] New API routes added (#5594)

* New API routes added

* Comments added

* Build fix

* swagger_v1_json.tmpl without new line character

* Typo fix

* Code review changes

* Code review changes

* Add copyright

* Add copyright

* Add copyright

* Update per @lafriks feedback

* Update org.go

* Update user.go

* Update user.go

* make fmt
---
 models/user.go                 | 13 +++++++-----
 routers/api/v1/admin/org.go    | 29 ++++++++++++++++++++++++++
 routers/api/v1/admin/user.go   | 25 ++++++++++++++++++++++
 routers/api/v1/api.go          |  3 +++
 templates/swagger/v1_json.tmpl | 38 ++++++++++++++++++++++++++++++++++
 5 files changed, 103 insertions(+), 5 deletions(-)

diff --git a/models/user.go b/models/user.go
index 764c2280d7..0d8f608861 100644
--- a/models/user.go
+++ b/models/user.go
@@ -1,4 +1,5 @@
 // Copyright 2014 The Gogs Authors. All rights reserved.
+// Copyright 2019 The Gitea Authors. All rights reserved.
 // Use of this source code is governed by a MIT-style
 // license that can be found in the LICENSE file.
 
@@ -1358,7 +1359,7 @@ func SearchUsers(opts *SearchUserOptions) (users []*User, _ int64, _ error) {
 		return nil, 0, fmt.Errorf("Count: %v", err)
 	}
 
-	if opts.PageSize <= 0 || opts.PageSize > setting.UI.ExplorePagingNum {
+	if opts.PageSize == 0 || opts.PageSize > setting.UI.ExplorePagingNum {
 		opts.PageSize = setting.UI.ExplorePagingNum
 	}
 	if opts.Page <= 0 {
@@ -1368,11 +1369,13 @@ func SearchUsers(opts *SearchUserOptions) (users []*User, _ int64, _ error) {
 		opts.OrderBy = SearchOrderByAlphabetically
 	}
 
+	sess := x.Where(cond)
+	if opts.PageSize > 0 {
+		sess = sess.Limit(opts.PageSize, (opts.Page-1)*opts.PageSize)
+	}
+
 	users = make([]*User, 0, opts.PageSize)
-	return users, count, x.Where(cond).
-		Limit(opts.PageSize, (opts.Page-1)*opts.PageSize).
-		OrderBy(opts.OrderBy.String()).
-		Find(&users)
+	return users, count, sess.OrderBy(opts.OrderBy.String()).Find(&users)
 }
 
 // GetStarredRepos returns the repos starred by a particular user
diff --git a/routers/api/v1/admin/org.go b/routers/api/v1/admin/org.go
index 406cbb9a31..03263a86dd 100644
--- a/routers/api/v1/admin/org.go
+++ b/routers/api/v1/admin/org.go
@@ -1,4 +1,5 @@
 // Copyright 2015 The Gogs Authors. All rights reserved.
+// Copyright 2019 The Gitea Authors. All rights reserved.
 // Use of this source code is governed by a MIT-style
 // license that can be found in the LICENSE file.
 
@@ -66,3 +67,31 @@ func CreateOrg(ctx *context.APIContext, form api.CreateOrgOption) {
 
 	ctx.JSON(201, convert.ToOrganization(org))
 }
+
+//GetAllOrgs API for getting information of all the organizations
+func GetAllOrgs(ctx *context.APIContext) {
+	// swagger:operation GET /admin/orgs admin adminGetAllOrgs
+	// ---
+	// summary: List all organizations
+	// produces:
+	// - application/json
+	// responses:
+	//   "200":
+	//     "$ref": "#/responses/OrganizationList"
+	//   "403":
+	//     "$ref": "#/responses/forbidden"
+	users, _, err := models.SearchUsers(&models.SearchUserOptions{
+		Type:     models.UserTypeOrganization,
+		OrderBy:  models.SearchOrderByAlphabetically,
+		PageSize: -1,
+	})
+	if err != nil {
+		ctx.Error(500, "SearchOrganizations", err)
+		return
+	}
+	orgs := make([]*api.Organization, len(users))
+	for i := range users {
+		orgs[i] = convert.ToOrganization(users[i])
+	}
+	ctx.JSON(200, &orgs)
+}
diff --git a/routers/api/v1/admin/user.go b/routers/api/v1/admin/user.go
index cff8ae4850..e35beffc92 100644
--- a/routers/api/v1/admin/user.go
+++ b/routers/api/v1/admin/user.go
@@ -1,4 +1,5 @@
 // Copyright 2015 The Gogs Authors. All rights reserved.
+// Copyright 2019 The Gitea Authors. All rights reserved.
 // Use of this source code is governed by a MIT-style
 // license that can be found in the LICENSE file.
 
@@ -291,3 +292,27 @@ func DeleteUserPublicKey(ctx *context.APIContext) {
 
 	ctx.Status(204)
 }
+
+//GetAllUsers API for getting information of all the users
+func GetAllUsers(ctx *context.APIContext) {
+	// swagger:operation GET /admin/users admin adminGetAllUsers
+	// ---
+	// summary: List all users
+	// produces:
+	// - application/json
+	// responses:
+	//   "200":
+	//     "$ref": "#/responses/UserList"
+	//   "403":
+	//     "$ref": "#/responses/forbidden"
+	users, _, err := models.SearchUsers(&models.SearchUserOptions{
+		Type:     models.UserTypeIndividual,
+		OrderBy:  models.SearchOrderByAlphabetically,
+		PageSize: -1,
+	})
+	if err != nil {
+		ctx.Error(500, "SearchUsers", err)
+		return
+	}
+	ctx.JSON(200, &users)
+}
diff --git a/routers/api/v1/api.go b/routers/api/v1/api.go
index 82c4b78de8..2787d01a04 100644
--- a/routers/api/v1/api.go
+++ b/routers/api/v1/api.go
@@ -671,7 +671,9 @@ func RegisterRoutes(m *macaron.Macaron) {
 		})
 
 		m.Group("/admin", func() {
+			m.Get("/orgs", admin.GetAllOrgs)
 			m.Group("/users", func() {
+				m.Get("", admin.GetAllUsers)
 				m.Post("", bind(api.CreateUserOption{}), admin.CreateUser)
 				m.Group("/:username", func() {
 					m.Combo("").Patch(bind(api.EditUserOption{}), admin.EditUser).
@@ -680,6 +682,7 @@ func RegisterRoutes(m *macaron.Macaron) {
 						m.Post("", bind(api.CreateKeyOption{}), admin.CreatePublicKey)
 						m.Delete("/:id", admin.DeleteUserPublicKey)
 					})
+					m.Get("/orgs", org.ListUserOrgs)
 					m.Post("/orgs", bind(api.CreateOrgOption{}), admin.CreateOrg)
 					m.Post("/repos", bind(api.CreateRepoOption{}), admin.CreateRepo)
 				})
diff --git a/templates/swagger/v1_json.tmpl b/templates/swagger/v1_json.tmpl
index 153701d6dd..d86d1116ca 100644
--- a/templates/swagger/v1_json.tmpl
+++ b/templates/swagger/v1_json.tmpl
@@ -23,7 +23,45 @@
   },
   "basePath": "{{AppSubUrl}}/api/v1",
   "paths": {
+    "/admin/orgs": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "admin"
+        ],
+        "summary": "List all organizations",
+        "operationId": "adminGetAllOrgs",
+        "responses": {
+          "200": {
+            "$ref": "#/responses/OrganizationList"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          }
+        }
+      }
+    },
     "/admin/users": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "admin"
+        ],
+        "summary": "List all users",
+        "operationId": "adminGetAllUsers",
+        "responses": {
+          "200": {
+            "$ref": "#/responses/UserList"
+          },
+          "403": {
+            "$ref": "#/responses/forbidden"
+          }
+        }
+      },
       "post": {
         "consumes": [
           "application/json"