* 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 headstags/v1.21.12.1
| @@ -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": [ | ||||