From 52139cb4499a1d23f160305487f4918955064347 Mon Sep 17 00:00:00 2001 From: Marcus Pasell <3690498+rickyrombo@users.noreply.github.com> Date: Thu, 10 Apr 2025 17:39:44 -0700 Subject: [PATCH] Add connected wallets endpoint --- api/dbv1/full_connected_wallets.go | 27 +++++++++++++ api/dbv1/get_connected_wallets.sql.go | 43 +++++++++++++++++++++ api/dbv1/queries/get_connected_wallets.sql | 6 +++ api/fixture_test.go | 11 ++++++ api/server.go | 1 + api/server_test.go | 1 + api/testdata/connected_wallets_fixtures.csv | 10 +++++ api/v1_users_connected_wallets.go | 18 +++++++++ api/v1_users_connected_wallets_test.go | 29 ++++++++++++++ static/apidiff.html | 1 + 10 files changed, 147 insertions(+) create mode 100644 api/dbv1/full_connected_wallets.go create mode 100644 api/dbv1/get_connected_wallets.sql.go create mode 100644 api/dbv1/queries/get_connected_wallets.sql create mode 100644 api/testdata/connected_wallets_fixtures.csv create mode 100644 api/v1_users_connected_wallets.go create mode 100644 api/v1_users_connected_wallets_test.go diff --git a/api/dbv1/full_connected_wallets.go b/api/dbv1/full_connected_wallets.go new file mode 100644 index 00000000..1e15f349 --- /dev/null +++ b/api/dbv1/full_connected_wallets.go @@ -0,0 +1,27 @@ +package dbv1 + +import "context" + +type FullConnectedWallets struct { + ErcWallets []string `json:"erc_wallets"` + SplWallets []string `json:"spl_wallets"` +} + +func (q *Queries) FullConnectedWallets(ctx context.Context, userId int32) (*FullConnectedWallets, error) { + rows, err := q.GetUserConnectedWallets(ctx, userId) + if err != nil { + return nil, err + } + + fullConnectedWallets := FullConnectedWallets{} + for _, row := range rows { + if row.Chain == WalletChainEth { + fullConnectedWallets.ErcWallets = append(fullConnectedWallets.ErcWallets, row.Wallet) + } + if row.Chain == WalletChainSol { + fullConnectedWallets.SplWallets = append(fullConnectedWallets.SplWallets, row.Wallet) + } + } + + return &fullConnectedWallets, nil +} diff --git a/api/dbv1/get_connected_wallets.sql.go b/api/dbv1/get_connected_wallets.sql.go new file mode 100644 index 00000000..0ab4ef9c --- /dev/null +++ b/api/dbv1/get_connected_wallets.sql.go @@ -0,0 +1,43 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.28.0 +// source: get_connected_wallets.sql + +package dbv1 + +import ( + "context" +) + +const getUserConnectedWallets = `-- name: GetUserConnectedWallets :many +SELECT chain, wallet +FROM associated_wallets +WHERE is_current = true + AND is_delete = false + AND user_id = $1 +` + +type GetUserConnectedWalletsRow struct { + Chain WalletChain `json:"chain"` + Wallet string `json:"wallet"` +} + +func (q *Queries) GetUserConnectedWallets(ctx context.Context, userID int32) ([]GetUserConnectedWalletsRow, error) { + rows, err := q.db.Query(ctx, getUserConnectedWallets, userID) + if err != nil { + return nil, err + } + defer rows.Close() + var items []GetUserConnectedWalletsRow + for rows.Next() { + var i GetUserConnectedWalletsRow + if err := rows.Scan(&i.Chain, &i.Wallet); err != nil { + return nil, err + } + items = append(items, i) + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} diff --git a/api/dbv1/queries/get_connected_wallets.sql b/api/dbv1/queries/get_connected_wallets.sql new file mode 100644 index 00000000..c48ef212 --- /dev/null +++ b/api/dbv1/queries/get_connected_wallets.sql @@ -0,0 +1,6 @@ +-- name: GetUserConnectedWallets :many +SELECT chain, wallet +FROM associated_wallets +WHERE is_current = true + AND is_delete = false + AND user_id = @user_id; \ No newline at end of file diff --git a/api/fixture_test.go b/api/fixture_test.go index db3a821c..e6551232 100644 --- a/api/fixture_test.go +++ b/api/fixture_test.go @@ -105,6 +105,17 @@ var ( "updated_at": time.Now(), "image_url": nil, } + + connectedWalletsBaseRow = map[string]any{ + "id": nil, + "user_id": nil, + "wallet": nil, + "blockhash": "block_abc123", + "blocknumber": 101, + "is_current": true, + "is_delete": false, + "chain": nil, + } ) func insertFixtures(table string, baseRow map[string]any, csvFile string) { diff --git a/api/server.go b/api/server.go index 25a191c3..8332dfe0 100644 --- a/api/server.go +++ b/api/server.go @@ -141,6 +141,7 @@ func NewApiServer(config Config) *ApiServer { g.Get("/users/:userId/supporting", app.v1UsersSupporting) g.Get("/users/:userId/tracks", app.v1UserTracks) g.Get("/users/:userId/feed", app.v1UsersFeed) + g.Get("/users/:userId/connected_wallets", app.v1UsersConnectedWallets) // Tracks g.Get("/tracks", app.v1Tracks) diff --git a/api/server_test.go b/api/server_test.go index 9c04fb49..7794bde2 100644 --- a/api/server_test.go +++ b/api/server_test.go @@ -67,6 +67,7 @@ func TestMain(m *testing.M) { insertFixtures("follows", followBaseRow, "testdata/follow_fixtures.csv") insertFixtures("reposts", repostBaseRow, "testdata/repost_fixtures.csv") insertFixtures("developer_apps", developerAppBaseRow, "testdata/developer_app_fixtures.csv") + insertFixtures("associated_wallets", connectedWalletsBaseRow, "testdata/connected_wallets_fixtures.csv") // index to es / os diff --git a/api/testdata/connected_wallets_fixtures.csv b/api/testdata/connected_wallets_fixtures.csv new file mode 100644 index 00000000..892e7443 --- /dev/null +++ b/api/testdata/connected_wallets_fixtures.csv @@ -0,0 +1,10 @@ +"id","user_id","wallet","blockhash","blocknumber","is_current","is_delete","chain" +2338,1,"sol11111111111111111111111111111111111111111","",101,TRUE,FALSE,"sol" +2344,1,"sol22222222222222222222222222222222222222222","",101,TRUE,FALSE,"sol" +2339,2,"sol33333333333333333333333333333333333333333","",101,TRUE,TRUE,"sol" +2476,2,"0x1111111111111111111111111111111111111111","",101,TRUE,FALSE,"eth" +2475,2,"0x2222222222222222222222222222222222222222","",101,TRUE,FALSE,"eth" +2487,2,"0x3333333333333333333333333333333333333333","",101,TRUE,TRUE,"eth" +2483,2,"sol44444444444444444444444444444444444444444","",101,TRUE,FALSE,"sol" +2484,2,"sol55555555555555555555555555555555555555555","",101,TRUE,FALSE,"sol" +2485,3,"0x4444444444444444444444444444444444444444","",101,TRUE,FALSE,"eth" diff --git a/api/v1_users_connected_wallets.go b/api/v1_users_connected_wallets.go new file mode 100644 index 00000000..82ebbc9d --- /dev/null +++ b/api/v1_users_connected_wallets.go @@ -0,0 +1,18 @@ +package api + +import ( + "github.com/gofiber/fiber/v2" +) + +func (app *ApiServer) v1UsersConnectedWallets(c *fiber.Ctx) error { + userId := c.Locals("userId").(int) + + wallets, err := app.queries.FullConnectedWallets(c.Context(), int32(userId)) + if err != nil { + return err + } + + return c.JSON(fiber.Map{ + "data": wallets, + }) +} diff --git a/api/v1_users_connected_wallets_test.go b/api/v1_users_connected_wallets_test.go new file mode 100644 index 00000000..446b3ffa --- /dev/null +++ b/api/v1_users_connected_wallets_test.go @@ -0,0 +1,29 @@ +package api + +import ( + "strings" + "testing" + + "bridgerton.audius.co/trashid" + "github.com/stretchr/testify/assert" +) + +func TestGetUserConnectedWalletsQuery(t *testing.T) { + connectedWallets, err := app.queries.FullConnectedWallets(t.Context(), 2) + assert.NoError(t, err) + assert.Len(t, connectedWallets.ErcWallets, 2) + assert.Len(t, connectedWallets.SplWallets, 2) + assert.Contains(t, connectedWallets.ErcWallets, "0x1111111111111111111111111111111111111111") + assert.Contains(t, connectedWallets.ErcWallets, "0x2222222222222222222222222222222222222222") + assert.NotContains(t, connectedWallets.ErcWallets, "0x3333333333333333333333333333333333333333") + assert.NotContains(t, connectedWallets.SplWallets, "sol33333333333333333333333333333333333333333") + assert.Contains(t, connectedWallets.SplWallets, "sol44444444444444444444444444444444444444444") + assert.Contains(t, connectedWallets.SplWallets, "sol55555555555555555555555555555555555555555") +} + +func TestGetUserConnectedWallets(t *testing.T) { + status, body := testGet(t, "/v1/users/"+trashid.MustEncodeHashID(2)+"/connected_wallets") + assert.Equal(t, 200, status) + assert.True(t, strings.Contains(string(body), `spl_wallets`)) + assert.True(t, strings.Contains(string(body), `erc_wallets`)) +} diff --git a/static/apidiff.html b/static/apidiff.html index 30ed1c8d..f372bb92 100644 --- a/static/apidiff.html +++ b/static/apidiff.html @@ -27,6 +27,7 @@