fetch org with forge id

This commit is contained in:
qwerty287 2025-02-14 09:18:15 +02:00
parent a62832a01d
commit c1f93a661d
No known key found for this signature in database
12 changed files with 37 additions and 34 deletions

View file

@ -15,8 +15,8 @@
// Code generated by protoc-gen-go. DO NOT EDIT. // Code generated by protoc-gen-go. DO NOT EDIT.
// versions: // versions:
// protoc-gen-go v1.36.4 // protoc-gen-go v1.36.5
// protoc v5.29.3 // protoc v5.29.2
// source: woodpecker.proto // source: woodpecker.proto
package proto package proto

View file

@ -16,7 +16,7 @@
// Code generated by protoc-gen-go-grpc. DO NOT EDIT. // Code generated by protoc-gen-go-grpc. DO NOT EDIT.
// versions: // versions:
// - protoc-gen-go-grpc v1.5.1 // - protoc-gen-go-grpc v1.5.1
// - protoc v5.29.3 // - protoc v5.29.2
// source: woodpecker.proto // source: woodpecker.proto
package proto package proto

View file

@ -183,8 +183,7 @@ func HandleAuth(c *gin.Context) {
// create or set the user's organization if it isn't linked yet // create or set the user's organization if it isn't linked yet
if user.OrgID == 0 { if user.OrgID == 0 {
// check if an org with the same name exists already and assign it to the user if it does // check if an org with the same name exists already and assign it to the user if it does
// TODO: find the org by name and forgeID directly org, err := _store.OrgFindByName(user.Login, forgeID)
org, err := _store.OrgFindByName(user.Login)
if err != nil && !errors.Is(err, types.RecordNotExist) { if err != nil && !errors.Is(err, types.RecordNotExist) {
log.Error().Err(err).Msgf("cannot get org for user %s", user.Login) log.Error().Err(err).Msgf("cannot get org for user %s", user.Login)
c.Redirect(http.StatusSeeOther, server.Config.Server.RootPath+"/login?error=internal_error") c.Redirect(http.StatusSeeOther, server.Config.Server.RootPath+"/login?error=internal_error")

View file

@ -160,7 +160,7 @@ func TestHandleAuth(t *testing.T) {
_forge.On("Login", mock.Anything, mock.Anything).Return(user, "", nil) _forge.On("Login", mock.Anything, mock.Anything).Return(user, "", nil)
_store.On("GetUserRemoteID", user.ForgeRemoteID, user.Login).Return(nil, types.RecordNotExist) _store.On("GetUserRemoteID", user.ForgeRemoteID, user.Login).Return(nil, types.RecordNotExist)
_store.On("CreateUser", mock.Anything).Return(nil) _store.On("CreateUser", mock.Anything).Return(nil)
_store.On("OrgFindByName", user.Login).Return(nil, nil) _store.On("OrgFindByName", user.Login, int64(1)).Return(nil, nil)
_store.On("OrgCreate", mock.Anything).Return(nil) _store.On("OrgCreate", mock.Anything).Return(nil)
_store.On("UpdateUser", mock.Anything).Return(nil) _store.On("UpdateUser", mock.Anything).Return(nil)
_forge.On("Repos", mock.Anything, mock.Anything).Return(nil, nil) _forge.On("Repos", mock.Anything, mock.Anything).Return(nil, nil)
@ -286,7 +286,7 @@ func TestHandleAuth(t *testing.T) {
_manager.On("ForgeByID", int64(1)).Return(_forge, nil) _manager.On("ForgeByID", int64(1)).Return(_forge, nil)
_forge.On("Login", mock.Anything, mock.Anything).Return(user, "", nil) _forge.On("Login", mock.Anything, mock.Anything).Return(user, "", nil)
_store.On("GetUserRemoteID", user.ForgeRemoteID, user.Login).Return(user, nil) _store.On("GetUserRemoteID", user.ForgeRemoteID, user.Login).Return(user, nil)
_store.On("OrgFindByName", user.Login).Return(nil, types.RecordNotExist) _store.On("OrgFindByName", user.Login, int64(1)).Return(nil, types.RecordNotExist)
_store.On("OrgCreate", mock.Anything).Return(nil) _store.On("OrgCreate", mock.Anything).Return(nil)
_store.On("UpdateUser", mock.Anything).Return(nil) _store.On("UpdateUser", mock.Anything).Return(nil)
_forge.On("Repos", mock.Anything, mock.Anything).Return(nil, nil) _forge.On("Repos", mock.Anything, mock.Anything).Return(nil, nil)
@ -320,7 +320,7 @@ func TestHandleAuth(t *testing.T) {
_manager.On("ForgeByID", int64(1)).Return(_forge, nil) _manager.On("ForgeByID", int64(1)).Return(_forge, nil)
_forge.On("Login", mock.Anything, mock.Anything).Return(user, "", nil) _forge.On("Login", mock.Anything, mock.Anything).Return(user, "", nil)
_store.On("GetUserRemoteID", user.ForgeRemoteID, user.Login).Return(user, nil) _store.On("GetUserRemoteID", user.ForgeRemoteID, user.Login).Return(user, nil)
_store.On("OrgFindByName", user.Login).Return(org, nil) _store.On("OrgFindByName", user.Login, int64(1)).Return(org, nil)
_store.On("OrgUpdate", mock.Anything).Return(nil) _store.On("OrgUpdate", mock.Anything).Return(nil)
_store.On("UpdateUser", mock.Anything).Return(nil) _store.On("UpdateUser", mock.Anything).Return(nil)
_forge.On("Repos", mock.Anything, mock.Anything).Return(nil, nil) _forge.On("Repos", mock.Anything, mock.Anything).Return(nil, nil)

View file

@ -127,7 +127,7 @@ func LookupOrg(c *gin.Context) {
orgFullName := strings.TrimLeft(c.Param("org_full_name"), "/") orgFullName := strings.TrimLeft(c.Param("org_full_name"), "/")
org, err := _store.OrgFindByName(orgFullName) org, err := _store.OrgFindByName(orgFullName, user.ForgeID)
if err != nil { if err != nil {
handleDBError(c, err) handleDBError(c, err)
return return

View file

@ -121,7 +121,7 @@ func PostRepo(c *gin.Context) {
// find org of repo // find org of repo
var org *model.Org var org *model.Org
// TODO: find org by name and forge id // TODO: find org by name and forge id
org, err = _store.OrgFindByName(repo.Owner) org, err = _store.OrgFindByName(repo.Owner, user.ForgeID)
if err != nil && !errors.Is(err, types.RecordNotExist) { if err != nil && !errors.Is(err, types.RecordNotExist) {
c.String(http.StatusInternalServerError, err.Error()) c.String(http.StatusInternalServerError, err.Error())
return return

View file

@ -73,14 +73,14 @@ func (s storage) orgDelete(sess *xorm.Session, id int64) error {
return wrapDelete(sess.ID(id).Delete(new(model.Org))) return wrapDelete(sess.ID(id).Delete(new(model.Org)))
} }
func (s storage) OrgFindByName(name string) (*model.Org, error) { func (s storage) OrgFindByName(name string, forgeID int64) (*model.Org, error) {
return s.orgFindByName(s.engine.NewSession(), name) return s.orgFindByName(s.engine.NewSession(), name, forgeID)
} }
func (s storage) orgFindByName(sess *xorm.Session, name string) (*model.Org, error) { func (s storage) orgFindByName(sess *xorm.Session, name string, forgeID int64) (*model.Org, error) {
// sanitize // sanitize
org := new(model.Org) org := new(model.Org)
return org, wrapGet(sess.Where("name = ?", name).Get(org)) return org, wrapGet(sess.Where("name = ?", name).And("forge_id = ?", forgeID).Get(org))
} }
func (s storage) OrgRepoList(org *model.Org, p *model.ListOptions) ([]*model.Repo, error) { func (s storage) OrgRepoList(org *model.Org, p *model.ListOptions) ([]*model.Repo, error) {

View file

@ -28,6 +28,7 @@ func TestOrgCRUD(t *testing.T) {
org1 := &model.Org{ org1 := &model.Org{
Name: "someAwesomeOrg", Name: "someAwesomeOrg",
ForgeID: 1,
IsUser: false, IsUser: false,
Private: true, Private: true,
} }
@ -45,10 +46,10 @@ func TestOrgCRUD(t *testing.T) {
assert.EqualValues(t, org1, orgOne) assert.EqualValues(t, org1, orgOne)
// change name // change name
assert.NoError(t, store.OrgUpdate(&model.Org{ID: org1.ID, Name: "RenamedOrg"})) assert.NoError(t, store.OrgUpdate(&model.Org{ID: org1.ID, ForgeID: 1, Name: "RenamedOrg"}))
// find updated org by name // find updated org by name
orgOne, err = store.OrgFindByName("RenamedOrg") orgOne, err = store.OrgFindByName("RenamedOrg", 1)
assert.NoError(t, err) assert.NoError(t, err)
assert.NotEqualValues(t, org1, orgOne) assert.NotEqualValues(t, org1, orgOne)
assert.EqualValues(t, org1.ID, orgOne.ID) assert.EqualValues(t, org1.ID, orgOne.ID)

View file

@ -60,11 +60,12 @@ func (s storage) GetUserCount() (int64, error) {
func (s storage) CreateUser(user *model.User) error { func (s storage) CreateUser(user *model.User) error {
sess := s.engine.NewSession() sess := s.engine.NewSession()
org := &model.Org{ org := &model.Org{
Name: user.Login, Name: user.Login,
IsUser: true, ForgeID: user.ForgeID,
IsUser: true,
} }
existingOrg, err := s.orgFindByName(sess, org.Name) existingOrg, err := s.orgFindByName(sess, org.Name, user.ForgeID)
if err != nil && !errors.Is(err, types.RecordNotExist) { if err != nil && !errors.Is(err, types.RecordNotExist) {
return fmt.Errorf("failed to check if org exists: %w", err) return fmt.Errorf("failed to check if org exists: %w", err)
} }

View file

@ -112,8 +112,9 @@ func TestCreateUserWithExistingOrg(t *testing.T) {
// Create a new user with the same name as the existing organization // Create a new user with the same name as the existing organization
newUser := &model.User{ newUser := &model.User{
Login: "existingOrg", Login: "existingOrg",
Hash: "A", Hash: "A",
ForgeID: 1,
} }
err = store.CreateUser(newUser) err = store.CreateUser(newUser)
assert.NoError(t, err) assert.NoError(t, err)
@ -123,13 +124,14 @@ func TestCreateUserWithExistingOrg(t *testing.T) {
assert.Equal(t, "existingOrg", updatedOrg.Name) assert.Equal(t, "existingOrg", updatedOrg.Name)
newUser2 := &model.User{ newUser2 := &model.User{
Login: "new-user", Login: "new-user",
Hash: "B", ForgeID: 1,
Hash: "B",
} }
err = store.CreateUser(newUser2) err = store.CreateUser(newUser2)
assert.NoError(t, err) assert.NoError(t, err)
newOrg, err := store.OrgFindByName("new-user") newOrg, err := store.OrgFindByName("new-user", 1)
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, "new-user", newOrg.Name) assert.Equal(t, "new-user", newOrg.Name)
} }

View file

@ -1550,9 +1550,9 @@ func (_m *Store) OrgDelete(_a0 int64) error {
return r0 return r0
} }
// OrgFindByName provides a mock function with given fields: _a0 // OrgFindByName provides a mock function with given fields: _a0, _a1
func (_m *Store) OrgFindByName(_a0 string) (*model.Org, error) { func (_m *Store) OrgFindByName(_a0 string, _a1 int64) (*model.Org, error) {
ret := _m.Called(_a0) ret := _m.Called(_a0, _a1)
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for OrgFindByName") panic("no return value specified for OrgFindByName")
@ -1560,19 +1560,19 @@ func (_m *Store) OrgFindByName(_a0 string) (*model.Org, error) {
var r0 *model.Org var r0 *model.Org
var r1 error var r1 error
if rf, ok := ret.Get(0).(func(string) (*model.Org, error)); ok { if rf, ok := ret.Get(0).(func(string, int64) (*model.Org, error)); ok {
return rf(_a0) return rf(_a0, _a1)
} }
if rf, ok := ret.Get(0).(func(string) *model.Org); ok { if rf, ok := ret.Get(0).(func(string, int64) *model.Org); ok {
r0 = rf(_a0) r0 = rf(_a0, _a1)
} else { } else {
if ret.Get(0) != nil { if ret.Get(0) != nil {
r0 = ret.Get(0).(*model.Org) r0 = ret.Get(0).(*model.Org)
} }
} }
if rf, ok := ret.Get(1).(func(string) error); ok { if rf, ok := ret.Get(1).(func(string, int64) error); ok {
r1 = rf(_a0) r1 = rf(_a0, _a1)
} else { } else {
r1 = ret.Error(1) r1 = ret.Error(1)
} }

View file

@ -196,7 +196,7 @@ type Store interface {
// Org // Org
OrgCreate(*model.Org) error OrgCreate(*model.Org) error
OrgGet(int64) (*model.Org, error) OrgGet(int64) (*model.Org, error)
OrgFindByName(string) (*model.Org, error) OrgFindByName(string, int64) (*model.Org, error)
OrgUpdate(*model.Org) error OrgUpdate(*model.Org) error
OrgDelete(int64) error OrgDelete(int64) error
OrgList(*model.ListOptions) ([]*model.Org, error) OrgList(*model.ListOptions) ([]*model.Org, error)