Skip to content

Commit 784f84e

Browse files
author
Klim Sidorov
committed
GOES-1: Improve PostgreSQL Backend
- return `model.ErrNotFound` - use `store.table`
1 parent c6ea275 commit 784f84e

File tree

2 files changed

+149
-35
lines changed

2 files changed

+149
-35
lines changed

backend/postgres/store.go

Lines changed: 81 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package postgres
22

33
import (
44
"context"
5+
"errors"
56
"fmt"
67
"net/url"
78
"os"
@@ -14,9 +15,21 @@ import (
1415
"github.com/google/uuid"
1516
"github.com/jackc/pgx/v4"
1617
"github.com/jackc/pgx/v4/pgxpool"
18+
1719
"github.com/modernice/goes/codec"
1820
"github.com/modernice/goes/event"
1921
"github.com/modernice/goes/internal/slice"
22+
"github.com/modernice/goes/persistence/model"
23+
)
24+
25+
const (
26+
columnID = "id"
27+
columnName = "name"
28+
columnTime = "time"
29+
columnAggregateID = "aggregate_id"
30+
columnAggregateName = "aggregate_name"
31+
columnAggregateVersion = "aggregate_version"
32+
columnData = "data"
2033
)
2134

2235
var _ event.Store = &EventStore{}
@@ -217,15 +230,15 @@ func (store *EventStore) createIndexes(ctx context.Context) error {
217230
}{
218231
{
219232
name: "goes_name",
220-
fields: []string{"name"},
233+
fields: []string{columnName},
221234
},
222235
{
223236
name: "goes_time",
224-
fields: []string{"time"},
237+
fields: []string{columnTime},
225238
},
226239
{
227240
name: "goes_aggregate",
228-
fields: []string{"aggregate_id", "aggregate_name", "aggregate_version"},
241+
fields: []string{columnAggregateID, columnAggregateName, columnAggregateVersion},
229242
unique: true,
230243
},
231244
}
@@ -283,11 +296,26 @@ func (store *EventStore) Insert(ctx context.Context, events ...event.Event) erro
283296
aggregateVersionVal = "NULL"
284297
}
285298

286-
if _, err := tx.Exec(ctx, fmt.Sprintf(`INSERT INTO events (
287-
id, name, time, aggregate_id, aggregate_name, aggregate_version, data
288-
) VALUES (
289-
$1, $2, $3, %s, %s, %s, $4
290-
)`, aggregateIDVal, aggregateName, aggregateVersionVal), evt.ID(), evt.Name(), evt.Time().UnixNano(), b); err != nil {
299+
builder := squirrel.
300+
Insert(store.table).
301+
Columns(
302+
columnID,
303+
columnName,
304+
columnTime,
305+
columnAggregateID,
306+
columnAggregateName,
307+
columnAggregateVersion,
308+
columnData,
309+
).
310+
Values(evt.ID(), evt.Name(), evt.Time().UnixNano(), aggregateIDVal, aggregateName, aggregateVersionVal, b).
311+
PlaceholderFormat(squirrel.Dollar)
312+
313+
sql, args, err := builder.ToSql()
314+
if err != nil {
315+
return fmt.Errorf("build sql: %w", err)
316+
}
317+
318+
if _, err := tx.Exec(ctx, sql, args...); err != nil {
291319
return fmt.Errorf("insert %q event: %w", evt.Name(), err)
292320
}
293321
}
@@ -301,12 +329,26 @@ func (store *EventStore) Find(ctx context.Context, id uuid.UUID) (event.Event, e
301329
return nil, fmt.Errorf("connect: %w", err)
302330
}
303331

332+
builder := squirrel.
333+
Select(
334+
columnID,
335+
columnName,
336+
columnTime,
337+
columnAggregateID,
338+
columnAggregateName,
339+
columnAggregateVersion,
340+
columnData,
341+
).
342+
From(store.table).
343+
Where(squirrel.Eq{columnID: id})
344+
345+
sql, args, err := builder.ToSql()
346+
if err != nil {
347+
return nil, fmt.Errorf("build sql: %w", err)
348+
}
349+
304350
var evt dbevent
305-
if err := store.pool.QueryRow(
306-
ctx,
307-
`SELECT id, name, time, aggregate_id, aggregate_name, aggregate_version, data FROM events WHERE id = $1`,
308-
id,
309-
).Scan(
351+
if err := store.pool.QueryRow(ctx, sql, args...).Scan(
310352
&evt.ID,
311353
&evt.Name,
312354
&evt.Time,
@@ -315,6 +357,10 @@ func (store *EventStore) Find(ctx context.Context, id uuid.UUID) (event.Event, e
315357
&evt.AggregateVersion,
316358
&evt.Data,
317359
); err != nil {
360+
if errors.Is(err, pgx.ErrNoRows) {
361+
return nil, model.ErrNotFound
362+
}
363+
318364
return nil, fmt.Errorf("query event: %w", err)
319365
}
320366

@@ -398,37 +444,37 @@ func (store *EventStore) Query(ctx context.Context, query event.Query) (<-chan e
398444

399445
func (store *EventStore) buildQuery(query event.Query) (string, []any, error) {
400446
builder := squirrel.
401-
Select("id", "name", "time", "aggregate_id", "aggregate_name", "aggregate_version", "data").
447+
Select(columnID, columnName, columnTime, columnAggregateID, columnAggregateName, columnAggregateVersion, columnData).
402448
From(store.table).
403449
PlaceholderFormat(squirrel.Dollar)
404450

405451
if ids := query.AggregateIDs(); len(ids) > 0 {
406-
builder = builder.Where(buildOREq("aggregate_id", ids))
452+
builder = builder.Where(buildOREq(columnAggregateID, ids))
407453
}
408454

409455
if names := query.AggregateNames(); len(names) > 0 {
410-
builder = builder.Where(squirrel.Eq{"aggregate_name": names})
456+
builder = builder.Where(squirrel.Eq{columnAggregateName: names})
411457
}
412458

413459
if versions := query.AggregateVersions(); versions != nil {
414460
if exact := versions.Exact(); len(exact) > 0 {
415-
builder = builder.Where(squirrel.Eq{"aggregate_version": exact})
461+
builder = builder.Where(squirrel.Eq{columnAggregateVersion: exact})
416462
}
417463

418464
if min := versions.Min(); len(min) > 0 {
419-
builder = builder.Where(buildORGte("aggregate_version", min))
465+
builder = builder.Where(buildORGte(columnAggregateVersion, min))
420466
}
421467

422468
if max := versions.Max(); len(max) > 0 {
423-
builder = builder.Where(buildORLte("aggregate_version", max))
469+
builder = builder.Where(buildORLte(columnAggregateVersion, max))
424470
}
425471

426472
if ranges := versions.Ranges(); len(ranges) > 0 {
427473
or := make(squirrel.Or, len(ranges))
428474
for i, r := range ranges {
429475
or[i] = squirrel.And{
430-
squirrel.GtOrEq{"aggregate_version": r.Start()},
431-
squirrel.LtOrEq{"aggregate_version": r.End()},
476+
squirrel.GtOrEq{columnAggregateVersion: r.Start()},
477+
squirrel.LtOrEq{columnAggregateVersion: r.End()},
432478
}
433479
}
434480
builder = builder.Where(or)
@@ -438,10 +484,10 @@ func (store *EventStore) buildQuery(query event.Query) (string, []any, error) {
438484
if refs := query.Aggregates(); len(refs) > 0 {
439485
or := make(squirrel.Or, len(refs))
440486
for i, ref := range refs {
441-
and := squirrel.And{squirrel.Eq{"aggregate_name": ref.Name}}
487+
and := squirrel.And{squirrel.Eq{columnAggregateName: ref.Name}}
442488

443489
if ref.ID != uuid.Nil {
444-
and = append(and, squirrel.Eq{"aggregate_id": ref.ID})
490+
and = append(and, squirrel.Eq{columnAggregateID: ref.ID})
445491
}
446492

447493
or[i] = and
@@ -450,34 +496,34 @@ func (store *EventStore) buildQuery(query event.Query) (string, []any, error) {
450496
}
451497

452498
if ids := query.IDs(); len(ids) > 0 {
453-
builder = builder.Where(buildOREq("id", ids))
499+
builder = builder.Where(buildOREq(columnID, ids))
454500
}
455501

456502
if names := query.Names(); len(names) > 0 {
457-
builder = builder.Where(squirrel.Eq{"name": names})
503+
builder = builder.Where(squirrel.Eq{columnName: names})
458504
}
459505

460506
if times := query.Times(); times != nil {
461507
if exact := times.Exact(); len(exact) > 0 {
462-
builder = builder.Where(buildOREq("time", slice.Map(exact, func(t time.Time) int64 {
508+
builder = builder.Where(buildOREq(columnTime, slice.Map(exact, func(t time.Time) int64 {
463509
return t.UnixNano()
464510
})))
465511
}
466512

467513
if min := times.Min(); !min.IsZero() {
468-
builder = builder.Where(squirrel.GtOrEq{"time": min.UnixNano()})
514+
builder = builder.Where(squirrel.GtOrEq{columnTime: min.UnixNano()})
469515
}
470516

471517
if max := times.Max(); !max.IsZero() {
472-
builder = builder.Where(squirrel.LtOrEq{"time": max.UnixNano()})
518+
builder = builder.Where(squirrel.LtOrEq{columnTime: max.UnixNano()})
473519
}
474520

475521
if ranges := times.Ranges(); len(ranges) > 0 {
476522
or := make(squirrel.Or, len(ranges))
477523
for i, r := range ranges {
478524
or[i] = squirrel.And{
479-
squirrel.GtOrEq{"time": r.Start().UnixNano()},
480-
squirrel.LtOrEq{"time": r.End().UnixNano()},
525+
squirrel.GtOrEq{columnTime: r.Start().UnixNano()},
526+
squirrel.LtOrEq{columnTime: r.End().UnixNano()},
481527
}
482528
}
483529
builder = builder.Where(or)
@@ -495,13 +541,13 @@ func (store *EventStore) buildQuery(query event.Query) (string, []any, error) {
495541
var field string
496542
switch sorting.Sort {
497543
case event.SortAggregateID:
498-
field = "aggregate_id"
544+
field = columnAggregateID
499545
case event.SortAggregateName:
500-
field = "aggregate_name"
546+
field = columnAggregateName
501547
case event.SortAggregateVersion:
502-
field = "aggregate_version"
548+
field = columnAggregateVersion
503549
case event.SortTime:
504-
field = "time"
550+
field = columnTime
505551
}
506552

507553
orders[i] = fmt.Sprintf("%s %s", field, dir)
@@ -531,7 +577,7 @@ func (store *EventStore) Delete(ctx context.Context, events ...event.Event) erro
531577
defer tx.Rollback(ctx)
532578

533579
for _, evt := range events {
534-
sql, args, err := squirrel.Delete(store.table).Where(squirrel.Eq{"id": evt.ID()}).PlaceholderFormat(squirrel.Dollar).ToSql()
580+
sql, args, err := squirrel.Delete(store.table).Where(squirrel.Eq{columnID: evt.ID()}).PlaceholderFormat(squirrel.Dollar).ToSql()
535581
if err != nil {
536582
return fmt.Errorf("delete event: %w [id=%s]", err, evt.ID())
537583
}

go.work.sum

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,102 @@
11
cel.dev/expr v0.23.0/go.mod h1:hLPLo1W4QUmuYdA72RBX06QTs6MXw941piREPl3Yfiw=
2+
cel.dev/expr v0.24.0 h1:56OvJKSH3hDGL0ml5uSxZmz3/3Pq4tJ+fb1unVLAFcY=
3+
cel.dev/expr v0.24.0/go.mod h1:hLPLo1W4QUmuYdA72RBX06QTs6MXw941piREPl3Yfiw=
24
cloud.google.com/go/compute/metadata v0.6.0/go.mod h1:FjyFAW1MW0C203CEOMDTu3Dk1FlqW3Rga40jzHL4hfg=
5+
cloud.google.com/go/compute/metadata v0.7.0 h1:PBWF+iiAerVNe8UCHxdOt6eHLVc3ydFeOCw78U8ytSU=
6+
cloud.google.com/go/compute/metadata v0.7.0/go.mod h1:j5MvL9PprKL39t166CoB1uVHfQMs4tFQZZcKwksXUjo=
7+
github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
8+
github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.27.0 h1:ErKg/3iS1AKcTkf3yixlZ54f9U1rljCkQyEXWUnIUxc=
39
github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.27.0/go.mod h1:yAZHSGnqScoU556rBOVkwLze6WP5N+U11RHuWaGVxwY=
10+
github.com/Masterminds/semver/v3 v3.1.1 h1:hLg3sBzpNErnxhQtUy/mmLR2I9foDujNK030IGemrRc=
11+
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
412
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
513
github.com/cncf/xds/go v0.0.0-20250326154945-ae57f3c0d45f/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8=
14+
github.com/cncf/xds/go v0.0.0-20250501225837-2ac532fd4443 h1:aQ3y1lwWyqYPiWZThqv1aFbZMiM9vblcSArJRf2Irls=
15+
github.com/cncf/xds/go v0.0.0-20250501225837-2ac532fd4443/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8=
16+
github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f h1:JOrtw2xFKzlg+cbHpyrpLDmnN1HqhBfnX7WDiW7eG2c=
17+
github.com/cpuguy83/go-md2man/v2 v2.0.6 h1:XJtiaUW6dEEqVuZiMTn1ldk455QWwEIsMIJlo5vtkx0=
18+
github.com/creack/pty v1.1.7 h1:6pwm8kMQKCmgUg0ZHTm5+/YvRK0s3THD/28+T6/kk4A=
19+
github.com/envoyproxy/go-control-plane v0.13.4 h1:zEqyPVyku6IvWCFwux4x9RxkLOMUL+1vC9xUFv5l2/M=
620
github.com/envoyproxy/go-control-plane v0.13.4/go.mod h1:kDfuBlDVsSj2MjrLEtRWtHlsWIFcGyB2RMO44Dc5GZA=
21+
github.com/envoyproxy/go-control-plane/envoy v1.32.4 h1:jb83lalDRZSpPWW2Z7Mck/8kXZ5CQAFYVjQcdVIr83A=
722
github.com/envoyproxy/go-control-plane/envoy v1.32.4/go.mod h1:Gzjc5k8JcJswLjAx1Zm+wSYE20UrLtt7JZMWiWQXQEw=
23+
github.com/envoyproxy/go-control-plane/ratelimit v0.1.0 h1:/G9QYbddjL25KvtKTv3an9lx6VBE2cnb8wp1vEGNYGI=
824
github.com/envoyproxy/go-control-plane/ratelimit v0.1.0/go.mod h1:Wk+tMFAFbCXaJPzVVHnPgRKdUdwW/KdbRt94AzgRee4=
25+
github.com/envoyproxy/protoc-gen-validate v1.2.1 h1:DEo3O99U8j4hBFwbJfrz9VtgcDfUKS7KJ7spH3d86P8=
926
github.com/envoyproxy/protoc-gen-validate v1.2.1/go.mod h1:d/C80l/jxXLdfEIhX1W2TmLfsJ31lvEjwamM4DxlWXU=
27+
github.com/go-jose/go-jose/v4 v4.0.5 h1:M6T8+mKZl/+fNNuFHvGIzDz7BTLQPIounk/b9dw3AaE=
1028
github.com/go-jose/go-jose/v4 v4.0.5/go.mod h1:s3P1lRrkT8igV8D9OjyL4WRyHvjB6a4JSllnOrmmBOA=
29+
github.com/go-kit/log v0.1.0 h1:DGJh0Sm43HbOeYDNnVZFl8BvcYVvjD5bqYJvp0REbwQ=
30+
github.com/go-logfmt/logfmt v0.5.0 h1:TrB8swr/68K7m9CcGut2g3UOihhbcbiMAYiuTXdEih4=
31+
github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk=
1132
github.com/golang/glog v1.2.4/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w=
33+
github.com/golang/glog v1.2.5 h1:DrW6hGnjIhtvhOIiAKT6Psh/Kd/ldepEa81DKeiRJ5I=
34+
github.com/golang/glog v1.2.5/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w=
1235
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
1336
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
37+
github.com/google/renameio v0.1.0 h1:GOZbcHa3HfsPKPlmyPyN2KEohoMXOhdMbHrvbpl2QaA=
1438
github.com/jackc/chunkreader v1.0.0 h1:4s39bBR8ByfqH+DKm8rQA3E1LHZWB9XWcrz8fqaZbe0=
1539
github.com/jackc/pgproto3 v1.1.0 h1:FYYE4yRw+AgI8wXIinMlNjBbp/UitDJwfj5LqqewP1A=
40+
github.com/kisielk/gotool v1.0.0 h1:AV2c/EiW3KqPNT9ZKl07ehoAGi4C5/01Cfbblndcapg=
1641
github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE=
42+
github.com/konsorten/go-windows-terminal-sequences v1.0.2 h1:DB17ag19krx9CFsz4o3enTrPXyIXCl+2iCXH/aMAp9s=
43+
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
44+
github.com/kr/pty v1.1.8 h1:AkaSdXYQOWeaO3neb8EM634ahkXXe3jYbVh/F9lq+GI=
45+
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
46+
github.com/mattn/go-colorable v0.1.6 h1:6Su7aK7lXmJ/U79bYtBjLNaha4Fs1Rg9plHpcH+vvnE=
47+
github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY=
48+
github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo=
1749
github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8=
50+
github.com/rogpeppe/go-internal v1.3.0 h1:RR9dF3JtopPvtkroDZuVD7qquD0bnHlKSqaQhgwt8yk=
51+
github.com/rs/xid v1.2.1 h1:mhH9Nq+C1fY2l1XIpgxIiUOfNpRBYH1kKcr+qfKgjRc=
52+
github.com/rs/zerolog v1.15.0 h1:uPRuwkWF4J6fGsJ2R0Gn2jB1EQiav9k3S6CSdygQJXY=
53+
github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
54+
github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww=
55+
github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4=
56+
github.com/spiffe/go-spiffe/v2 v2.5.0 h1:N2I01KCUkv1FAjZXJMwh95KK1ZIQLYbPfhaxw8WS0hE=
1857
github.com/spiffe/go-spiffe/v2 v2.5.0/go.mod h1:P+NxobPc6wXhVtINNtFjNWGBTreew1GBUCwT2wPmb7g=
58+
github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c=
1959
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
60+
github.com/yuin/goldmark v1.4.13 h1:fVcFKWvrslecOb/tg+Cc05dkeYx540o0FuFt3nUVDoE=
61+
github.com/zeebo/errs v1.4.0 h1:XNdoD/RRMKP7HD0UhJnIzUy74ISdGGxURlYG8HSWSfM=
2062
github.com/zeebo/errs v1.4.0/go.mod h1:sgbWHsvVuTPHcqJJGQ1WhI5KbWlHYz+2+2C/LSEtCw4=
63+
github.com/zenazn/goji v0.9.0 h1:RSQQAbXGArQ0dIDEq+PI6WqN6if+5KHu6x2Cx/GXLTQ=
2164
go.opentelemetry.io/contrib/detectors/gcp v1.35.0/go.mod h1:qGWP8/+ILwMRIUf9uIVLloR1uo5ZYAslM4O6OqUi1DA=
65+
go.opentelemetry.io/contrib/detectors/gcp v1.36.0 h1:F7q2tNlCaHY9nMKHR6XH9/qkp8FktLnIcy6jJNyOCQw=
66+
go.opentelemetry.io/contrib/detectors/gcp v1.36.0/go.mod h1:IbBN8uAIIx734PTonTPxAxnjc2pQTxWNkwfstZ+6H2k=
67+
go.uber.org/atomic v1.6.0 h1:Ezj3JGmsOnG1MoRWQkPBsKLe9DwWD9QeXzTRzzldNVk=
68+
go.uber.org/multierr v1.5.0 h1:KCa4XfM8CWFCpxXRGok+Q0SS/0XBhMDbHHGABQLvD2A=
69+
go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEaUSmT1ysygQC7qYo7sG4=
70+
go.uber.org/zap v1.13.0 h1:nR6NoDBgAf67s68NhaXbsojM+2gxp3S1hWkHDl27pVU=
2271
golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54=
2372
golang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc=
73+
golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc=
74+
golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs=
75+
golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA=
2476
golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
2577
golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
2678
golang.org/x/oauth2 v0.28.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8=
79+
golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI=
80+
golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU=
2781
golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
82+
golang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
2883
golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
84+
golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
85+
golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2 h1:IRJeR9r1pYWsHKTRe/IInb7lYvbBVIqOgsX/u0mbOWY=
2986
golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE=
3087
golang.org/x/term v0.30.0/go.mod h1:NYYFdzHoI5wRh/h5tDMdMqCqPJZEuNqVR5xJLd/n67g=
3188
golang.org/x/term v0.31.0/go.mod h1:R4BeIy7D95HzImkxGkTW1UQTtP54tio2RyHz7PwK0aw=
89+
golang.org/x/term v0.32.0 h1:DR4lr0TjUs3epypdhTOkMmuF5CDFJ/8pOnbzMZPQ7bg=
90+
golang.org/x/term v0.32.0/go.mod h1:uZG1FhGx848Sqfsq4/DlJr3xGGsYMu/L5GW4abiaEPQ=
3291
golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
92+
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg=
3393
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk=
94+
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
3495
google.golang.org/genproto/googleapis/api v0.0.0-20250324211829-b45e905df463/go.mod h1:U90ffi8eUL9MwPcrJylN5+Mk2v3vuPDptd5yyNUiRR8=
96+
google.golang.org/genproto/googleapis/api v0.0.0-20250528174236-200df99c418a h1:SGktgSolFCo75dnHJF2yMvnns6jCmHFJ0vE4Vn2JKvQ=
97+
google.golang.org/genproto/googleapis/api v0.0.0-20250528174236-200df99c418a/go.mod h1:a77HrdMjoeKbnd2jmgcWdaS++ZLZAEq3orIOAEIKiVw=
98+
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
99+
gopkg.in/errgo.v2 v2.1.0 h1:0vLT13EuvQ0hNvakwLuFZ/jYrLp5F3kcWHXdRggjCE8=
100+
gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec h1:RlWgLqCMMIYYEVcAR5MDsuHlVkaIPDAF+5Dehzg8L5A=
101+
gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
102+
honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM=

0 commit comments

Comments
 (0)