[release/v2.8] Don't fail user creation if org exists (#4687) (#4692)

This commit is contained in:
Patrick Schratz 2025-01-11 07:15:50 +01:00 committed by GitHub
parent 17fc49187f
commit d9653dd2af
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 67 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/v2/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

@ -19,6 +19,7 @@ import (
"testing"
"github.com/franela/goblin"
"github.com/stretchr/testify/assert"
"go.woodpecker-ci.org/woodpecker/v2/server/model"
)
@ -253,3 +254,42 @@ func TestUsers(t *testing.T) {
})
})
}
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)
}