Skip to content

Commit

Permalink
satellite/{console, db}: add functionality to update project member role
Browse files Browse the repository at this point in the history
Added new functionality to update project member's role in the database.

Issue:
storj/storj-private#569

Change-Id: I664be5a6a8a488a40ab5854eb104f926d8fc5ba9
  • Loading branch information
VitaliiShpital authored and Storj Robot committed May 6, 2024
1 parent c5591ed commit 3ef1143
Show file tree
Hide file tree
Showing 5 changed files with 142 additions and 4 deletions.
4 changes: 4 additions & 0 deletions satellite/console/projectmembers.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ type ProjectMembers interface {
GetByMemberID(ctx context.Context, memberID uuid.UUID) ([]ProjectMember, error)
// GetPagedWithInvitationsByProjectID is a method for querying project members and invitations from the database by projectID and cursor.
GetPagedWithInvitationsByProjectID(ctx context.Context, projectID uuid.UUID, cursor ProjectMembersCursor) (*ProjectMembersPage, error)
// UpdateRole is a method for updating project member role in the database.
UpdateRole(ctx context.Context, memberID, projectID uuid.UUID, newRole ProjectMemberRole) (*ProjectMember, error)
// Insert is a method for inserting project member into the database.
Insert(ctx context.Context, memberID, projectID uuid.UUID, role ProjectMemberRole) (*ProjectMember, error)
// Delete is a method for deleting project member by memberID and projectID from the database.
Expand All @@ -31,6 +33,8 @@ type ProjectMember struct {
// FK on Projects table.
ProjectID uuid.UUID

Role ProjectMemberRole

CreatedAt time.Time
}

Expand Down
5 changes: 5 additions & 0 deletions satellite/satellitedb/dbx/project.dbx
Original file line number Diff line number Diff line change
Expand Up @@ -172,6 +172,11 @@ delete project_member (
where project_member.project_id = ?
)

update project_member (
where project_member.member_id = ?
where project_member.project_id = ?
)

read all (
select project_member
where project_member.member_id = ?
Expand Down
90 changes: 90 additions & 0 deletions satellite/satellitedb/dbx/satellitedb.dbx.go
Original file line number Diff line number Diff line change
Expand Up @@ -19555,6 +19555,48 @@ func (obj *pgxImpl) Update_Project_By_Id(ctx context.Context,
return project, nil
}

func (obj *pgxImpl) Update_ProjectMember_By_MemberId_And_ProjectId(ctx context.Context,
project_member_member_id ProjectMember_MemberId_Field,
project_member_project_id ProjectMember_ProjectId_Field,
update ProjectMember_Update_Fields) (
project_member *ProjectMember, err error) {
defer mon.Task()(&ctx)(&err)
var __sets = &__sqlbundle_Hole{}

var __embed_stmt = __sqlbundle_Literals{Join: "", SQLs: []__sqlbundle_SQL{__sqlbundle_Literal("UPDATE project_members SET "), __sets, __sqlbundle_Literal(" WHERE project_members.member_id = ? AND project_members.project_id = ? RETURNING project_members.member_id, project_members.project_id, project_members.role, project_members.created_at")}}

__sets_sql := __sqlbundle_Literals{Join: ", "}
var __values []interface{}
var __args []interface{}

if update.Role._set {
__values = append(__values, update.Role.value())
__sets_sql.SQLs = append(__sets_sql.SQLs, __sqlbundle_Literal("role = ?"))
}

if len(__sets_sql.SQLs) == 0 {
return nil, emptyUpdate()
}

__args = append(__args, project_member_member_id.value(), project_member_project_id.value())

__values = append(__values, __args...)
__sets.SQL = __sets_sql

var __stmt = __sqlbundle_Render(obj.dialect, __embed_stmt)
obj.logStmt(__stmt, __values...)

project_member = &ProjectMember{}
err = obj.queryRowContext(ctx, __stmt, __values...).Scan(&project_member.MemberId, &project_member.ProjectId, &project_member.Role, &project_member.CreatedAt)
if err == sql.ErrNoRows {
return nil, nil
}
if err != nil {
return nil, obj.makeErr(err)
}
return project_member, nil
}

func (obj *pgxImpl) Update_ProjectInvitation_By_ProjectId_And_Email(ctx context.Context,
project_invitation_project_id ProjectInvitation_ProjectId_Field,
project_invitation_email ProjectInvitation_Email_Field,
Expand Down Expand Up @@ -28185,6 +28227,48 @@ func (obj *pgxcockroachImpl) Update_Project_By_Id(ctx context.Context,
return project, nil
}

func (obj *pgxcockroachImpl) Update_ProjectMember_By_MemberId_And_ProjectId(ctx context.Context,
project_member_member_id ProjectMember_MemberId_Field,
project_member_project_id ProjectMember_ProjectId_Field,
update ProjectMember_Update_Fields) (
project_member *ProjectMember, err error) {
defer mon.Task()(&ctx)(&err)
var __sets = &__sqlbundle_Hole{}

var __embed_stmt = __sqlbundle_Literals{Join: "", SQLs: []__sqlbundle_SQL{__sqlbundle_Literal("UPDATE project_members SET "), __sets, __sqlbundle_Literal(" WHERE project_members.member_id = ? AND project_members.project_id = ? RETURNING project_members.member_id, project_members.project_id, project_members.role, project_members.created_at")}}

__sets_sql := __sqlbundle_Literals{Join: ", "}
var __values []interface{}
var __args []interface{}

if update.Role._set {
__values = append(__values, update.Role.value())
__sets_sql.SQLs = append(__sets_sql.SQLs, __sqlbundle_Literal("role = ?"))
}

if len(__sets_sql.SQLs) == 0 {
return nil, emptyUpdate()
}

__args = append(__args, project_member_member_id.value(), project_member_project_id.value())

__values = append(__values, __args...)
__sets.SQL = __sets_sql

var __stmt = __sqlbundle_Render(obj.dialect, __embed_stmt)
obj.logStmt(__stmt, __values...)

project_member = &ProjectMember{}
err = obj.queryRowContext(ctx, __stmt, __values...).Scan(&project_member.MemberId, &project_member.ProjectId, &project_member.Role, &project_member.CreatedAt)
if err == sql.ErrNoRows {
return nil, nil
}
if err != nil {
return nil, obj.makeErr(err)
}
return project_member, nil
}

func (obj *pgxcockroachImpl) Update_ProjectInvitation_By_ProjectId_And_Email(ctx context.Context,
project_invitation_project_id ProjectInvitation_ProjectId_Field,
project_invitation_email ProjectInvitation_Email_Field,
Expand Down Expand Up @@ -30874,6 +30958,12 @@ type Methods interface {
update ProjectInvitation_Update_Fields) (
project_invitation *ProjectInvitation, err error)

Update_ProjectMember_By_MemberId_And_ProjectId(ctx context.Context,
project_member_member_id ProjectMember_MemberId_Field,
project_member_project_id ProjectMember_ProjectId_Field,
update ProjectMember_Update_Fields) (
project_member *ProjectMember, err error)

Update_Project_By_Id(ctx context.Context,
project_id Project_Id_Field,
update Project_Update_Fields) (
Expand Down
21 changes: 17 additions & 4 deletions satellite/satellitedb/projectmembers.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,16 +35,28 @@ func (pm *projectMembers) GetByMemberID(ctx context.Context, memberID uuid.UUID)
return projectMembersFromDbxSlice(ctx, projectMembersDbx)
}

func (pm *projectMembers) UpdateRole(ctx context.Context, memberID, projectID uuid.UUID, newRole console.ProjectMemberRole) (_ *console.ProjectMember, err error) {
defer mon.Task()(&ctx)(&err)
projectMember, err := pm.methods.Update_ProjectMember_By_MemberId_And_ProjectId(ctx,
dbx.ProjectMember_MemberId(memberID[:]),
dbx.ProjectMember_ProjectId(projectID[:]),
dbx.ProjectMember_Update_Fields{
Role: dbx.ProjectMember_Role(int(newRole)),
},
)
if err != nil {
return nil, err
}

return projectMemberFromDBX(ctx, projectMember)
}

// GetPagedWithInvitationsByProjectID is a method for querying project members and invitations from the database by projectID, offset and limit.
func (pm *projectMembers) GetPagedWithInvitationsByProjectID(ctx context.Context, projectID uuid.UUID, cursor console.ProjectMembersCursor) (_ *console.ProjectMembersPage, err error) {
defer mon.Task()(&ctx)(&err)

search := "%" + strings.ReplaceAll(cursor.Search, " ", "%") + "%"

if cursor.Limit > 50 {
cursor.Limit = 50
}

if cursor.Limit == 0 {
return nil, errs.New("limit cannot be 0")
}
Expand Down Expand Up @@ -233,6 +245,7 @@ func projectMemberFromDBX(ctx context.Context, projectMember *dbx.ProjectMember)
return &console.ProjectMember{
MemberID: memberID,
ProjectID: projectID,
Role: console.ProjectMemberRole(projectMember.Role),
CreatedAt: projectMember.CreatedAt,
}, nil
}
Expand Down
26 changes: 26 additions & 0 deletions satellite/satellitedb/projectmembers_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -181,3 +181,29 @@ func TestGetPagedWithInvitationsByProjectID(t *testing.T) {
})
})
}

func TestUpdateRole(t *testing.T) {
satellitedbtest.Run(t, func(ctx *testcontext.Context, t *testing.T, db satellite.DB) {
membersDB := db.Console().ProjectMembers()

projectID := testrand.UUID()
_, err := db.Console().Projects().Insert(ctx, &console.Project{ID: projectID})
require.NoError(t, err)

memberUser, err := db.Console().Users().Insert(ctx, &console.User{
FullName: "Alice",
Email: "alice@mail.test",
ID: testrand.UUID(),
PasswordHash: testrand.Bytes(8),
})
require.NoError(t, err)

member, err := membersDB.Insert(ctx, memberUser.ID, projectID, console.RoleAdmin)
require.NoError(t, err)
require.Equal(t, console.RoleAdmin, member.Role)

member, err = membersDB.UpdateRole(ctx, memberUser.ID, projectID, console.RoleMember)
require.NoError(t, err)
require.Equal(t, console.RoleMember, member.Role)
})
}

0 comments on commit 3ef1143

Please sign in to comment.