gitea_hat/routers/hat/org/org.go

157 lines
4.8 KiB
Go

package org
import (
"net/http"
"strings"
"code.gitea.io/gitea/models/db"
org_model "code.gitea.io/gitea/models/organization"
repo_model "code.gitea.io/gitea/models/repo"
user_model "code.gitea.io/gitea/models/user"
"code.gitea.io/gitea/modules/context"
"code.gitea.io/gitea/modules/convert"
api "code.gitea.io/gitea/modules/structs"
"code.gitea.io/gitea/modules/web"
container_service "code.gitea.io/gitea/services/packages/container"
repo_service "code.gitea.io/gitea/services/repository"
hat_convert "code.gitlink.org.cn/Gitlink/gitea_hat.git/modules/convert"
hat_api "code.gitlink.org.cn/Gitlink/gitea_hat.git/modules/structs"
)
func Create(ctx *context.APIContext) {
form := web.GetForm(ctx).(*api.CreateOrgOption)
if !ctx.Doer.CanCreateOrganization() {
ctx.Error(http.StatusForbidden, "create organization not allowed", nil)
return
}
visibility := api.VisibleTypePublic
if form.Visibility != "" {
visibility = api.VisibilityModes[form.Visibility]
}
org := &org_model.Organization{
Name: form.UserName,
FullName: form.FullName,
Description: form.Description,
Website: form.Website,
Location: form.Location,
IsActive: true,
Type: user_model.UserTypeOrganization,
Visibility: visibility,
RepoAdminChangeTeamAccess: form.RepoAdminChangeTeamAccess,
}
if err := org_model.CreateOrganization(org, ctx.Doer); err != nil {
if user_model.IsErrUserAlreadyExist(err) ||
db.IsErrNameReserved(err) ||
db.IsErrNameCharsNotAllowed(err) ||
db.IsErrNamePatternNotAllowed(err) {
ctx.Error(http.StatusUnprocessableEntity, "", err)
} else {
ctx.Error(http.StatusInternalServerError, "CreateOrganization", err)
}
return
}
team, err := org_model.GetTeam(ctx, org.ID, "")
if err != nil {
if user_model.IsErrUserNotExist(err) {
ctx.NotFound()
} else {
ctx.Error(http.StatusInternalServerError, "GetTeam", err)
}
return
}
if apiOrg, err := hat_convert.ToOrganization(org, team); err != nil {
ctx.Error(http.StatusInternalServerError, "ToOrganization", err)
} else {
ctx.JSON(http.StatusCreated, apiOrg)
}
}
func Edit(ctx *context.APIContext) {
form := web.GetForm(ctx).(*hat_api.EditOrgOption)
org := ctx.Org.Organization
nameChanged := org.Name != form.Name
if org.LowerName != strings.ToLower(form.Name) {
if len(form.Name) > 40 {
ctx.Error(http.StatusBadRequest, "EditOrganization", "name长度不能超过40个字符")
return
}
isExist, err := user_model.IsUserExist(ctx, org.ID, form.Name)
if err != nil {
ctx.Error(http.StatusConflict, "IsUserExist", ctx.Tr("form.username_been_taken"))
return
} else if isExist {
ctx.Error(http.StatusConflict, "IsUserExist", ctx.Tr("form.username_been_taken"))
return
} else if err = user_model.ChangeUserName(org.AsUser(), form.Name); err != nil {
switch {
case db.IsErrNameReserved(err):
ctx.Error(http.StatusBadRequest, "EditOrganization", ctx.Tr("repo.form.name_reserved", err.(db.ErrNameReserved).Name))
return
case db.IsErrNamePatternNotAllowed(err):
ctx.Error(http.StatusBadRequest, "EditOrganization", ctx.Tr("repo.form.name_pattern_not_allowed", err.(db.ErrNamePatternNotAllowed).Pattern))
return
default:
ctx.Error(http.StatusInternalServerError, "ChangeUserName", err)
return
}
}
if err := container_service.UpdateRepositoryNames(ctx, org.AsUser(), form.Name); err != nil {
ctx.ServerError("UpdateRepositoryNames", err)
return
}
nameChanged = false
}
org.Name = form.Name
org.LowerName = strings.ToLower(form.Name)
org.FullName = form.FullName
org.Description = form.Description
org.Website = form.Website
org.Location = form.Location
visibilityChanged := api.VisibilityModes[form.Visibility] != org.Visibility
if form.Visibility != "" {
org.Visibility = api.VisibilityModes[form.Visibility]
}
if form.RepoAdminChangeTeamAccess != nil {
org.RepoAdminChangeTeamAccess = *form.RepoAdminChangeTeamAccess
}
if err := user_model.UpdateUser(ctx, org.AsUser(), false); err != nil {
ctx.ServerError("UpdateUser", err)
return
}
if visibilityChanged {
repos, _, err := repo_model.GetUserRepositories(&repo_model.SearchRepoOptions{
Actor: org.AsUser(), Private: true, ListOptions: db.ListOptions{Page: 1, PageSize: org.NumRepos},
})
if err != nil {
ctx.ServerError("GetRepositories", err)
return
}
for _, repo := range repos {
repo.OwnerName = org.Name
if err := repo_service.UpdateRepository(repo, true); err != nil {
ctx.ServerError("UpdateRepository", err)
return
}
}
} else if nameChanged {
if err := repo_model.UpdateRepositoryOwnerNames(org.ID, org.Name); err != nil {
ctx.ServerError("UpdateRepository", err)
return
}
}
ctx.JSON(http.StatusOK, convert.ToOrganization(org))
}