From 4815cfc09bff1826ffd2b0b86635143a5fe2bb09 Mon Sep 17 00:00:00 2001 From: Cameron Date: Mon, 27 Jun 2022 17:20:59 -0400 Subject: [PATCH] satellite/{console,satellitedb}: add PublicID to Project, db method GetByPublicID github issue: https://github.com/storj/storj/issues/4861 Change-Id: Ia83635c0de751a77cd5a49d641da19ed76132c46 --- satellite/admin/project_test.go | 3 +- satellite/console/projects.go | 5 ++- satellite/satellitedb/projectfromdbx_test.go | 37 +++++++++++++++++ satellite/satellitedb/projects.go | 30 +++++++++++++- satellite/satellitedb/projects_test.go | 43 ++++++++++---------- 5 files changed, 92 insertions(+), 26 deletions(-) create mode 100644 satellite/satellitedb/projectfromdbx_test.go diff --git a/satellite/admin/project_test.go b/satellite/admin/project_test.go index 71cc9075a..4c403cb95 100644 --- a/satellite/admin/project_test.go +++ b/satellite/admin/project_test.go @@ -47,8 +47,9 @@ func TestProjectGet(t *testing.T) { t.Run("OK", func(t *testing.T) { link := "http://" + address.String() + "/api/projects/" + project.ID.String() expected := fmt.Sprintf( - `{"id":"%s","name":"%s","description":"%s","partnerId":"%s","userAgent":null,"ownerId":"%s","rateLimit":null,"burstLimit":null,"maxBuckets":null,"createdAt":"%s","memberCount":0,"storageLimit":"25.00 GB","bandwidthLimit":"25.00 GB","segmentLimit":150000}`, + `{"id":"%s","publicId":"%s","name":"%s","description":"%s","partnerId":"%s","userAgent":null,"ownerId":"%s","rateLimit":null,"burstLimit":null,"maxBuckets":null,"createdAt":"%s","memberCount":0,"storageLimit":"25.00 GB","bandwidthLimit":"25.00 GB","segmentLimit":150000}`, project.ID.String(), + project.PublicID.String(), project.Name, project.Description, project.PartnerID.String(), diff --git a/satellite/console/projects.go b/satellite/console/projects.go index ea250541a..e4dda61b7 100644 --- a/satellite/console/projects.go +++ b/satellite/console/projects.go @@ -26,6 +26,8 @@ type Projects interface { GetOwn(ctx context.Context, userID uuid.UUID) ([]Project, error) // Get is a method for querying project from the database by id. Get(ctx context.Context, id uuid.UUID) (*Project, error) + // GetByPublicID is a method for querying project from the database by public_id. + GetByPublicID(ctx context.Context, publicID uuid.UUID) (*Project, error) // Insert is a method for inserting project into the database. Insert(ctx context.Context, project *Project) (*Project, error) // Delete is a method for deleting project by Id from the database. @@ -83,7 +85,8 @@ type ProjectLimitConfig struct { // Project is a database object that describes Project entity. type Project struct { - ID uuid.UUID `json:"id"` + ID uuid.UUID `json:"id"` + PublicID uuid.UUID `json:"publicId"` Name string `json:"name"` Description string `json:"description"` diff --git a/satellite/satellitedb/projectfromdbx_test.go b/satellite/satellitedb/projectfromdbx_test.go new file mode 100644 index 000000000..1c143bedc --- /dev/null +++ b/satellite/satellitedb/projectfromdbx_test.go @@ -0,0 +1,37 @@ +// Copyright (C) 2019 Storj Labs, Inc. +// See LICENSE for copying information. + +package satellitedb + +import ( + "context" + "testing" + + "github.com/stretchr/testify/assert" + + "storj.io/storj/satellite/satellitedb/dbx" +) + +func TestProjectFromDbx(t *testing.T) { + ctx := context.Background() + + t.Run("can't create dbo from nil dbx model", func(t *testing.T) { + project, err := projectFromDBX(ctx, nil) + + assert.Nil(t, project) + assert.NotNil(t, err) + assert.Error(t, err) + }) + + t.Run("can't create dbo from dbx model with invalid ID", func(t *testing.T) { + dbxProject := dbx.Project{ + Id: []byte("qweqwe"), + } + + project, err := projectFromDBX(ctx, &dbxProject) + + assert.Nil(t, project) + assert.NotNil(t, err) + assert.Error(t, err) + }) +} diff --git a/satellite/satellitedb/projects.go b/satellite/satellitedb/projects.go index 772b0ca95..6740e99d1 100644 --- a/satellite/satellitedb/projects.go +++ b/satellite/satellitedb/projects.go @@ -84,6 +84,18 @@ func (projects *projects) Get(ctx context.Context, id uuid.UUID) (_ *console.Pro return projectFromDBX(ctx, project) } +// GetByPublicID is a method for querying project from the database by public_id. +func (projects *projects) GetByPublicID(ctx context.Context, publicID uuid.UUID) (_ *console.Project, err error) { + defer mon.Task()(&ctx)(&err) + + project, err := projects.db.Get_Project_By_PublicId(ctx, dbx.Project_PublicId(publicID[:])) + if err != nil { + return nil, err + } + + return projectFromDBX(ctx, project) +} + // Insert is a method for inserting project into the database. func (projects *projects) Insert(ctx context.Context, project *console.Project) (_ *console.Project, err error) { defer mon.Task()(&ctx)(&err) @@ -92,6 +104,10 @@ func (projects *projects) Insert(ctx context.Context, project *console.Project) if err != nil { return nil, err } + publicID, err := uuid.New() + if err != nil { + return nil, err + } createFields := dbx.Project_Create_Fields{} if !project.PartnerID.IsZero() { @@ -111,6 +127,7 @@ func (projects *projects) Insert(ctx context.Context, project *console.Project) } createFields.RateLimit = dbx.Project_RateLimit_Raw(project.RateLimit) createFields.MaxBuckets = dbx.Project_MaxBuckets_Raw(project.MaxBuckets) + createFields.PublicId = dbx.Project_PublicId(publicID[:]) createdProject, err := projects.db.Create_Project(ctx, dbx.Project_Id(projectID[:]), @@ -272,7 +289,7 @@ func (projects *projects) ListByOwnerID(ctx context.Context, ownerID uuid.UUID, } rows, err := projects.sdb.Query(ctx, projects.sdb.Rebind(` - SELECT id, name, description, owner_id, rate_limit, max_buckets, created_at, + SELECT id, public_id, name, description, owner_id, rate_limit, max_buckets, created_at, (SELECT COUNT(*) FROM project_members WHERE project_id = projects.id) AS member_count FROM projects WHERE owner_id = ? @@ -297,7 +314,7 @@ func (projects *projects) ListByOwnerID(ctx context.Context, ownerID uuid.UUID, } var rateLimit, maxBuckets sql.NullInt32 nextProject := &console.Project{} - err = rows.Scan(&nextProject.ID, &nextProject.Name, &nextProject.Description, &nextProject.OwnerID, &rateLimit, &maxBuckets, &nextProject.CreatedAt, &nextProject.MemberCount) + err = rows.Scan(&nextProject.ID, &nextProject.PublicID, &nextProject.Name, &nextProject.Description, &nextProject.OwnerID, &rateLimit, &maxBuckets, &nextProject.CreatedAt, &nextProject.MemberCount) if err != nil { return console.ProjectsPage{}, err } @@ -329,6 +346,14 @@ func projectFromDBX(ctx context.Context, project *dbx.Project) (_ *console.Proje return nil, err } + var publicID uuid.UUID + if len(project.PublicId) > 0 { + publicID, err = uuid.FromBytes(project.PublicId) + if err != nil { + return nil, err + } + } + var partnerID uuid.UUID if len(project.PartnerId) > 0 { partnerID, err = uuid.FromBytes(project.PartnerId) @@ -349,6 +374,7 @@ func projectFromDBX(ctx context.Context, project *dbx.Project) (_ *console.Proje return &console.Project{ ID: id, + PublicID: publicID, Name: project.Name, Description: project.Description, PartnerID: partnerID, diff --git a/satellite/satellitedb/projects_test.go b/satellite/satellitedb/projects_test.go index 1c143bedc..d42894c51 100644 --- a/satellite/satellitedb/projects_test.go +++ b/satellite/satellitedb/projects_test.go @@ -1,37 +1,36 @@ // Copyright (C) 2019 Storj Labs, Inc. // See LICENSE for copying information. -package satellitedb +package satellitedb_test import ( - "context" "testing" - "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" - "storj.io/storj/satellite/satellitedb/dbx" + "storj.io/common/testcontext" + "storj.io/storj/satellite" + "storj.io/storj/satellite/console" + "storj.io/storj/satellite/satellitedb/satellitedbtest" ) -func TestProjectFromDbx(t *testing.T) { - ctx := context.Background() +func TestProjectsGetByPublicID(t *testing.T) { + satellitedbtest.Run(t, func(ctx *testcontext.Context, t *testing.T, db satellite.DB) { + projects := db.Console().Projects() - t.Run("can't create dbo from nil dbx model", func(t *testing.T) { - project, err := projectFromDBX(ctx, nil) + prj, err := projects.Insert(ctx, &console.Project{ + Name: "ProjectName", + Description: "projects description", + }) + require.NoError(t, err) + require.NotNil(t, prj) - assert.Nil(t, project) - assert.NotNil(t, err) - assert.Error(t, err) - }) + pubID := prj.PublicID + require.NotNil(t, pubID) + require.False(t, pubID.IsZero()) - t.Run("can't create dbo from dbx model with invalid ID", func(t *testing.T) { - dbxProject := dbx.Project{ - Id: []byte("qweqwe"), - } - - project, err := projectFromDBX(ctx, &dbxProject) - - assert.Nil(t, project) - assert.NotNil(t, err) - assert.Error(t, err) + prj, err = projects.GetByPublicID(ctx, pubID) + require.NoError(t, err) + require.Equal(t, pubID, prj.PublicID) }) }