summaryrefslogtreecommitdiffstats
path: root/routers/api
diff options
context:
space:
mode:
authortechknowlogick <techknowlogick@gitea.io>2023-03-14 03:45:21 -0400
committerGitHub <noreply@github.com>2023-03-14 03:45:21 -0400
commit03591f0f95823a0b1dcca969d2a3ed505c7e6d73 (patch)
tree0117b3cf1f27b4f0f7a0346fcf724fa3af0e3f8f /routers/api
parentaac07d010f261c00fb3bd9644c71dc108c668c11 (diff)
downloadgitea-03591f0f95823a0b1dcca969d2a3ed505c7e6d73.tar.gz
gitea-03591f0f95823a0b1dcca969d2a3ed505c7e6d73.zip
add user rename endpoint to admin api (#22789)
this is a simple endpoint that adds the ability to rename users to the admin API. Note: this is not in a mergeable state. It would be better if this was handled by a PATCH/POST to the /api/v1/admin/users/{username} endpoint and the username is modified. --------- Co-authored-by: Jason Song <i@wolfogre.com>
Diffstat (limited to 'routers/api')
-rw-r--r--routers/api/v1/admin/user.go58
-rw-r--r--routers/api/v1/api.go1
-rw-r--r--routers/api/v1/swagger/options.go3
3 files changed, 62 insertions, 0 deletions
diff --git a/routers/api/v1/admin/user.go b/routers/api/v1/admin/user.go
index 4192d8654d..369d13943a 100644
--- a/routers/api/v1/admin/user.go
+++ b/routers/api/v1/admin/user.go
@@ -461,3 +461,61 @@ func GetAllUsers(ctx *context.APIContext) {
ctx.SetTotalCountHeader(maxResults)
ctx.JSON(http.StatusOK, &results)
}
+
+// RenameUser api for renaming a user
+func RenameUser(ctx *context.APIContext) {
+ // swagger:operation POST /admin/users/{username}/rename admin adminRenameUser
+ // ---
+ // summary: Rename a user
+ // produces:
+ // - application/json
+ // parameters:
+ // - name: username
+ // in: path
+ // description: existing username of user
+ // type: string
+ // required: true
+ // - name: body
+ // in: body
+ // required: true
+ // schema:
+ // "$ref": "#/definitions/RenameUserOption"
+ // responses:
+ // "204":
+ // "$ref": "#/responses/empty"
+ // "403":
+ // "$ref": "#/responses/forbidden"
+ // "422":
+ // "$ref": "#/responses/validationError"
+
+ if ctx.ContextUser.IsOrganization() {
+ ctx.Error(http.StatusUnprocessableEntity, "", fmt.Errorf("%s is an organization not a user", ctx.ContextUser.Name))
+ return
+ }
+
+ newName := web.GetForm(ctx).(*api.RenameUserOption).NewName
+
+ if strings.EqualFold(newName, ctx.ContextUser.Name) {
+ // Noop as username is not changed
+ ctx.Status(http.StatusNoContent)
+ return
+ }
+
+ // Check if user name has been changed
+ if err := user_service.RenameUser(ctx, ctx.ContextUser, newName); err != nil {
+ switch {
+ case user_model.IsErrUserAlreadyExist(err):
+ ctx.Error(http.StatusUnprocessableEntity, "", ctx.Tr("form.username_been_taken"))
+ case db.IsErrNameReserved(err):
+ ctx.Error(http.StatusUnprocessableEntity, "", ctx.Tr("user.form.name_reserved", newName))
+ case db.IsErrNamePatternNotAllowed(err):
+ ctx.Error(http.StatusUnprocessableEntity, "", ctx.Tr("user.form.name_pattern_not_allowed", newName))
+ case db.IsErrNameCharsNotAllowed(err):
+ ctx.Error(http.StatusUnprocessableEntity, "", ctx.Tr("user.form.name_chars_not_allowed", newName))
+ default:
+ ctx.ServerError("ChangeUserName", err)
+ }
+ return
+ }
+ ctx.Status(http.StatusNoContent)
+}
diff --git a/routers/api/v1/api.go b/routers/api/v1/api.go
index 735939a551..7001dc72ac 100644
--- a/routers/api/v1/api.go
+++ b/routers/api/v1/api.go
@@ -1257,6 +1257,7 @@ func Routes(ctx gocontext.Context) *web.Route {
m.Get("/orgs", org.ListUserOrgs)
m.Post("/orgs", bind(api.CreateOrgOption{}), admin.CreateOrg)
m.Post("/repos", bind(api.CreateRepoOption{}), admin.CreateRepo)
+ m.Post("/rename", bind(api.RenameUserOption{}), admin.RenameUser)
}, context_service.UserAssignmentAPI())
})
m.Group("/unadopted", func() {
diff --git a/routers/api/v1/swagger/options.go b/routers/api/v1/swagger/options.go
index 979b184075..0c8d3d353f 100644
--- a/routers/api/v1/swagger/options.go
+++ b/routers/api/v1/swagger/options.go
@@ -49,6 +49,9 @@ type swaggerParameterBodies struct {
CreateKeyOption api.CreateKeyOption
// in:body
+ RenameUserOption api.RenameUserOption
+
+ // in:body
CreateLabelOption api.CreateLabelOption
// in:body
EditLabelOption api.EditLabelOption