2021-02-02 00:57:12 +03:00
// Copyright 2020 The Gitea Authors. All rights reserved.
2022-11-27 21:20:29 +03:00
// SPDX-License-Identifier: MIT
2021-02-02 00:57:12 +03:00
package repo
import (
"fmt"
"net/http"
"code.gitea.io/gitea/models"
2022-03-29 09:29:02 +03:00
"code.gitea.io/gitea/models/organization"
2021-02-02 00:57:12 +03:00
"code.gitea.io/gitea/modules/context"
2022-12-29 05:57:15 +03:00
"code.gitea.io/gitea/services/convert"
2022-08-25 05:31:57 +03:00
org_service "code.gitea.io/gitea/services/org"
2021-02-02 00:57:12 +03:00
)
// ListTeams list a repository's teams
func ListTeams ( ctx * context . APIContext ) {
// swagger:operation GET /repos/{owner}/{repo}/teams repository repoListTeams
// ---
// summary: List a repository's teams
// produces:
// - application/json
// parameters:
// - name: owner
// in: path
// description: owner of the repo
// type: string
// required: true
// - name: repo
// in: path
// description: name of the repo
// type: string
// required: true
// responses:
// "200":
// "$ref": "#/responses/TeamList"
if ! ctx . Repo . Owner . IsOrganization ( ) {
ctx . Error ( http . StatusMethodNotAllowed , "noOrg" , "repo is not owned by an organization" )
return
}
2022-05-20 17:08:52 +03:00
teams , err := organization . GetRepoTeams ( ctx , ctx . Repo . Repository )
2021-02-02 00:57:12 +03:00
if err != nil {
ctx . InternalServerError ( err )
return
}
2022-05-13 20:27:58 +03:00
apiTeams , err := convert . ToTeams ( teams , false )
if err != nil {
ctx . InternalServerError ( err )
return
2021-02-02 00:57:12 +03:00
}
ctx . JSON ( http . StatusOK , apiTeams )
}
// IsTeam check if a team is assigned to a repository
func IsTeam ( ctx * context . APIContext ) {
// swagger:operation GET /repos/{owner}/{repo}/teams/{team} repository repoCheckTeam
// ---
// summary: Check if a team is assigned to a repository
// produces:
// - application/json
// parameters:
// - name: owner
// in: path
// description: owner of the repo
// type: string
// required: true
// - name: repo
// in: path
// description: name of the repo
// type: string
// required: true
// - name: team
// in: path
// description: team name
// type: string
// required: true
// responses:
// "200":
// "$ref": "#/responses/Team"
// "404":
// "$ref": "#/responses/notFound"
// "405":
// "$ref": "#/responses/error"
if ! ctx . Repo . Owner . IsOrganization ( ) {
ctx . Error ( http . StatusMethodNotAllowed , "noOrg" , "repo is not owned by an organization" )
return
}
team := getTeamByParam ( ctx )
if team == nil {
return
}
2022-03-29 09:29:02 +03:00
if models . HasRepository ( team , ctx . Repo . Repository . ID ) {
2022-05-13 20:27:58 +03:00
apiTeam , err := convert . ToTeam ( team )
if err != nil {
ctx . InternalServerError ( err )
2021-02-02 00:57:12 +03:00
return
}
ctx . JSON ( http . StatusOK , apiTeam )
return
}
ctx . NotFound ( )
}
// AddTeam add a team to a repository
func AddTeam ( ctx * context . APIContext ) {
// swagger:operation PUT /repos/{owner}/{repo}/teams/{team} repository repoAddTeam
// ---
// summary: Add a team to a repository
// produces:
// - application/json
// parameters:
// - name: owner
// in: path
// description: owner of the repo
// type: string
// required: true
// - name: repo
// in: path
// description: name of the repo
// type: string
// required: true
// - name: team
// in: path
// description: team name
// type: string
// required: true
// responses:
// "204":
// "$ref": "#/responses/empty"
// "422":
// "$ref": "#/responses/validationError"
// "405":
// "$ref": "#/responses/error"
changeRepoTeam ( ctx , true )
}
// DeleteTeam delete a team from a repository
func DeleteTeam ( ctx * context . APIContext ) {
// swagger:operation DELETE /repos/{owner}/{repo}/teams/{team} repository repoDeleteTeam
// ---
// summary: Delete a team from a repository
// produces:
// - application/json
// parameters:
// - name: owner
// in: path
// description: owner of the repo
// type: string
// required: true
// - name: repo
// in: path
// description: name of the repo
// type: string
// required: true
// - name: team
// in: path
// description: team name
// type: string
// required: true
// responses:
// "204":
// "$ref": "#/responses/empty"
// "422":
// "$ref": "#/responses/validationError"
// "405":
// "$ref": "#/responses/error"
changeRepoTeam ( ctx , false )
}
func changeRepoTeam ( ctx * context . APIContext , add bool ) {
if ! ctx . Repo . Owner . IsOrganization ( ) {
ctx . Error ( http . StatusMethodNotAllowed , "noOrg" , "repo is not owned by an organization" )
}
if ! ctx . Repo . Owner . RepoAdminChangeTeamAccess && ! ctx . Repo . IsOwner ( ) {
ctx . Error ( http . StatusForbidden , "noAdmin" , "user is nor repo admin nor owner" )
return
}
team := getTeamByParam ( ctx )
if team == nil {
return
}
2022-03-29 09:29:02 +03:00
repoHasTeam := models . HasRepository ( team , ctx . Repo . Repository . ID )
2021-02-02 00:57:12 +03:00
var err error
if add {
if repoHasTeam {
ctx . Error ( http . StatusUnprocessableEntity , "alreadyAdded" , fmt . Errorf ( "team '%s' is already added to repo" , team . Name ) )
return
}
2022-08-25 05:31:57 +03:00
err = org_service . TeamAddRepository ( team , ctx . Repo . Repository )
2021-02-02 00:57:12 +03:00
} else {
if ! repoHasTeam {
ctx . Error ( http . StatusUnprocessableEntity , "notAdded" , fmt . Errorf ( "team '%s' was not added to repo" , team . Name ) )
return
}
2022-03-29 09:29:02 +03:00
err = models . RemoveRepository ( team , ctx . Repo . Repository . ID )
2021-02-02 00:57:12 +03:00
}
if err != nil {
ctx . InternalServerError ( err )
return
}
ctx . Status ( http . StatusNoContent )
}
2022-03-29 09:29:02 +03:00
func getTeamByParam ( ctx * context . APIContext ) * organization . Team {
2022-05-20 17:08:52 +03:00
team , err := organization . GetTeam ( ctx , ctx . Repo . Owner . ID , ctx . Params ( ":team" ) )
2021-02-02 00:57:12 +03:00
if err != nil {
2022-03-29 09:29:02 +03:00
if organization . IsErrTeamNotExist ( err ) {
2021-02-02 00:57:12 +03:00
ctx . Error ( http . StatusNotFound , "TeamNotExit" , err )
return nil
}
ctx . InternalServerError ( err )
return nil
}
return team
}