2015-12-17 10:28:47 +03:00
// Copyright 2015 The Gogs Authors. All rights reserved.
2018-11-20 20:31:30 +03:00
// Copyright 2018 The Gitea Authors. All rights reserved.
2015-12-17 10:28:47 +03:00
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
package org
import (
2020-06-21 11:22:06 +03:00
"fmt"
2019-12-20 20:07:12 +03:00
"net/http"
2016-11-10 19:24:48 +03:00
"code.gitea.io/gitea/models"
"code.gitea.io/gitea/modules/context"
2019-11-10 07:41:51 +03:00
"code.gitea.io/gitea/modules/convert"
2019-08-23 19:40:30 +03:00
api "code.gitea.io/gitea/modules/structs"
2016-11-10 19:24:48 +03:00
"code.gitea.io/gitea/routers/api/v1/user"
2020-01-24 22:00:29 +03:00
"code.gitea.io/gitea/routers/api/v1/utils"
2015-12-17 10:28:47 +03:00
)
2020-12-17 02:39:12 +03:00
func listUserOrgs ( ctx * context . APIContext , u * models . User ) {
listOptions := utils . GetListOptions ( ctx )
showPrivate := ctx . IsSigned && ( ctx . User . IsAdmin || ctx . User . ID == u . ID )
orgs , err := models . GetOrgsByUserID ( u . ID , showPrivate )
if err != nil {
ctx . Error ( http . StatusInternalServerError , "GetOrgsByUserID" , err )
2015-12-17 10:28:47 +03:00
return
}
2020-12-17 02:39:12 +03:00
maxResults := len ( orgs )
2015-12-17 10:28:47 +03:00
2020-12-17 02:39:12 +03:00
orgs = utils . PaginateUserSlice ( orgs , listOptions . Page , listOptions . PageSize )
apiOrgs := make ( [ ] * api . Organization , len ( orgs ) )
for i := range orgs {
apiOrgs [ i ] = convert . ToOrganization ( orgs [ i ] )
2015-12-17 10:28:47 +03:00
}
2020-12-17 02:39:12 +03:00
ctx . SetLinkHeader ( int ( maxResults ) , listOptions . PageSize )
ctx . Header ( ) . Set ( "X-Total-Count" , fmt . Sprintf ( "%d" , maxResults ) )
ctx . Header ( ) . Set ( "Access-Control-Expose-Headers" , "X-Total-Count, Link" )
2019-12-20 20:07:12 +03:00
ctx . JSON ( http . StatusOK , & apiOrgs )
2015-12-17 10:28:47 +03:00
}
2016-11-24 10:04:31 +03:00
// ListMyOrgs list all my orgs
2016-03-14 01:49:16 +03:00
func ListMyOrgs ( ctx * context . APIContext ) {
2017-11-13 10:02:25 +03:00
// swagger:operation GET /user/orgs organization orgListCurrentUserOrgs
// ---
// summary: List the current user's organizations
// produces:
// - application/json
2020-01-24 22:00:29 +03:00
// parameters:
// - name: page
// in: query
// description: page number of results to return (1-based)
// type: integer
// - name: limit
// in: query
2020-06-09 07:57:38 +03:00
// description: page size of results
2020-01-24 22:00:29 +03:00
// type: integer
2017-11-13 10:02:25 +03:00
// responses:
// "200":
// "$ref": "#/responses/OrganizationList"
2019-12-20 20:07:12 +03:00
2020-12-17 02:39:12 +03:00
listUserOrgs ( ctx , ctx . User )
2015-12-17 10:28:47 +03:00
}
2016-11-24 10:04:31 +03:00
// ListUserOrgs list user's orgs
2016-03-14 01:49:16 +03:00
func ListUserOrgs ( ctx * context . APIContext ) {
2018-12-26 22:13:49 +03:00
// swagger:operation GET /users/{username}/orgs organization orgListUserOrgs
2017-11-13 10:02:25 +03:00
// ---
// summary: List a user's organizations
// produces:
// - application/json
// parameters:
// - name: username
// in: path
// description: username of user
// type: string
2018-06-02 18:20:28 +03:00
// required: true
2020-01-24 22:00:29 +03:00
// - name: page
// in: query
// description: page number of results to return (1-based)
// type: integer
// - name: limit
// in: query
2020-06-09 07:57:38 +03:00
// description: page size of results
2020-01-24 22:00:29 +03:00
// type: integer
2017-11-13 10:02:25 +03:00
// responses:
// "200":
// "$ref": "#/responses/OrganizationList"
2019-12-20 20:07:12 +03:00
2015-12-17 10:28:47 +03:00
u := user . GetUserByParams ( ctx )
if ctx . Written ( ) {
return
}
2020-12-17 02:39:12 +03:00
listUserOrgs ( ctx , u )
2015-12-17 10:28:47 +03:00
}
2020-01-12 18:43:44 +03:00
// GetAll return list of all public organizations
func GetAll ( ctx * context . APIContext ) {
// swagger:operation Get /orgs organization orgGetAll
// ---
// summary: Get list of organizations
// produces:
// - application/json
// parameters:
// - name: page
// in: query
// description: page number of results to return (1-based)
// type: integer
// - name: limit
// in: query
2020-06-09 07:57:38 +03:00
// description: page size of results
2020-01-12 18:43:44 +03:00
// type: integer
// responses:
// "200":
// "$ref": "#/responses/OrganizationList"
vMode := [ ] api . VisibleType { api . VisibleTypePublic }
if ctx . IsSigned {
vMode = append ( vMode , api . VisibleTypeLimited )
if ctx . User . IsAdmin {
vMode = append ( vMode , api . VisibleTypePrivate )
}
}
2020-06-21 11:22:06 +03:00
listOptions := utils . GetListOptions ( ctx )
publicOrgs , maxResults , err := models . SearchUsers ( & models . SearchUserOptions {
ListOptions : listOptions ,
2020-01-24 22:00:29 +03:00
Type : models . UserTypeOrganization ,
OrderBy : models . SearchOrderByAlphabetically ,
Visible : vMode ,
2020-01-12 18:43:44 +03:00
} )
if err != nil {
ctx . Error ( http . StatusInternalServerError , "SearchOrganizations" , err )
return
}
orgs := make ( [ ] * api . Organization , len ( publicOrgs ) )
for i := range publicOrgs {
orgs [ i ] = convert . ToOrganization ( publicOrgs [ i ] )
}
2020-06-21 11:22:06 +03:00
ctx . SetLinkHeader ( int ( maxResults ) , listOptions . PageSize )
ctx . Header ( ) . Set ( "X-Total-Count" , fmt . Sprintf ( "%d" , maxResults ) )
2020-08-13 20:18:18 +03:00
ctx . Header ( ) . Set ( "Access-Control-Expose-Headers" , "X-Total-Count, Link" )
2020-01-12 18:43:44 +03:00
ctx . JSON ( http . StatusOK , & orgs )
}
2018-11-20 20:31:30 +03:00
// 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"
2018-12-11 22:33:24 +03:00
if ! ctx . User . CanCreateOrganization ( ) {
2019-12-20 20:07:12 +03:00
ctx . Error ( http . StatusForbidden , "Create organization not allowed" , nil )
2018-11-20 20:31:30 +03:00
return
}
2019-05-30 20:57:55 +03:00
visibility := api . VisibleTypePublic
if form . Visibility != "" {
visibility = api . VisibilityModes [ form . Visibility ]
}
2018-11-20 20:31:30 +03:00
org := & models . User {
2019-09-23 23:08:03 +03:00
Name : form . UserName ,
FullName : form . FullName ,
Description : form . Description ,
Website : form . Website ,
Location : form . Location ,
IsActive : true ,
Type : models . UserTypeOrganization ,
Visibility : visibility ,
RepoAdminChangeTeamAccess : form . RepoAdminChangeTeamAccess ,
2018-11-20 20:31:30 +03:00
}
if err := models . CreateOrganization ( org , ctx . User ) ; err != nil {
if models . IsErrUserAlreadyExist ( err ) ||
models . IsErrNameReserved ( err ) ||
2020-02-23 22:52:05 +03:00
models . IsErrNameCharsNotAllowed ( err ) ||
2018-11-20 20:31:30 +03:00
models . IsErrNamePatternNotAllowed ( err ) {
2019-12-20 20:07:12 +03:00
ctx . Error ( http . StatusUnprocessableEntity , "" , err )
2018-11-20 20:31:30 +03:00
} else {
2019-12-20 20:07:12 +03:00
ctx . Error ( http . StatusInternalServerError , "CreateOrganization" , err )
2018-11-20 20:31:30 +03:00
}
return
}
2019-12-20 20:07:12 +03:00
ctx . JSON ( http . StatusCreated , convert . ToOrganization ( org ) )
2018-11-20 20:31:30 +03:00
}
2016-11-24 10:04:31 +03:00
// Get get an organization
2016-03-14 01:49:16 +03:00
func Get ( ctx * context . APIContext ) {
2017-11-13 10:02:25 +03:00
// swagger:operation GET /orgs/{org} organization orgGet
// ---
// summary: Get an organization
// produces:
// - application/json
// parameters:
// - name: org
// in: path
// description: name of the organization to get
// type: string
// required: true
// responses:
// "200":
// "$ref": "#/responses/Organization"
2019-12-20 20:07:12 +03:00
2019-02-18 19:00:27 +03:00
if ! models . HasOrgVisible ( ctx . Org . Organization , ctx . User ) {
ctx . NotFound ( "HasOrgVisible" , nil )
return
}
2019-12-20 20:07:12 +03:00
ctx . JSON ( http . StatusOK , convert . ToOrganization ( ctx . Org . Organization ) )
2015-12-17 10:28:47 +03:00
}
2016-11-24 10:04:31 +03:00
// Edit change an organization's information
2016-03-14 01:49:16 +03:00
func Edit ( ctx * context . APIContext , form api . EditOrgOption ) {
2017-11-13 10:02:25 +03:00
// swagger:operation PATCH /orgs/{org} organization orgEdit
// ---
// summary: Edit an organization
// consumes:
// - application/json
// produces:
// - application/json
// parameters:
// - name: org
// in: path
// description: name of the organization to edit
// type: string
// required: true
// - name: body
// in: body
2019-05-30 20:57:55 +03:00
// required: true
2017-11-13 10:02:25 +03:00
// schema:
// "$ref": "#/definitions/EditOrgOption"
// responses:
// "200":
// "$ref": "#/responses/Organization"
2019-12-20 20:07:12 +03:00
2016-03-26 01:04:02 +03:00
org := ctx . Org . Organization
2015-12-17 10:28:47 +03:00
org . FullName = form . FullName
org . Description = form . Description
org . Website = form . Website
org . Location = form . Location
2019-05-30 20:57:55 +03:00
if form . Visibility != "" {
org . Visibility = api . VisibilityModes [ form . Visibility ]
}
if err := models . UpdateUserCols ( org , "full_name" , "description" , "website" , "location" , "visibility" ) ; err != nil {
2019-12-20 20:07:12 +03:00
ctx . Error ( http . StatusInternalServerError , "EditOrganization" , err )
2015-12-17 10:28:47 +03:00
return
}
2019-12-20 20:07:12 +03:00
ctx . JSON ( http . StatusOK , convert . ToOrganization ( org ) )
2015-12-17 10:28:47 +03:00
}
2018-12-27 18:36:58 +03:00
//Delete an organization
func Delete ( ctx * context . APIContext ) {
// swagger:operation DELETE /orgs/{org} organization orgDelete
// ---
// summary: Delete an organization
// produces:
// - application/json
// parameters:
// - name: org
// in: path
// description: organization that is to be deleted
// type: string
// required: true
// responses:
// "204":
// "$ref": "#/responses/empty"
2019-12-20 20:07:12 +03:00
2018-12-27 18:36:58 +03:00
if err := models . DeleteOrganization ( ctx . Org . Organization ) ; err != nil {
2019-12-20 20:07:12 +03:00
ctx . Error ( http . StatusInternalServerError , "DeleteOrganization" , err )
2018-12-27 18:36:58 +03:00
return
}
2019-12-20 20:07:12 +03:00
ctx . Status ( http . StatusNoContent )
2018-12-27 18:36:58 +03:00
}