Don't fail user creation if org exists (#4687)

This commit is contained in:
Patrick Schratz 2025-01-10 18:12:21 +01:00 committed by GitHub
parent d5233d83d9
commit 628c0e8faa
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 66 additions and 4 deletions

View file

@ -77,9 +77,15 @@ func (s storage) orgDelete(sess *xorm.Session, id int64) error {
func (s storage) OrgFindByName(name string) (*model.Org, error) {
// sanitize
name = strings.ToLower(name)
// find
org := new(model.Org)
return org, wrapGet(s.engine.Where("name = ?", name).Get(org))
has, err := s.engine.Where("name = ?", name).Get(org)
if err != nil {
return nil, fmt.Errorf("failed to check if org exists: %w", err)
}
if !has {
return nil, nil
}
return org, nil
}
func (s storage) OrgRepoList(org *model.Org, p *model.ListOptions) ([]*model.Repo, error) {

View file

@ -15,6 +15,8 @@
package datastore
import (
"fmt"
"xorm.io/xorm"
"go.woodpecker-ci.org/woodpecker/v3/server/model"
@ -59,9 +61,24 @@ func (s storage) CreateUser(user *model.User) error {
Name: user.Login,
IsUser: true,
}
err := s.orgCreate(org, sess)
existingOrg, err := s.OrgFindByName(org.Name)
if err != nil {
return err
return fmt.Errorf("failed to check if org exists: %w", err)
}
if existingOrg != nil {
if existingOrg.Name == user.Login {
err = s.OrgUpdate(org)
if err != nil {
return fmt.Errorf("failed to update existing org: %w", err)
}
}
} else {
err = s.orgCreate(org, sess)
if err != nil {
return fmt.Errorf("failed to create new org: %w", err)
}
}
user.OrgID = org.ID
// only Insert set auto created ID back to object

View file

@ -94,3 +94,42 @@ func TestUsers(t *testing.T) {
_, err3 := store.GetUser(getUser.ID)
assert.Error(t, err3)
}
func TestCreateUserWithExistingOrg(t *testing.T) {
store, closer := newTestStore(t, new(model.User), new(model.Org), new(model.Perm))
defer closer()
existingOrg := &model.Org{
ForgeID: 1,
IsUser: true,
Name: "existingorg",
Private: false,
}
err := store.OrgCreate(existingOrg)
assert.NoError(t, err)
assert.EqualValues(t, "existingorg", existingOrg.Name)
// Create a new user with the same name as the existing organization
newUser := &model.User{
Login: "existingOrg",
Hash: "A",
}
err = store.CreateUser(newUser)
assert.NoError(t, err)
updatedOrg, err := store.OrgGet(existingOrg.ID)
assert.NoError(t, err)
assert.Equal(t, "existingorg", updatedOrg.Name)
newUser2 := &model.User{
Login: "new-user",
Hash: "B",
}
err = store.CreateUser(newUser2)
assert.NoError(t, err)
newOrg, err := store.OrgFindByName("new-user")
assert.NoError(t, err)
assert.Equal(t, "new-user", newOrg.Name)
}