diff --git a/modules/structs/admin_user.go b/modules/structs/admin_user.go index f7c6d10ba0f83..9b5ee0dcc3a50 100644 --- a/modules/structs/admin_user.go +++ b/modules/structs/admin_user.go @@ -30,10 +30,8 @@ type CreateUserOption struct { // EditUserOption edit user options type EditUserOption struct { - // required: true - SourceID int64 `json:"source_id"` - // required: true - LoginName string `json:"login_name" binding:"Required"` + SourceID *int64 `json:"source_id"` + LoginName *string `json:"login_name"` // swagger:strfmt email Email *string `json:"email" binding:"MaxSize(254)"` FullName *string `json:"full_name" binding:"MaxSize(100)"` diff --git a/routers/api/v1/admin/user.go b/routers/api/v1/admin/user.go index b4cc42ea5d820..4f6d82423533b 100644 --- a/routers/api/v1/admin/user.go +++ b/routers/api/v1/admin/user.go @@ -31,7 +31,7 @@ import ( user_service "code.gitea.io/gitea/services/user" ) -func parseAuthSource(ctx *context.APIContext, u *user_model.User, sourceID int64, loginName string) { +func parseAuthSource(ctx *context.APIContext, u *user_model.User, sourceID int64, loginName *string) { if sourceID == 0 { return } @@ -48,7 +48,9 @@ func parseAuthSource(ctx *context.APIContext, u *user_model.User, sourceID int64 u.LoginType = source.Type u.LoginSource = source.ID - u.LoginName = loginName + if loginName != nil { + u.LoginName = *loginName + } } // CreateUser create a user @@ -89,7 +91,7 @@ func CreateUser(ctx *context.APIContext) { u.MustChangePassword = *form.MustChangePassword } - parseAuthSource(ctx, u, form.SourceID, form.LoginName) + parseAuthSource(ctx, u, form.SourceID, &form.LoginName) if ctx.Written() { return } @@ -192,7 +194,9 @@ func EditUser(ctx *context.APIContext) { form := web.GetForm(ctx).(*api.EditUserOption) - parseAuthSource(ctx, ctx.ContextUser, form.SourceID, form.LoginName) + if form.SourceID != nil { + parseAuthSource(ctx, ctx.ContextUser, *form.SourceID, form.LoginName) + } if ctx.Written() { return } @@ -229,8 +233,9 @@ func EditUser(ctx *context.APIContext) { ctx.ContextUser.MustChangePassword = *form.MustChangePassword } - ctx.ContextUser.LoginName = form.LoginName - + if form.LoginName != nil { + ctx.ContextUser.LoginName = *form.LoginName + } if form.FullName != nil { ctx.ContextUser.FullName = *form.FullName } diff --git a/templates/swagger/v1_json.tmpl b/templates/swagger/v1_json.tmpl index 094a0e9aec9f9..de4a280b2abee 100644 --- a/templates/swagger/v1_json.tmpl +++ b/templates/swagger/v1_json.tmpl @@ -19406,10 +19406,6 @@ "EditUserOption": { "description": "EditUserOption edit user options", "type": "object", - "required": [ - "source_id", - "login_name" - ], "properties": { "active": { "type": "boolean", diff --git a/tests/integration/api_admin_test.go b/tests/integration/api_admin_test.go index ff7c2ddca39b7..bef005f5e22e8 100644 --- a/tests/integration/api_admin_test.go +++ b/tests/integration/api_admin_test.go @@ -6,6 +6,7 @@ package integration import ( "fmt" "net/http" + "strings" "testing" "time" @@ -15,6 +16,7 @@ import ( user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/modules/json" api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/util" "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" @@ -190,13 +192,11 @@ func TestAPICreateAndDeleteUser(t *testing.T) { func TestAPIEditUser(t *testing.T) { defer tests.PrepareTestEnv(t)() adminUsername := "user1" + editedUsername := "user2" token := getUserToken(t, adminUsername, auth_model.AccessTokenScopeWriteAdmin) - urlStr := fmt.Sprintf("/api/v1/admin/users/%s", "user2") + urlStr := fmt.Sprintf("/api/v1/admin/users/%s", editedUsername) req := NewRequestWithValues(t, "PATCH", urlStr, map[string]string{ - // required - "login_name": "user2", - "source_id": "0", // to change "full_name": "Full Name User 2", }).AddTokenAuth(token) @@ -204,9 +204,7 @@ func TestAPIEditUser(t *testing.T) { empty := "" req = NewRequestWithJSON(t, "PATCH", urlStr, api.EditUserOption{ - LoginName: "user2", - SourceID: 0, - Email: &empty, + Email: &empty, }).AddTokenAuth(token) resp := MakeRequest(t, req, http.StatusUnprocessableEntity) @@ -214,19 +212,20 @@ func TestAPIEditUser(t *testing.T) { json.Unmarshal(resp.Body.Bytes(), &errMap) assert.EqualValues(t, "email is not allowed to be empty string", errMap["message"].(string)) - user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{LoginName: "user2"}) + user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{LowerName: strings.ToLower(editedUsername)}) + assert.Equal(t, "user2", user2.LoginName) assert.False(t, user2.IsRestricted) bTrue := true + updatedLoginNameOfEditedUser := "user2_updated_loginName" req = NewRequestWithJSON(t, "PATCH", urlStr, api.EditUserOption{ - // required - LoginName: "user2", - SourceID: 0, // to change Restricted: &bTrue, + LoginName: util.ToPointer(updatedLoginNameOfEditedUser), }).AddTokenAuth(token) MakeRequest(t, req, http.StatusOK) - user2 = unittest.AssertExistsAndLoadBean(t, &user_model.User{LoginName: "user2"}) + user2 = unittest.AssertExistsAndLoadBean(t, &user_model.User{LowerName: strings.ToLower(editedUsername)}) assert.True(t, user2.IsRestricted) + assert.Equal(t, updatedLoginNameOfEditedUser, user2.LoginName) } func TestAPICreateRepoForUser(t *testing.T) {