add api for user to create org (#5268)
* add api for user to create org * remove unused blank line on the swagger file end * fix create and add test * fix tests * fix routes of create org API * fix bug * add copyright heads
This commit is contained in:
parent
499bff43d9
commit
8ef177f8c5
4 changed files with 137 additions and 0 deletions
48
integrations/api_org_test.go
Normal file
48
integrations/api_org_test.go
Normal file
|
@ -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,
|
||||||
|
})
|
||||||
|
}
|
|
@ -1,4 +1,5 @@
|
||||||
// Copyright 2015 The Gogs Authors. All rights reserved.
|
// 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
|
// Use of this source code is governed by a MIT-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
@ -578,6 +579,7 @@ func RegisterRoutes(m *macaron.Macaron) {
|
||||||
// Organizations
|
// Organizations
|
||||||
m.Get("/user/orgs", reqToken(), org.ListMyOrgs)
|
m.Get("/user/orgs", reqToken(), org.ListMyOrgs)
|
||||||
m.Get("/users/:username/orgs", org.ListUserOrgs)
|
m.Get("/users/:username/orgs", org.ListUserOrgs)
|
||||||
|
m.Post("/orgs", reqToken(), bind(api.CreateOrgOption{}), org.Create)
|
||||||
m.Group("/orgs/:orgname", func() {
|
m.Group("/orgs/:orgname", func() {
|
||||||
m.Get("/repos", user.ListOrgRepos)
|
m.Get("/repos", user.ListOrgRepos)
|
||||||
m.Combo("").Get(org.Get).
|
m.Combo("").Get(org.Get).
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
// Copyright 2015 The Gogs Authors. All rights reserved.
|
// 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
|
// Use of this source code is governed by a MIT-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
@ -62,6 +63,56 @@ func ListUserOrgs(ctx *context.APIContext) {
|
||||||
listUserOrgs(ctx, u, false)
|
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
|
// Get get an organization
|
||||||
func Get(ctx *context.APIContext) {
|
func Get(ctx *context.APIContext) {
|
||||||
// swagger:operation GET /orgs/{org} organization orgGet
|
// swagger:operation GET /orgs/{org} organization orgGet
|
||||||
|
|
|
@ -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}": {
|
"/orgs/{org}": {
|
||||||
"get": {
|
"get": {
|
||||||
"produces": [
|
"produces": [
|
||||||
|
|
Loading…
Reference in a new issue