aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--integrations/api_org_test.go48
-rw-r--r--routers/api/v1/api.go2
-rw-r--r--routers/api/v1/org/org.go51
-rw-r--r--templates/swagger/v1_json.tmpl36
4 files changed, 137 insertions, 0 deletions
diff --git a/integrations/api_org_test.go b/integrations/api_org_test.go
new file mode 100644
index 0000000000..d30b746738
--- /dev/null
+++ b/integrations/api_org_test.go
@@ -0,0 +1,48 @@
+// Copyright 2018 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.
+
+package integrations
+
+import (
+ "net/http"
+ "strings"
+ "testing"
+
+ "code.gitea.io/gitea/models"
+ api "code.gitea.io/sdk/gitea"
+
+ "github.com/stretchr/testify/assert"
+)
+
+func TestAPIOrg(t *testing.T) {
+ prepareTestEnv(t)
+
+ session := loginUser(t, "user1")
+
+ token := getTokenForLoggedInUser(t, session)
+ var org = api.CreateOrgOption{
+ UserName: "user1_org",
+ FullName: "User1's organization",
+ Description: "This organization created by user1",
+ Website: "https://try.gitea.io",
+ Location: "Shanghai",
+ }
+ req := NewRequestWithJSON(t, "POST", "/api/v1/orgs?token="+token, &org)
+ resp := session.MakeRequest(t, req, http.StatusCreated)
+
+ var apiOrg api.Organization
+ DecodeJSON(t, resp, &apiOrg)
+
+ assert.Equal(t, org.UserName, apiOrg.UserName)
+ assert.Equal(t, org.FullName, apiOrg.FullName)
+ assert.Equal(t, org.Description, apiOrg.Description)
+ assert.Equal(t, org.Website, apiOrg.Website)
+ assert.Equal(t, org.Location, apiOrg.Location)
+
+ models.AssertExistsAndLoadBean(t, &models.User{
+ Name: org.UserName,
+ LowerName: strings.ToLower(org.UserName),
+ FullName: org.FullName,
+ })
+}
diff --git a/routers/api/v1/api.go b/routers/api/v1/api.go
index a839ce8dc1..c5f01d91d8 100644
--- a/routers/api/v1/api.go
+++ b/routers/api/v1/api.go
@@ -1,4 +1,5 @@
// Copyright 2015 The Gogs Authors. All rights reserved.
+// Copyright 2018 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.
@@ -578,6 +579,7 @@ func RegisterRoutes(m *macaron.Macaron) {
// Organizations
m.Get("/user/orgs", reqToken(), org.ListMyOrgs)
m.Get("/users/:username/orgs", org.ListUserOrgs)
+ m.Post("/orgs", reqToken(), bind(api.CreateOrgOption{}), org.Create)
m.Group("/orgs/:orgname", func() {
m.Get("/repos", user.ListOrgRepos)
m.Combo("").Get(org.Get).
diff --git a/routers/api/v1/org/org.go b/routers/api/v1/org/org.go
index 29d45d2f2e..93c2ed7a88 100644
--- a/routers/api/v1/org/org.go
+++ b/routers/api/v1/org/org.go
@@ -1,4 +1,5 @@
// Copyright 2015 The Gogs Authors. All rights reserved.
+// Copyright 2018 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.
@@ -62,6 +63,56 @@ func ListUserOrgs(ctx *context.APIContext) {
listUserOrgs(ctx, u, false)
}
+// Create api for create organization
+func Create(ctx *context.APIContext, form api.CreateOrgOption) {
+ // swagger:operation POST /orgs organization orgCreate
+ // ---
+ // summary: Create an organization
+ // consumes:
+ // - application/json
+ // produces:
+ // - application/json
+ // parameters:
+ // - name: organization
+ // in: body
+ // required: true
+ // schema: { "$ref": "#/definitions/CreateOrgOption" }
+ // responses:
+ // "201":
+ // "$ref": "#/responses/Organization"
+ // "403":
+ // "$ref": "#/responses/forbidden"
+ // "422":
+ // "$ref": "#/responses/validationError"
+
+ if !ctx.User.AllowCreateOrganization {
+ ctx.Error(403, "Create organization not allowed", nil)
+ return
+ }
+
+ org := &models.User{
+ Name: form.UserName,
+ FullName: form.FullName,
+ Description: form.Description,
+ Website: form.Website,
+ Location: form.Location,
+ IsActive: true,
+ Type: models.UserTypeOrganization,
+ }
+ if err := models.CreateOrganization(org, ctx.User); err != nil {
+ if models.IsErrUserAlreadyExist(err) ||
+ models.IsErrNameReserved(err) ||
+ models.IsErrNamePatternNotAllowed(err) {
+ ctx.Error(422, "", err)
+ } else {
+ ctx.Error(500, "CreateOrganization", err)
+ }
+ return
+ }
+
+ ctx.JSON(201, convert.ToOrganization(org))
+}
+
// Get get an organization
func Get(ctx *context.APIContext) {
// swagger:operation GET /orgs/{org} organization orgGet
diff --git a/templates/swagger/v1_json.tmpl b/templates/swagger/v1_json.tmpl
index 5c8c666041..dada2c98e3 100644
--- a/templates/swagger/v1_json.tmpl
+++ b/templates/swagger/v1_json.tmpl
@@ -406,6 +406,42 @@
}
}
},
+ "/orgs": {
+ "post": {
+ "consumes": [
+ "application/json"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "organization"
+ ],
+ "summary": "Create an organization",
+ "operationId": "orgCreate",
+ "parameters": [
+ {
+ "name": "organization",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/CreateOrgOption"
+ }
+ }
+ ],
+ "responses": {
+ "201": {
+ "$ref": "#/responses/Organization"
+ },
+ "403": {
+ "$ref": "#/responses/forbidden"
+ },
+ "422": {
+ "$ref": "#/responses/validationError"
+ }
+ }
+ }
+ },
"/orgs/{org}": {
"get": {
"produces": [