diff --git a/api/build/compile_publish.go b/api/build/compile_publish.go index 63db6c895..f54991ac7 100644 --- a/api/build/compile_publish.go +++ b/api/build/compile_publish.go @@ -216,7 +216,7 @@ func CompileAndPublish( } // send API call to capture repo for the counter (grabbing repo again to ensure counter is correct) - repo, err = database.GetRepoForOrg(ctx, r.GetOrg(), r.GetName()) + repo, err = database.GetRepoForOrg(ctx, r.GetFullName()) if err != nil { retErr := fmt.Errorf("%s: unable to get repo %s: %w", baseErr, r.GetFullName(), err) diff --git a/api/dashboard/create.go b/api/dashboard/create.go index 104a59074..639f82122 100644 --- a/api/dashboard/create.go +++ b/api/dashboard/create.go @@ -6,7 +6,6 @@ import ( "context" "fmt" "net/http" - "strings" "time" "github.com/gin-gonic/gin" @@ -173,14 +172,8 @@ func createAdminSet(c context.Context, caller *types.User, users []*types.User) // in the database while also confirming the IDs match when saving. func validateRepoSet(c context.Context, repos []*types.DashboardRepo) error { for _, repo := range repos { - // verify format (org/repo) - parts := strings.Split(repo.GetName(), "/") - if len(parts) != 2 { - return fmt.Errorf("unable to create dashboard: %s is not a valid repo", repo.GetName()) - } - // fetch repo from database - dbRepo, err := database.FromContext(c).GetRepoForOrg(c, parts[0], parts[1]) + dbRepo, err := database.FromContext(c).GetRepoForOrg(c, repo.GetName()) if err != nil || !dbRepo.GetActive() { return fmt.Errorf("unable to create dashboard: could not get repo %s: %w", repo.GetName(), err) } diff --git a/api/repo/create.go b/api/repo/create.go index cdd6848a3..2b73573b5 100644 --- a/api/repo/create.go +++ b/api/repo/create.go @@ -225,7 +225,7 @@ func CreateRepo(c *gin.Context) { } // send API call to capture the repo from the database - dbRepo, err := database.FromContext(c).GetRepoForOrg(ctx, r.GetOrg(), r.GetName()) + dbRepo, err := database.FromContext(c).GetRepoForOrg(ctx, r.GetFullName()) if err == nil && dbRepo.GetActive() { retErr := fmt.Errorf("unable to activate repo: %s is already active", r.GetFullName()) diff --git a/api/webhook/post.go b/api/webhook/post.go index c83a600be..155d9a0fe 100644 --- a/api/webhook/post.go +++ b/api/webhook/post.go @@ -205,7 +205,7 @@ func PostWebhook(c *gin.Context) { }() // send API call to capture parsed repo from webhook - repo, err := database.FromContext(c).GetRepoForOrg(ctx, r.GetOrg(), r.GetName()) + repo, err := database.FromContext(c).GetRepoForOrg(ctx, r.GetFullName()) if err != nil { retErr := fmt.Errorf("%s: failed to get repo %s: %w", baseErr, r.GetFullName(), err) util.HandleError(c, http.StatusBadRequest, retErr) @@ -659,7 +659,7 @@ func handleRepositoryEvent(ctx context.Context, c *gin.Context, m *internal.Meta case "archived", "unarchived", constants.ActionEdited: l.Debugf("repository action %s for %s", h.GetEventAction(), r.GetFullName()) // send call to get repository from database - dbRepo, err := database.FromContext(c).GetRepoForOrg(ctx, r.GetOrg(), r.GetName()) + dbRepo, err := database.FromContext(c).GetRepoForOrg(ctx, r.GetFullName()) if err != nil { retErr := fmt.Errorf("%s: failed to get repo %s: %w", baseErr, r.GetFullName(), err) diff --git a/database/integration_test.go b/database/integration_test.go index d62464b3a..47aa55c76 100644 --- a/database/integration_test.go +++ b/database/integration_test.go @@ -1364,7 +1364,7 @@ func testRepos(t *testing.T, db Interface, resources *Resources) { // lookup the repos by name for _, repo := range resources.Repos { - got, err := db.GetRepoForOrg(context.TODO(), repo.GetOrg(), repo.GetName()) + got, err := db.GetRepoForOrg(context.TODO(), repo.GetFullName()) if err != nil { t.Errorf("unable to get repo %d by org: %v", repo.GetID(), err) } diff --git a/database/repo/get_org.go b/database/repo/get_org.go index 38b32d4ca..baaafaba6 100644 --- a/database/repo/get_org.go +++ b/database/repo/get_org.go @@ -5,19 +5,17 @@ package repo import ( "context" - "github.com/sirupsen/logrus" - api "github.com/go-vela/server/api/types" "github.com/go-vela/server/database/types" "github.com/go-vela/types/constants" ) // GetRepoForOrg gets a repo by org and repo name from the database. -func (e *engine) GetRepoForOrg(ctx context.Context, org, name string) (*api.Repo, error) { - e.logger.WithFields(logrus.Fields{ - "org": org, - "repo": name, - }).Tracef("getting repo %s/%s", org, name) +func (e *engine) GetRepoForOrg(ctx context.Context, fullName string) (*api.Repo, error) { + // e.logger.WithFields(logrus.Fields{ + // "org": org, + // "repo": name, + // }).Tracef("getting repo %s/%s", org, name) // variable to store query results r := new(types.Repo) @@ -27,8 +25,7 @@ func (e *engine) GetRepoForOrg(ctx context.Context, org, name string) (*api.Repo WithContext(ctx). Table(constants.TableRepo). Preload("Owner"). - Where("org = ?", org). - Where("name = ?", name). + Where("full_name = ?", fullName). Take(r). Error if err != nil { @@ -43,7 +40,7 @@ func (e *engine) GetRepoForOrg(ctx context.Context, org, name string) (*api.Repo // ensures that the change is backwards compatible // by logging the error instead of returning it // which allows us to fetch unencrypted repos - e.logger.Errorf("unable to decrypt repo %s/%s: %v", org, name, err) + e.logger.Errorf("unable to decrypt repo %s: %v", fullName, err) // return the unencrypted repo return r.ToAPI(), nil diff --git a/database/repo/get_org_test.go b/database/repo/get_org_test.go index 1570398c0..59ed74cee 100644 --- a/database/repo/get_org_test.go +++ b/database/repo/get_org_test.go @@ -48,7 +48,7 @@ func TestRepo_Engine_GetRepoForOrg(t *testing.T) { AddRow(1, "foo", "bar", "baz", false, false) // ensure the mock expects the query - _mock.ExpectQuery(`SELECT * FROM "repos" WHERE org = $1 AND name = $2 LIMIT $3`).WithArgs("foo", "bar", 1).WillReturnRows(_rows) + _mock.ExpectQuery(`SELECT * FROM "repos" WHERE full_name = $1 LIMIT $2`).WithArgs("foo/bar", 1).WillReturnRows(_rows) _mock.ExpectQuery(`SELECT * FROM "users" WHERE "users"."id" = $1`).WithArgs(1).WillReturnRows(_userRows) _sqlite := testSqlite(t) @@ -93,7 +93,7 @@ func TestRepo_Engine_GetRepoForOrg(t *testing.T) { // run tests for _, test := range tests { t.Run(test.name, func(t *testing.T) { - got, err := test.database.GetRepoForOrg(context.TODO(), "foo", "bar") + got, err := test.database.GetRepoForOrg(context.TODO(), "foo/bar") if test.failure { if err == nil { diff --git a/database/repo/interface.go b/database/repo/interface.go index 8c4a4e466..1d082fca8 100644 --- a/database/repo/interface.go +++ b/database/repo/interface.go @@ -39,7 +39,7 @@ type RepoInterface interface { // GetRepo defines a function that gets a repo by ID. GetRepo(context.Context, int64) (*api.Repo, error) // GetRepoForOrg defines a function that gets a repo by org and repo name. - GetRepoForOrg(context.Context, string, string) (*api.Repo, error) + GetRepoForOrg(context.Context, string) (*api.Repo, error) // ListRepos defines a function that gets a list of all repos. ListRepos(context.Context) ([]*api.Repo, error) // ListReposForOrg defines a function that gets a list of repos by org name. diff --git a/router/middleware/repo/repo.go b/router/middleware/repo/repo.go index bbc678660..f7960760f 100644 --- a/router/middleware/repo/repo.go +++ b/router/middleware/repo/repo.go @@ -37,9 +37,12 @@ func Establish() gin.HandlerFunc { l.Debugf("reading repo %s", rParam) - r, err := database.FromContext(c).GetRepoForOrg(ctx, o, rParam) + // construct full name + fullName := fmt.Sprintf("%s/%s", o, rParam) + + r, err := database.FromContext(c).GetRepoForOrg(ctx, fullName) if err != nil { - retErr := fmt.Errorf("unable to read repo %s/%s: %w", o, rParam, err) + retErr := fmt.Errorf("unable to read repo %s: %w", fullName, err) util.HandleError(c, http.StatusNotFound, retErr) return