From c1f93a661db8fb1e3d5fa3114550938868f2f993 Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Fri, 14 Feb 2025 09:18:15 +0200 Subject: [PATCH] fetch org with forge id --- pipeline/rpc/proto/woodpecker.pb.go | 4 ++-- pipeline/rpc/proto/woodpecker_grpc.pb.go | 2 +- server/api/login.go | 3 +-- server/api/login_test.go | 6 +++--- server/api/org.go | 2 +- server/api/repo.go | 2 +- server/store/datastore/org.go | 8 ++++---- server/store/datastore/org_test.go | 5 +++-- server/store/datastore/user.go | 7 ++++--- server/store/datastore/user_test.go | 12 +++++++----- server/store/mocks/store.go | 18 +++++++++--------- server/store/store.go | 2 +- 12 files changed, 37 insertions(+), 34 deletions(-) diff --git a/pipeline/rpc/proto/woodpecker.pb.go b/pipeline/rpc/proto/woodpecker.pb.go index ba9cf8a9c..7d1223024 100644 --- a/pipeline/rpc/proto/woodpecker.pb.go +++ b/pipeline/rpc/proto/woodpecker.pb.go @@ -15,8 +15,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.4 -// protoc v5.29.3 +// protoc-gen-go v1.36.5 +// protoc v5.29.2 // source: woodpecker.proto package proto diff --git a/pipeline/rpc/proto/woodpecker_grpc.pb.go b/pipeline/rpc/proto/woodpecker_grpc.pb.go index 3033a951a..557f573b6 100644 --- a/pipeline/rpc/proto/woodpecker_grpc.pb.go +++ b/pipeline/rpc/proto/woodpecker_grpc.pb.go @@ -16,7 +16,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.5.1 -// - protoc v5.29.3 +// - protoc v5.29.2 // source: woodpecker.proto package proto diff --git a/server/api/login.go b/server/api/login.go index 923122e67..2b5a74c1f 100644 --- a/server/api/login.go +++ b/server/api/login.go @@ -183,8 +183,7 @@ func HandleAuth(c *gin.Context) { // create or set the user's organization if it isn't linked yet if user.OrgID == 0 { // 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) + org, err := _store.OrgFindByName(user.Login, forgeID) if err != nil && !errors.Is(err, types.RecordNotExist) { 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") diff --git a/server/api/login_test.go b/server/api/login_test.go index d58f1b87a..52c6ef5d2 100644 --- a/server/api/login_test.go +++ b/server/api/login_test.go @@ -160,7 +160,7 @@ func TestHandleAuth(t *testing.T) { _forge.On("Login", mock.Anything, mock.Anything).Return(user, "", nil) _store.On("GetUserRemoteID", user.ForgeRemoteID, user.Login).Return(nil, types.RecordNotExist) _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("UpdateUser", mock.Anything).Return(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) _forge.On("Login", mock.Anything, mock.Anything).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("UpdateUser", mock.Anything).Return(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) _forge.On("Login", mock.Anything, mock.Anything).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("UpdateUser", mock.Anything).Return(nil) _forge.On("Repos", mock.Anything, mock.Anything).Return(nil, nil) diff --git a/server/api/org.go b/server/api/org.go index 765ee3df8..e0d4df4d6 100644 --- a/server/api/org.go +++ b/server/api/org.go @@ -127,7 +127,7 @@ func LookupOrg(c *gin.Context) { orgFullName := strings.TrimLeft(c.Param("org_full_name"), "/") - org, err := _store.OrgFindByName(orgFullName) + org, err := _store.OrgFindByName(orgFullName, user.ForgeID) if err != nil { handleDBError(c, err) return diff --git a/server/api/repo.go b/server/api/repo.go index cdb2c6133..cd476aae4 100644 --- a/server/api/repo.go +++ b/server/api/repo.go @@ -121,7 +121,7 @@ func PostRepo(c *gin.Context) { // find org of repo var org *model.Org // 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) { c.String(http.StatusInternalServerError, err.Error()) return diff --git a/server/store/datastore/org.go b/server/store/datastore/org.go index 2084732a6..1d92e8b0c 100644 --- a/server/store/datastore/org.go +++ b/server/store/datastore/org.go @@ -73,14 +73,14 @@ func (s storage) orgDelete(sess *xorm.Session, id int64) error { return wrapDelete(sess.ID(id).Delete(new(model.Org))) } -func (s storage) OrgFindByName(name string) (*model.Org, error) { - return s.orgFindByName(s.engine.NewSession(), name) +func (s storage) OrgFindByName(name string, forgeID int64) (*model.Org, error) { + 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 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) { diff --git a/server/store/datastore/org_test.go b/server/store/datastore/org_test.go index d158167aa..2f5f3ad60 100644 --- a/server/store/datastore/org_test.go +++ b/server/store/datastore/org_test.go @@ -28,6 +28,7 @@ func TestOrgCRUD(t *testing.T) { org1 := &model.Org{ Name: "someAwesomeOrg", + ForgeID: 1, IsUser: false, Private: true, } @@ -45,10 +46,10 @@ func TestOrgCRUD(t *testing.T) { assert.EqualValues(t, org1, orgOne) // 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 - orgOne, err = store.OrgFindByName("RenamedOrg") + orgOne, err = store.OrgFindByName("RenamedOrg", 1) assert.NoError(t, err) assert.NotEqualValues(t, org1, orgOne) assert.EqualValues(t, org1.ID, orgOne.ID) diff --git a/server/store/datastore/user.go b/server/store/datastore/user.go index 990e7894f..522ab1177 100644 --- a/server/store/datastore/user.go +++ b/server/store/datastore/user.go @@ -60,11 +60,12 @@ func (s storage) GetUserCount() (int64, error) { func (s storage) CreateUser(user *model.User) error { sess := s.engine.NewSession() org := &model.Org{ - Name: user.Login, - IsUser: true, + Name: user.Login, + 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) { return fmt.Errorf("failed to check if org exists: %w", err) } diff --git a/server/store/datastore/user_test.go b/server/store/datastore/user_test.go index 01327b7c7..12c9aca29 100644 --- a/server/store/datastore/user_test.go +++ b/server/store/datastore/user_test.go @@ -112,8 +112,9 @@ func TestCreateUserWithExistingOrg(t *testing.T) { // Create a new user with the same name as the existing organization newUser := &model.User{ - Login: "existingOrg", - Hash: "A", + Login: "existingOrg", + Hash: "A", + ForgeID: 1, } err = store.CreateUser(newUser) assert.NoError(t, err) @@ -123,13 +124,14 @@ func TestCreateUserWithExistingOrg(t *testing.T) { assert.Equal(t, "existingOrg", updatedOrg.Name) newUser2 := &model.User{ - Login: "new-user", - Hash: "B", + Login: "new-user", + ForgeID: 1, + Hash: "B", } err = store.CreateUser(newUser2) assert.NoError(t, err) - newOrg, err := store.OrgFindByName("new-user") + newOrg, err := store.OrgFindByName("new-user", 1) assert.NoError(t, err) assert.Equal(t, "new-user", newOrg.Name) } diff --git a/server/store/mocks/store.go b/server/store/mocks/store.go index c8ddc33fa..260fc9838 100644 --- a/server/store/mocks/store.go +++ b/server/store/mocks/store.go @@ -1550,9 +1550,9 @@ func (_m *Store) OrgDelete(_a0 int64) error { return r0 } -// OrgFindByName provides a mock function with given fields: _a0 -func (_m *Store) OrgFindByName(_a0 string) (*model.Org, error) { - ret := _m.Called(_a0) +// OrgFindByName provides a mock function with given fields: _a0, _a1 +func (_m *Store) OrgFindByName(_a0 string, _a1 int64) (*model.Org, error) { + ret := _m.Called(_a0, _a1) if len(ret) == 0 { 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 r1 error - if rf, ok := ret.Get(0).(func(string) (*model.Org, error)); ok { - return rf(_a0) + if rf, ok := ret.Get(0).(func(string, int64) (*model.Org, error)); ok { + return rf(_a0, _a1) } - if rf, ok := ret.Get(0).(func(string) *model.Org); ok { - r0 = rf(_a0) + if rf, ok := ret.Get(0).(func(string, int64) *model.Org); ok { + r0 = rf(_a0, _a1) } else { if ret.Get(0) != nil { r0 = ret.Get(0).(*model.Org) } } - if rf, ok := ret.Get(1).(func(string) error); ok { - r1 = rf(_a0) + if rf, ok := ret.Get(1).(func(string, int64) error); ok { + r1 = rf(_a0, _a1) } else { r1 = ret.Error(1) } diff --git a/server/store/store.go b/server/store/store.go index 9efefcdb5..98fe07d1c 100644 --- a/server/store/store.go +++ b/server/store/store.go @@ -196,7 +196,7 @@ type Store interface { // Org OrgCreate(*model.Org) error OrgGet(int64) (*model.Org, error) - OrgFindByName(string) (*model.Org, error) + OrgFindByName(string, int64) (*model.Org, error) OrgUpdate(*model.Org) error OrgDelete(int64) error OrgList(*model.ListOptions) ([]*model.Org, error)