Skip to content

Commit 5ec0eab

Browse files
authored
feat(members): get, update support (#27)
1 parent 67d95ee commit 5ec0eab

1 file changed

Lines changed: 159 additions & 1 deletion

File tree

internal/commands/members/members.go

Lines changed: 159 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import (
2121
func NewCommand() *cli.Command {
2222
return &cli.Command{
2323
Name: "members",
24-
Usage: "Commands related to merchant sumup.",
24+
Usage: "Commands related to merchant members.",
2525
Commands: []*cli.Command{
2626
{
2727
Name: "list",
@@ -94,6 +94,44 @@ func NewCommand() *cli.Command {
9494
},
9595
},
9696
},
97+
{
98+
Name: "get",
99+
Usage: "Get a member from the merchant account.",
100+
Action: getMember,
101+
ArgsUsage: "<member-id>",
102+
Flags: []cli.Flag{
103+
&cli.StringFlag{
104+
Name: "merchant-code",
105+
Usage: "Merchant code that owns the member. Falls back to context.",
106+
Sources: cli.EnvVars("SUMUP_MERCHANT_CODE"),
107+
},
108+
},
109+
},
110+
{
111+
Name: "update",
112+
Usage: "Update a member in the merchant account.",
113+
Action: updateMember,
114+
ArgsUsage: "<member-id>",
115+
Flags: []cli.Flag{
116+
&cli.StringFlag{
117+
Name: "merchant-code",
118+
Usage: "Merchant code that owns the member. Falls back to context.",
119+
Sources: cli.EnvVars("SUMUP_MERCHANT_CODE"),
120+
},
121+
&cli.StringSliceFlag{
122+
Name: "role",
123+
Usage: "Roles to assign to the member (repeat flag for multiple roles).",
124+
},
125+
&cli.StringFlag{
126+
Name: "nickname",
127+
Usage: "Nickname for managed users.",
128+
},
129+
&cli.StringFlag{
130+
Name: "password",
131+
Usage: "Password for managed users.",
132+
},
133+
},
134+
},
97135
{
98136
Name: "invite",
99137
Usage: "Invite a user to become a member of the merchant account.",
@@ -274,6 +312,97 @@ func inviteMember(ctx context.Context, cmd *cli.Command) error {
274312
return nil
275313
}
276314

315+
func getMember(ctx context.Context, cmd *cli.Command) error {
316+
appCtx, err := app.GetAppContext(cmd)
317+
if err != nil {
318+
return err
319+
}
320+
321+
merchantCode, err := app.GetMerchantCode(cmd, "merchant-code")
322+
if err != nil {
323+
return err
324+
}
325+
326+
memberID, err := util.RequireSingleArg(cmd, "member ID")
327+
if err != nil {
328+
return err
329+
}
330+
331+
member, err := appCtx.Client.Members.Get(ctx, merchantCode, memberID)
332+
if err != nil {
333+
return fmt.Errorf("get member: %w", err)
334+
}
335+
336+
if appCtx.JSONOutput {
337+
return display.PrintJSON(member)
338+
}
339+
340+
renderMember(member)
341+
return nil
342+
}
343+
344+
func updateMember(ctx context.Context, cmd *cli.Command) error {
345+
appCtx, err := app.GetAppContext(cmd)
346+
if err != nil {
347+
return err
348+
}
349+
350+
merchantCode, err := app.GetMerchantCode(cmd, "merchant-code")
351+
if err != nil {
352+
return err
353+
}
354+
355+
memberID, err := util.RequireSingleArg(cmd, "member ID")
356+
if err != nil {
357+
return err
358+
}
359+
360+
body := sumup.MembersUpdateParams{}
361+
changeCount := 0
362+
363+
if roles := cmd.StringSlice("role"); len(roles) > 0 {
364+
body.Roles = roles
365+
changeCount++
366+
}
367+
368+
var user *sumup.MembersUpdateParamsUser
369+
if nickname := cmd.String("nickname"); nickname != "" {
370+
if user == nil {
371+
user = &sumup.MembersUpdateParamsUser{}
372+
}
373+
user.Nickname = &nickname
374+
changeCount++
375+
}
376+
if password := cmd.String("password"); password != "" {
377+
if user == nil {
378+
user = &sumup.MembersUpdateParamsUser{}
379+
}
380+
p := secret.New(password)
381+
user.Password = &p
382+
changeCount++
383+
}
384+
if user != nil {
385+
body.User = user
386+
}
387+
388+
if changeCount == 0 {
389+
return fmt.Errorf("no update fields provided")
390+
}
391+
392+
member, err := appCtx.Client.Members.Update(ctx, merchantCode, memberID, body)
393+
if err != nil {
394+
return fmt.Errorf("update member: %w", err)
395+
}
396+
397+
if appCtx.JSONOutput {
398+
return display.PrintJSON(member)
399+
}
400+
401+
message.Success("Member updated")
402+
renderMember(member)
403+
return nil
404+
}
405+
277406
func deleteMember(ctx context.Context, cmd *cli.Command) error {
278407
appCtx, err := app.GetAppContext(cmd)
279408
if err != nil {
@@ -345,3 +474,32 @@ func membershipStatusLabel(status sumup.MembershipStatus) string {
345474
return "Unknown"
346475
}
347476
}
477+
478+
func renderMember(member *sumup.Member) {
479+
if member == nil {
480+
return
481+
}
482+
483+
var createdAt, updatedAt string
484+
createdAt = member.CreatedAt.UTC().Format(time.RFC3339)
485+
updatedAt = member.UpdatedAt.UTC().Format(time.RFC3339)
486+
487+
details := []attribute.KeyValue{
488+
attribute.ID(member.ID),
489+
attribute.Attribute("Email", attribute.Styled(memberEmail(*member))),
490+
attribute.Attribute("Roles", attribute.Styled(memberRoles(member.Roles))),
491+
attribute.Attribute("Status", attribute.Styled(membershipStatusLabel(member.Status))),
492+
attribute.Attribute("Nickname", attribute.Styled(memberNickname(member))),
493+
attribute.Attribute("Created At", attribute.Styled(createdAt)),
494+
attribute.Attribute("Updated At", attribute.Styled(updatedAt)),
495+
}
496+
497+
display.DataList(details)
498+
}
499+
500+
func memberNickname(member *sumup.Member) string {
501+
if member != nil && member.User != nil && member.User.Nickname != nil && *member.User.Nickname != "" {
502+
return *member.User.Nickname
503+
}
504+
return "-"
505+
}

0 commit comments

Comments
 (0)