Skip to content

Commit f135135

Browse files
authored
feat: update SumUp Go SDK (#14)
1 parent a620b88 commit f135135

File tree

16 files changed

+301
-162
lines changed

16 files changed

+301
-162
lines changed

README.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,4 +88,12 @@ sumup readers checkout \
8888

8989
When using affiliate attribution, pass all affiliate flags: `--affiliate-app-id`, `--affiliate-key`, and `--affiliate-foreign-transaction-id`.
9090

91+
Check the last known status of a paired reader:
92+
93+
```bash
94+
sumup readers status \
95+
--merchant-code M123 \
96+
reader_42
97+
```
98+
9199
[docs-badge]: https://img.shields.io/badge/SumUp-documentation-white.svg?logo=data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgY29sb3I9IndoaXRlIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogICAgPHBhdGggZD0iTTIyLjI5IDBIMS43Qy43NyAwIDAgLjc3IDAgMS43MVYyMi4zYzAgLjkzLjc3IDEuNyAxLjcxIDEuN0gyMi4zYy45NCAwIDEuNzEtLjc3IDEuNzEtMS43MVYxLjdDMjQgLjc3IDIzLjIzIDAgMjIuMjkgMFptLTcuMjIgMTguMDdhNS42MiA1LjYyIDAgMCAxLTcuNjguMjQuMzYuMzYgMCAwIDEtLjAxLS40OWw3LjQ0LTcuNDRhLjM1LjM1IDAgMCAxIC40OSAwIDUuNiA1LjYgMCAwIDEtLjI0IDcuNjlabTEuNTUtMTEuOS03LjQ0IDcuNDVhLjM1LjM1IDAgMCAxLS41IDAgNS42MSA1LjYxIDAgMCAxIDcuOS03Ljk2bC4wMy4wM2MuMTMuMTMuMTQuMzUuMDEuNDlaIiBmaWxsPSJjdXJyZW50Q29sb3IiLz4KPC9zdmc+

go.mod

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,14 @@
11
module github.com/sumup/sumup-cli
22

3-
go 1.24.0
4-
5-
toolchain go1.24.11
3+
go 1.25.5
64

75
require (
86
github.com/charmbracelet/bubbles v0.21.0
97
github.com/charmbracelet/bubbletea v1.3.10
108
github.com/charmbracelet/lipgloss v1.1.0
119
github.com/mergestat/timediff v0.0.4
1210
github.com/shopspring/decimal v1.4.0
13-
github.com/sumup/sumup-go v0.9.0
11+
github.com/sumup/sumup-go v0.11.1
1412
github.com/urfave/cli/v3 v3.6.2
1513
golang.org/x/term v0.39.0
1614
)
@@ -23,7 +21,6 @@ require (
2321
github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd // indirect
2422
github.com/charmbracelet/x/term v0.2.1 // indirect
2523
github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f // indirect
26-
github.com/google/go-cmp v0.6.0 // indirect
2724
github.com/lucasb-eyer/go-colorful v1.2.0 // indirect
2825
github.com/mattn/go-isatty v0.0.20 // indirect
2926
github.com/mattn/go-localereader v0.0.1 // indirect
@@ -33,7 +30,7 @@ require (
3330
github.com/muesli/termenv v0.16.0 // indirect
3431
github.com/rivo/uniseg v0.4.7 // indirect
3532
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect
36-
golang.org/x/oauth2 v0.27.0 // indirect
33+
golang.org/x/oauth2 v0.34.0 // indirect
3734
golang.org/x/sys v0.40.0 // indirect
3835
golang.org/x/text v0.3.8 // indirect
3936
)

go.sum

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,6 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c
2424
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
2525
github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f h1:Y/CXytFA4m6baUTXGLOoWe4PQhGxaX0KpnayAqC48p4=
2626
github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f/go.mod h1:vw97MGsxSvLiUE2X8qFplwetxpGLQrlU1Q9AUEIzCaM=
27-
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
28-
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
2927
github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY=
3028
github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0=
3129
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
@@ -51,16 +49,16 @@ github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp
5149
github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+DMd9qYNcwME=
5250
github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
5351
github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
54-
github.com/sumup/sumup-go v0.9.0 h1:zD8AXGcJSzkiopI9ZNZMkWT4Xse1mpYe92G4dk27gJ4=
55-
github.com/sumup/sumup-go v0.9.0/go.mod h1:UgT9aaxvUBrAiRpunqyb1zi5v/+1z+6Lr6p6bgL8EYI=
52+
github.com/sumup/sumup-go v0.11.1 h1:jGthnT8V/QIllOoF4pE9kwS000AntdtEa4UTaejeX/I=
53+
github.com/sumup/sumup-go v0.11.1/go.mod h1:UgT9aaxvUBrAiRpunqyb1zi5v/+1z+6Lr6p6bgL8EYI=
5654
github.com/urfave/cli/v3 v3.6.2 h1:lQuqiPrZ1cIz8hz+HcrG0TNZFxU70dPZ3Yl+pSrH9A8=
5755
github.com/urfave/cli/v3 v3.6.2/go.mod h1:ysVLtOEmg2tOy6PknnYVhDoouyC/6N42TMeoMzskhso=
5856
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no=
5957
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM=
6058
golang.org/x/exp v0.0.0-20220909182711-5c715a9e8561 h1:MDc5xs78ZrZr3HMQugiXOAkSZtfTpbJLDr/lwfgO53E=
6159
golang.org/x/exp v0.0.0-20220909182711-5c715a9e8561/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE=
62-
golang.org/x/oauth2 v0.27.0 h1:da9Vo7/tDv5RH/7nZDz1eMGS/q1Vv1N/7FCrBhI9I3M=
63-
golang.org/x/oauth2 v0.27.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8=
60+
golang.org/x/oauth2 v0.34.0 h1:hqK/t4AKgbqWkdkcAeI8XLmbK+4m4G5YeQRrmiotGlw=
61+
golang.org/x/oauth2 v0.34.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA=
6462
golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
6563
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
6664
golang.org/x/sys v0.40.0 h1:DBZZqJ2Rkml6QMQsZywtnjnnGvHza6BTfYFWY9kjEWQ=

internal/commands/checkouts/checkouts.go

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,8 @@ func NewCommand() *cli.Command {
3838
Name: "create",
3939
Usage: "Create a new checkout resource.",
4040
Description: `Examples:
41-
sumup-cli checkouts create --reference order-123 --amount 10 --currency EUR --merchant-code M123
42-
sumup-cli checkouts create --reference ticket-42 --amount 29.99 --currency EUR --merchant-code M123 --description "Ticket" --return-url https://example.com/return`,
41+
sumup checkouts create --reference order-123 --amount 10 --currency EUR --merchant-code M123
42+
sumup checkouts create --reference ticket-42 --amount 29.99 --currency EUR --merchant-code M123 --description "Ticket" --return-url https://example.com/return`,
4343
Action: createCheckout,
4444
Flags: []cli.Flag{
4545
&cli.StringFlag{
@@ -113,23 +113,27 @@ func listCheckouts(ctx context.Context, cmd *cli.Command) error {
113113
return display.PrintJSON(checkoutList)
114114
}
115115

116-
rows := make([][]string, 0, len(*checkoutList))
116+
rows := make([][]attribute.Value, 0, len(*checkoutList))
117117
for _, checkout := range *checkoutList {
118118
status := "-"
119119
if checkout.Status != nil {
120120
status = string(*checkout.Status)
121121
}
122-
rows = append(rows, []string{
123-
util.StringOrDefault(checkout.ID, "-"),
124-
util.StringOrDefault(checkout.CheckoutReference, "-"),
125-
currency.FormatPointers(checkout.Amount, checkout.Currency),
126-
status,
127-
util.StringOrDefault(checkout.MerchantCode, "-"),
128-
util.TimeOrDash(appCtx, checkout.Date),
122+
rows = append(rows, []attribute.Value{
123+
attribute.OptionalStringValue(checkout.ID),
124+
attribute.OptionalStringValue(checkout.CheckoutReference),
125+
attribute.ValueOf(currency.FormatPointers(checkout.Amount, checkout.Currency)),
126+
attribute.ValueOf(status),
127+
attribute.OptionalStringValue(checkout.MerchantCode),
128+
attribute.ValueOf(util.TimeOrDash(appCtx, checkout.Date)),
129129
})
130130
}
131131

132-
display.RenderTable("Checkouts", []string{"ID", "Reference", "Amount", "Status", "Merchant", "Created At"}, rows)
132+
display.RenderTable(
133+
"Checkouts",
134+
[]string{"ID", "Reference", "Amount", "Status", "Merchant", "Created At"},
135+
rows,
136+
)
133137
return nil
134138
}
135139

@@ -160,13 +164,13 @@ func createCheckout(ctx context.Context, cmd *cli.Command) error {
160164
body.Description = &value
161165
}
162166
if value := cmd.String("return-url"); value != "" {
163-
body.ReturnUrl = &value
167+
body.ReturnURL = &value
164168
}
165169
if value := cmd.String("redirect-url"); value != "" {
166-
body.RedirectUrl = &value
170+
body.RedirectURL = &value
167171
}
168172
if value := cmd.String("customer-id"); value != "" {
169-
body.CustomerId = &value
173+
body.CustomerID = &value
170174
}
171175
if value := cmd.String("purpose"); value != "" {
172176
purpose := checkouts.CreateCheckoutBodyPurpose(value)

internal/commands/context/context.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ func (m model) searchMemberships(query string, parentID string, parentType membe
157157
}
158158

159159
if parentID != "" {
160-
params.ResourceParentId = &parentID
160+
params.ResourceParentID = &parentID
161161
}
162162

163163
if parentType != "" {
@@ -350,7 +350,7 @@ func (m model) View() string {
350350
}
351351
s.WriteString("\n")
352352
} else if len(items) > maxVisible {
353-
s.WriteString(fmt.Sprintf("\n(Showing %d-%d of %d)", start+1, end, len(items)))
353+
fmt.Fprintf(&s, "\n(Showing %d-%d of %d)", start+1, end, len(items))
354354
}
355355

356356
helpStyle := lipgloss.NewStyle().Foreground(lipgloss.Color("241"))

internal/commands/customers/customers.go

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"github.com/sumup/sumup-cli/internal/app"
1212
"github.com/sumup/sumup-cli/internal/commands/util"
1313
"github.com/sumup/sumup-cli/internal/display"
14+
"github.com/sumup/sumup-cli/internal/display/attribute"
1415
)
1516

1617
func NewCommand() *cli.Command {
@@ -46,18 +47,22 @@ func listPaymentInstruments(ctx context.Context, cmd *cli.Command) error {
4647
return display.PrintJSON(instruments)
4748
}
4849

49-
rows := make([][]string, 0, len(*instruments))
50+
rows := make([][]attribute.Value, 0, len(*instruments))
5051
for _, instrument := range *instruments {
51-
rows = append(rows, []string{
52-
util.StringOrDefault(instrument.Token, "-"),
53-
paymentInstrumentType(&instrument),
54-
lastFour(&instrument),
55-
util.BoolLabel(instrument.Active),
56-
util.TimeOrDash(appCtx, instrument.CreatedAt),
52+
rows = append(rows, []attribute.Value{
53+
attribute.OptionalStringValue(instrument.Token),
54+
attribute.ValueOf(paymentInstrumentType(&instrument)),
55+
attribute.ValueOf(lastFour(&instrument)),
56+
attribute.ValueOf(util.BoolLabel(instrument.Active)),
57+
attribute.ValueOf(util.TimeOrDash(appCtx, instrument.CreatedAt)),
5758
})
5859
}
5960

60-
display.RenderTable("Payment Instruments", []string{"Token", "Type", "Last 4", "Active", "Created At"}, rows)
61+
display.RenderTable(
62+
"Payment Instruments",
63+
[]string{"Token", "Type", "Last 4", "Active", "Created At"},
64+
rows,
65+
)
6166
return nil
6267
}
6368

internal/commands/members/members.go

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ func listMembers(ctx context.Context, cmd *cli.Command) error {
153153
params.Email = &value
154154
}
155155
if value := cmd.String("user-id"); value != "" {
156-
params.UserId = &value
156+
params.UserID = &value
157157
}
158158
if roles := cmd.StringSlice("role"); len(roles) > 0 {
159159
params.Roles = roles
@@ -179,18 +179,22 @@ func listMembers(ctx context.Context, cmd *cli.Command) error {
179179
return display.PrintJSON(response.Items)
180180
}
181181

182-
rows := make([][]string, 0, len(response.Items))
182+
rows := make([][]attribute.Value, 0, len(response.Items))
183183
for _, member := range response.Items {
184-
rows = append(rows, []string{
185-
member.ID,
186-
memberEmail(member),
187-
memberRoles(member.Roles),
188-
membershipStatusLabel(member.Status),
189-
member.CreatedAt.UTC().Format(time.RFC3339),
184+
rows = append(rows, []attribute.Value{
185+
attribute.ValueOf(member.ID),
186+
attribute.ValueOf(memberEmail(member)),
187+
attribute.ValueOf(memberRoles(member.Roles)),
188+
attribute.ValueOf(membershipStatusLabel(member.Status)),
189+
attribute.ValueOf(member.CreatedAt.UTC().Format(time.RFC3339)),
190190
})
191191
}
192192

193-
display.RenderTable("Members", []string{"ID", "Email", "Roles", "Status", "Created At"}, rows)
193+
display.RenderTable(
194+
"Members",
195+
[]string{"ID", "Email", "Roles", "Status", "Created At"},
196+
rows,
197+
)
194198
return nil
195199
}
196200

internal/commands/memberships/memberships.go

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313

1414
"github.com/sumup/sumup-cli/internal/app"
1515
"github.com/sumup/sumup-cli/internal/display"
16+
"github.com/sumup/sumup-cli/internal/display/attribute"
1617
)
1718

1819
func NewCommand() *cli.Command {
@@ -105,19 +106,23 @@ func listMemberships(ctx context.Context, cmd *cli.Command) error {
105106
return display.PrintJSON(response)
106107
}
107108

108-
rows := make([][]string, 0, len(response.Items))
109+
rows := make([][]attribute.Value, 0, len(response.Items))
109110
for _, membership := range response.Items {
110-
rows = append(rows, []string{
111-
membership.ID,
112-
membership.Resource.Name,
113-
string(membership.Resource.Type),
114-
memberRoles(membership.Roles),
115-
membershipStatusLabel(membership.Status),
116-
membership.CreatedAt.UTC().Format(time.RFC3339),
111+
rows = append(rows, []attribute.Value{
112+
attribute.ValueOf(membership.ID),
113+
attribute.ValueOf(membership.Resource.Name),
114+
attribute.ValueOf(string(membership.Resource.Type)),
115+
attribute.ValueOf(memberRoles(membership.Roles)),
116+
attribute.ValueOf(membershipStatusLabel(membership.Status)),
117+
attribute.ValueOf(membership.CreatedAt.UTC().Format(time.RFC3339)),
117118
})
118119
}
119120

120-
display.RenderTable("Memberships", []string{"ID", "Resource", "Type", "Roles", "Status", "Created At"}, rows)
121+
display.RenderTable(
122+
"Memberships",
123+
[]string{"ID", "Resource", "Type", "Roles", "Status", "Created At"},
124+
rows,
125+
)
121126
return nil
122127
}
123128

internal/commands/payouts/payouts.go

Lines changed: 15 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ import (
1212
"github.com/sumup/sumup-go/payouts"
1313

1414
"github.com/sumup/sumup-cli/internal/app"
15-
"github.com/sumup/sumup-cli/internal/commands/util"
1615
"github.com/sumup/sumup-cli/internal/display"
16+
"github.com/sumup/sumup-cli/internal/display/attribute"
1717
)
1818

1919
func NewCommand() *cli.Command {
@@ -94,20 +94,24 @@ func listPayouts(ctx context.Context, cmd *cli.Command) error {
9494
return display.PrintJSON(payoutList)
9595
}
9696

97-
rows := make([][]string, 0, len(*payoutList))
97+
rows := make([][]attribute.Value, 0, len(*payoutList))
9898
for _, payout := range *payoutList {
99-
rows = append(rows, []string{
100-
intPointerToString(payout.ID),
101-
dateOrDash(payout.Date),
102-
payoutAmount(payout),
103-
floatPointerToString(payout.Fee),
104-
enumOrDash(payout.Status),
105-
enumOrDash(payout.Type),
106-
util.StringOrDefault(payout.Reference, "-"),
99+
rows = append(rows, []attribute.Value{
100+
attribute.OptionalValue(payout.ID, func(v int) string { return fmt.Sprintf("%d", v) }),
101+
attribute.OptionalValue(payout.Date, func(d datetime.Date) string { return d.String() }),
102+
attribute.ValueOf(payoutAmount(payout)),
103+
attribute.OptionalValue(payout.Fee, func(v float32) string { return fmt.Sprintf("%.2f", v) }),
104+
attribute.OptionalValue(payout.Status, func(v payouts.FinancialPayoutStatus) string { return string(v) }),
105+
attribute.OptionalValue(payout.Type, func(v payouts.FinancialPayoutType) string { return string(v) }),
106+
attribute.OptionalStringValue(payout.Reference),
107107
})
108108
}
109109

110-
display.RenderTable("Payouts", []string{"ID", "Date", "Amount", "Fee", "Status", "Type", "Reference"}, rows)
110+
display.RenderTable(
111+
"Payouts",
112+
[]string{"ID", "Date", "Amount", "Fee", "Status", "Type", "Reference"},
113+
rows,
114+
)
111115
return nil
112116
}
113117

@@ -119,34 +123,6 @@ func parseDateArg(value string) (datetime.Date, error) {
119123
return datetime.Date{Time: parsed}, nil
120124
}
121125

122-
func intPointerToString(value *int) string {
123-
if value == nil {
124-
return "-"
125-
}
126-
return fmt.Sprintf("%d", *value)
127-
}
128-
129-
func floatPointerToString(value *float32) string {
130-
if value == nil {
131-
return "-"
132-
}
133-
return fmt.Sprintf("%.2f", *value)
134-
}
135-
136-
func enumOrDash[T ~string](value *T) string {
137-
if value == nil {
138-
return "-"
139-
}
140-
return string(*value)
141-
}
142-
143-
func dateOrDash(value *datetime.Date) string {
144-
if value == nil {
145-
return "-"
146-
}
147-
return value.String()
148-
}
149-
150126
func payoutAmount(payout payouts.FinancialPayout) string {
151127
if payout.Amount == nil {
152128
return "-"

0 commit comments

Comments
 (0)