Skip to content

Commit 94c01b9

Browse files
authored
feat(controlplane): set role during invitation (#556)
Signed-off-by: Miguel Martinez Trivino <[email protected]>
1 parent 7fe4aa9 commit 94c01b9

33 files changed

+618
-161
lines changed

app/cli/cmd/organization_invitation_create.go

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,19 +17,32 @@ package cmd
1717

1818
import (
1919
"context"
20+
"fmt"
2021

2122
"github.com/chainloop-dev/chainloop/app/cli/internal/action"
2223
"github.com/spf13/cobra"
2324
)
2425

2526
func newOrganizationInvitationCreateCmd() *cobra.Command {
26-
var receiverEmail string
27+
var receiverEmail, role string
28+
2729
cmd := &cobra.Command{
2830
Use: "create",
2931
Short: "Invite a User to an Organization",
3032
RunE: func(cmd *cobra.Command, args []string) error {
33+
var found bool
34+
for _, r := range action.AvailableRoles {
35+
if string(r) == role {
36+
found = true
37+
break
38+
}
39+
}
40+
if !found {
41+
return fmt.Errorf("role %q is not available. Available roles are %s", role, action.AvailableRoles)
42+
}
43+
3144
res, err := action.NewOrgInvitationCreate(actionOpts).Run(
32-
context.Background(), receiverEmail)
45+
context.Background(), receiverEmail, role)
3346
if err != nil {
3447
return err
3548
}
@@ -40,6 +53,8 @@ func newOrganizationInvitationCreateCmd() *cobra.Command {
4053

4154
cmd.Flags().StringVar(&receiverEmail, "receiver", "", "Email of the user to invite")
4255
err := cmd.MarkFlagRequired("receiver")
56+
57+
cmd.Flags().StringVar(&role, "role", string(action.RoleViewer), fmt.Sprintf("Role of the user in the organization, available %s", action.AvailableRoles))
4358
cobra.CheckErr(err)
4459

4560
return cmd

app/cli/cmd/organization_invitation_list_sent.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,10 +50,10 @@ func orgInvitationTableOutput(items []*action.OrgInvitationItem) error {
5050
}
5151

5252
t := newTableWriter()
53-
t.AppendHeader(table.Row{"ID", "Receiver Email", "Status", "Created At"})
53+
t.AppendHeader(table.Row{"ID", "Receiver Email", "Role", "Status", "Created At"})
5454

5555
for _, i := range items {
56-
t.AppendRow(table.Row{i.ID, i.ReceiverEmail, i.Status, i.CreatedAt.Format(time.RFC822)})
56+
t.AppendRow(table.Row{i.ID, i.ReceiverEmail, i.Role, i.Status, i.CreatedAt.Format(time.RFC822)})
5757
t.AppendSeparator()
5858
}
5959

app/cli/internal/action/membership_list.go

Lines changed: 51 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ package action
1717

1818
import (
1919
"context"
20+
"strings"
2021
"time"
2122

2223
pb "github.com/chainloop-dev/chainloop/app/controlplane/api/controlplane/v1"
@@ -37,7 +38,7 @@ type MembershipItem struct {
3738
CreatedAt *time.Time `json:"joinedAt"`
3839
UpdatedAt *time.Time `json:"updatedAt"`
3940
Org *OrgItem
40-
Role string `json:"role"`
41+
Role Role `json:"role"`
4142
}
4243

4344
func NewMembershipList(cfg *ActionsOpts) *MembershipList {
@@ -72,22 +73,60 @@ func pbMembershipItemToAction(in *pb.OrgMembershipItem) *MembershipItem {
7273
return nil
7374
}
7475

75-
var role string
76-
switch in.Role {
77-
case pb.MembershipRole_MEMBERSHIP_ROLE_ORG_ADMIN:
78-
role = "admin"
79-
case pb.MembershipRole_MEMBERSHIP_ROLE_ORG_VIEWER:
80-
role = "viewer"
81-
case pb.MembershipRole_MEMBERSHIP_ROLE_ORG_OWNER:
82-
role = "owner"
83-
}
84-
8576
return &MembershipItem{
8677
ID: in.GetId(),
8778
CreatedAt: toTimePtr(in.GetCreatedAt().AsTime()),
8879
UpdatedAt: toTimePtr(in.GetCreatedAt().AsTime()),
8980
Org: pbOrgItemToAction(in.Org),
9081
Current: in.Current,
91-
Role: role,
82+
Role: pbRoleToString(in.Role),
83+
}
84+
}
85+
86+
type Role string
87+
88+
const (
89+
RoleAdmin Role = "admin"
90+
RoleOwner Role = "owner"
91+
RoleViewer Role = "viewer"
92+
)
93+
94+
type Roles []Role
95+
96+
var AvailableRoles = Roles{
97+
RoleAdmin,
98+
RoleOwner,
99+
RoleViewer,
100+
}
101+
102+
func (roles Roles) String() string {
103+
result := make([]string, 0, len(roles))
104+
for _, role := range roles {
105+
result = append(result, string(role))
106+
}
107+
return strings.Join(result, ", ")
108+
}
109+
110+
func pbRoleToString(role pb.MembershipRole) Role {
111+
switch role {
112+
case pb.MembershipRole_MEMBERSHIP_ROLE_ORG_ADMIN:
113+
return RoleAdmin
114+
case pb.MembershipRole_MEMBERSHIP_ROLE_ORG_VIEWER:
115+
return RoleViewer
116+
case pb.MembershipRole_MEMBERSHIP_ROLE_ORG_OWNER:
117+
return RoleOwner
118+
}
119+
return ""
120+
}
121+
122+
func stringToPbRole(role Role) pb.MembershipRole {
123+
switch role {
124+
case RoleAdmin:
125+
return pb.MembershipRole_MEMBERSHIP_ROLE_ORG_ADMIN
126+
case RoleViewer:
127+
return pb.MembershipRole_MEMBERSHIP_ROLE_ORG_VIEWER
128+
case RoleOwner:
129+
return pb.MembershipRole_MEMBERSHIP_ROLE_ORG_OWNER
92130
}
131+
return pb.MembershipRole_MEMBERSHIP_ROLE_UNSPECIFIED
93132
}

app/cli/internal/action/org_invitation_create.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,11 @@ func NewOrgInvitationCreate(cfg *ActionsOpts) *OrgInvitationCreate {
2929
return &OrgInvitationCreate{cfg}
3030
}
3131

32-
func (action *OrgInvitationCreate) Run(ctx context.Context, receiver string) (*OrgInvitationItem, error) {
32+
func (action *OrgInvitationCreate) Run(ctx context.Context, receiver, role string) (*OrgInvitationItem, error) {
3333
client := pb.NewOrgInvitationServiceClient(action.cfg.CPConnection)
3434
resp, err := client.Create(ctx, &pb.OrgInvitationServiceCreateRequest{
3535
ReceiverEmail: receiver,
36+
Role: stringToPbRole(Role(role)),
3637
})
3738

3839
if err != nil {

app/cli/internal/action/org_invitation_list_sent.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ type OrgInvitationItem struct {
3333
Sender *UserItem `json:"sender"`
3434
Status string `json:"status"`
3535
CreatedAt *time.Time `json:"createdAt"`
36+
Role Role `json:"role"`
3637
}
3738

3839
func NewOrgInvitationListSent(cfg *ActionsOpts) *OrgInvitationListSent {
@@ -66,5 +67,6 @@ func pbOrgInvitationItemToAction(in *pb.OrgInvitationItem) *OrgInvitationItem {
6667
Sender: pbUserItemToAction(in.Sender),
6768
CreatedAt: toTimePtr(in.CreatedAt.AsTime()),
6869
Status: in.Status,
70+
Role: pbRoleToString(in.Role),
6971
}
7072
}

0 commit comments

Comments
 (0)