From 72340bf0293a7a4832d8f9032f4a5516eaff6add Mon Sep 17 00:00:00 2001 From: Aristides Staffieri Date: Thu, 23 Jan 2025 09:49:46 -0700 Subject: [PATCH 1/9] updates GetTransaction to return a TSSResponse --- internal/serve/httphandler/tss_handler.go | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/internal/serve/httphandler/tss_handler.go b/internal/serve/httphandler/tss_handler.go index 13c9b34..b602618 100644 --- a/internal/serve/httphandler/tss_handler.go +++ b/internal/serve/httphandler/tss_handler.go @@ -1,6 +1,7 @@ package httphandler import ( + "fmt" "net/http" "github.com/stellar/go/support/log" @@ -155,9 +156,18 @@ func (t *TSSHandler) GetTransaction(w http.ResponseWriter, r *http.Request) { httperror.NotFound.Render(w) } - httpjson.Render(w, GetTransactionResponse{ - Hash: tx.Hash, - XDR: tx.XDR, - Status: tx.Status, + tssTry, err := t.Store.GetTry(ctx, tx.Hash) + if err != nil { + httperror.InternalServerError(ctx, "unable to get tx try "+tx.Hash, err, nil, t.AppTracker).Render(w) + return + } + + httpjson.Render(w, tss.TSSResponse{ + TransactionHash: tx.Hash, + TransactionResultCode: fmt.Sprint(tssTry.Code), + Status: tx.Status, + CreatedAt: tx.CreatedAt.Unix(), + EnvelopeXDR: tssTry.XDR, + ResultXDR: tssTry.ResultXDR, }, httpjson.JSON) } From c1c8f519b2eb3f1669c331f702d68f6068c63bdd Mon Sep 17 00:00:00 2001 From: Aristides Staffieri Date: Thu, 23 Jan 2025 09:53:00 -0700 Subject: [PATCH 2/9] updates GetTransaction test for new response type --- internal/serve/httphandler/tss_handler_test.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/internal/serve/httphandler/tss_handler_test.go b/internal/serve/httphandler/tss_handler_test.go index 3cecd68..bc60a56 100644 --- a/internal/serve/httphandler/tss_handler_test.go +++ b/internal/serve/httphandler/tss_handler_test.go @@ -268,12 +268,12 @@ func TestGetTransaction(t *testing.T) { resp := rw.Result() respBody, err := io.ReadAll(resp.Body) require.NoError(t, err) - var getTxResp GetTransactionResponse + var getTxResp tss.TSSResponse _ = json.Unmarshal(respBody, &getTxResp) assert.Equal(t, http.StatusOK, resp.StatusCode) - assert.Equal(t, "hash", getTxResp.Hash) - assert.Equal(t, "xdr", getTxResp.XDR) + assert.Equal(t, "hash", getTxResp.TransactionHash) + assert.Equal(t, "xdr", getTxResp.EnvelopeXDR) assert.Equal(t, "NEW", getTxResp.Status) clearTransactions(ctx) @@ -290,12 +290,12 @@ func TestGetTransaction(t *testing.T) { resp := rw.Result() respBody, err := io.ReadAll(resp.Body) require.NoError(t, err) - var getTxResp GetTransactionResponse + var getTxResp tss.TSSResponse _ = json.Unmarshal(respBody, &getTxResp) assert.Equal(t, http.StatusNotFound, resp.StatusCode) - assert.Empty(t, getTxResp.Hash) - assert.Empty(t, getTxResp.XDR) + assert.Empty(t, getTxResp.TransactionHash) + assert.Empty(t, getTxResp.EnvelopeXDR) assert.Empty(t, getTxResp.Status) }) From db15d23465d0bc2db434671f8d76e0ac8420b02d Mon Sep 17 00:00:00 2001 From: Aristides Staffieri Date: Thu, 23 Jan 2025 14:28:05 -0700 Subject: [PATCH 3/9] uses GetTryLatest instead of GetTry to get most recent timestamp for hash, updates test --- internal/serve/httphandler/tss_handler.go | 2 +- internal/serve/httphandler/tss_handler_test.go | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/internal/serve/httphandler/tss_handler.go b/internal/serve/httphandler/tss_handler.go index b602618..fe5a491 100644 --- a/internal/serve/httphandler/tss_handler.go +++ b/internal/serve/httphandler/tss_handler.go @@ -156,7 +156,7 @@ func (t *TSSHandler) GetTransaction(w http.ResponseWriter, r *http.Request) { httperror.NotFound.Render(w) } - tssTry, err := t.Store.GetTry(ctx, tx.Hash) + tssTry, err := t.Store.GetLatestTry(ctx, tx.Hash) if err != nil { httperror.InternalServerError(ctx, "unable to get tx try "+tx.Hash, err, nil, t.AppTracker).Render(w) return diff --git a/internal/serve/httphandler/tss_handler_test.go b/internal/serve/httphandler/tss_handler_test.go index bc60a56..a8e8bf3 100644 --- a/internal/serve/httphandler/tss_handler_test.go +++ b/internal/serve/httphandler/tss_handler_test.go @@ -270,10 +270,11 @@ func TestGetTransaction(t *testing.T) { require.NoError(t, err) var getTxResp tss.TSSResponse _ = json.Unmarshal(respBody, &getTxResp) + fmt.Printf("%+v\n", getTxResp) assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, "hash", getTxResp.TransactionHash) - assert.Equal(t, "xdr", getTxResp.EnvelopeXDR) + assert.Equal(t, "0", getTxResp.TransactionResultCode) assert.Equal(t, "NEW", getTxResp.Status) clearTransactions(ctx) From 9d995b45a56b8b9e5f8fb040269c84cb6ca52182 Mon Sep 17 00:00:00 2001 From: Aristides Staffieri Date: Thu, 23 Jan 2025 14:28:28 -0700 Subject: [PATCH 4/9] tweaks readme docker command to match new syntax --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 133981b..a0d1842 100644 --- a/README.md +++ b/README.md @@ -64,7 +64,7 @@ you can set it to any value. For production, you should set it to a secure passp 3. Start the containers: ```bash -docker-compose up +docker compose up ``` If things are set up correctly, you will see 4 containers started under the wallet-backend docker service: `api`, `db`, From 71dd0315064888d82e67146b055ca0a49b9cc9c5 Mon Sep 17 00:00:00 2001 From: Aristides Staffieri Date: Fri, 24 Jan 2025 12:05:17 -0700 Subject: [PATCH 5/9] uses correct created at date from Try instead of from tx --- internal/serve/httphandler/tss_handler.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/serve/httphandler/tss_handler.go b/internal/serve/httphandler/tss_handler.go index fe5a491..7d4d234 100644 --- a/internal/serve/httphandler/tss_handler.go +++ b/internal/serve/httphandler/tss_handler.go @@ -166,7 +166,7 @@ func (t *TSSHandler) GetTransaction(w http.ResponseWriter, r *http.Request) { TransactionHash: tx.Hash, TransactionResultCode: fmt.Sprint(tssTry.Code), Status: tx.Status, - CreatedAt: tx.CreatedAt.Unix(), + CreatedAt: tssTry.CreatedAt.Unix(), EnvelopeXDR: tssTry.XDR, ResultXDR: tssTry.ResultXDR, }, httpjson.JSON) From 73a9b82ef79ea1c888c3ac93fcf21f8b9b8ffa4f Mon Sep 17 00:00:00 2001 From: Aristides Staffieri Date: Fri, 24 Jan 2025 12:05:46 -0700 Subject: [PATCH 6/9] removes stray debug log left in test --- internal/serve/httphandler/tss_handler_test.go | 1 - 1 file changed, 1 deletion(-) diff --git a/internal/serve/httphandler/tss_handler_test.go b/internal/serve/httphandler/tss_handler_test.go index a8e8bf3..ff73c7a 100644 --- a/internal/serve/httphandler/tss_handler_test.go +++ b/internal/serve/httphandler/tss_handler_test.go @@ -270,7 +270,6 @@ func TestGetTransaction(t *testing.T) { require.NoError(t, err) var getTxResp tss.TSSResponse _ = json.Unmarshal(respBody, &getTxResp) - fmt.Printf("%+v\n", getTxResp) assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, "hash", getTxResp.TransactionHash) From 3177c18dc88032c32c5fc21d0b99230248077203 Mon Sep 17 00:00:00 2001 From: Aristides Staffieri Date: Fri, 24 Jan 2025 12:06:33 -0700 Subject: [PATCH 7/9] renames var to better describe response type --- .../serve/httphandler/tss_handler_test.go | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/internal/serve/httphandler/tss_handler_test.go b/internal/serve/httphandler/tss_handler_test.go index ff73c7a..bb5a8d7 100644 --- a/internal/serve/httphandler/tss_handler_test.go +++ b/internal/serve/httphandler/tss_handler_test.go @@ -268,13 +268,14 @@ func TestGetTransaction(t *testing.T) { resp := rw.Result() respBody, err := io.ReadAll(resp.Body) require.NoError(t, err) - var getTxResp tss.TSSResponse - _ = json.Unmarshal(respBody, &getTxResp) + var tssResp tss.TSSResponse + _ = json.Unmarshal(respBody, &tssResp) + fmt.Printf("%+v\n", tssResp) assert.Equal(t, http.StatusOK, resp.StatusCode) - assert.Equal(t, "hash", getTxResp.TransactionHash) - assert.Equal(t, "0", getTxResp.TransactionResultCode) - assert.Equal(t, "NEW", getTxResp.Status) + assert.Equal(t, "hash", tssResp.TransactionHash) + assert.Equal(t, "0", tssResp.TransactionResultCode) + assert.Equal(t, "NEW", tssResp.Status) clearTransactions(ctx) }) @@ -290,13 +291,13 @@ func TestGetTransaction(t *testing.T) { resp := rw.Result() respBody, err := io.ReadAll(resp.Body) require.NoError(t, err) - var getTxResp tss.TSSResponse - _ = json.Unmarshal(respBody, &getTxResp) + var tssResp tss.TSSResponse + _ = json.Unmarshal(respBody, &tssResp) assert.Equal(t, http.StatusNotFound, resp.StatusCode) - assert.Empty(t, getTxResp.TransactionHash) - assert.Empty(t, getTxResp.EnvelopeXDR) - assert.Empty(t, getTxResp.Status) + assert.Empty(t, tssResp.TransactionHash) + assert.Empty(t, tssResp.EnvelopeXDR) + assert.Empty(t, tssResp.Status) }) From 1c80ae8d2f8bf2c909a54eab52d8bfe33ac21e34 Mon Sep 17 00:00:00 2001 From: Aristides Staffieri Date: Fri, 24 Jan 2025 12:28:55 -0700 Subject: [PATCH 8/9] adds a try for the test transaction, asserts on result xdr from try --- internal/serve/httphandler/tss_handler_test.go | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/internal/serve/httphandler/tss_handler_test.go b/internal/serve/httphandler/tss_handler_test.go index bb5a8d7..83aee6e 100644 --- a/internal/serve/httphandler/tss_handler_test.go +++ b/internal/serve/httphandler/tss_handler_test.go @@ -257,8 +257,10 @@ func TestGetTransaction(t *testing.T) { t.Run("returns_transaction", func(t *testing.T) { txHash := "hash" + resultXdr := "resultXdr" ctx := context.Background() _ = store.UpsertTransaction(ctx, "localhost:8080/webhook", txHash, "xdr", tss.RPCTXStatus{OtherStatus: tss.NewStatus}) + _ = store.UpsertTry(ctx, txHash, "feebumphash", "feebumpxdr", tss.RPCTXStatus{OtherStatus: tss.NewStatus}, tss.RPCTXCode{OtherCodes: tss.NewCode}, resultXdr) req, err := http.NewRequest(http.MethodGet, path.Join(endpoint, txHash), nil) require.NoError(t, err) @@ -270,12 +272,12 @@ func TestGetTransaction(t *testing.T) { require.NoError(t, err) var tssResp tss.TSSResponse _ = json.Unmarshal(respBody, &tssResp) - fmt.Printf("%+v\n", tssResp) assert.Equal(t, http.StatusOK, resp.StatusCode) - assert.Equal(t, "hash", tssResp.TransactionHash) - assert.Equal(t, "0", tssResp.TransactionResultCode) - assert.Equal(t, "NEW", tssResp.Status) + assert.Equal(t, txHash, tssResp.TransactionHash) + assert.Equal(t, fmt.Sprint(tss.NewCode), tssResp.TransactionResultCode) + assert.Equal(t, fmt.Sprint(tss.NewStatus), tssResp.Status) + assert.Equal(t, resultXdr, tssResp.ResultXDR) clearTransactions(ctx) }) From 7d2d1c0b21d2df908d377247bed0ba835ab43231 Mon Sep 17 00:00:00 2001 From: Aristides Staffieri Date: Fri, 24 Jan 2025 12:31:00 -0700 Subject: [PATCH 9/9] adds unit test for empty result from latest try for transaction --- .../serve/httphandler/tss_handler_test.go | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/internal/serve/httphandler/tss_handler_test.go b/internal/serve/httphandler/tss_handler_test.go index 83aee6e..5453871 100644 --- a/internal/serve/httphandler/tss_handler_test.go +++ b/internal/serve/httphandler/tss_handler_test.go @@ -255,6 +255,32 @@ func TestGetTransaction(t *testing.T) { require.NoError(t, err) } + t.Run("returns_empty_try", func(t *testing.T) { + txHash := "hash" + ctx := context.Background() + _ = store.UpsertTransaction(ctx, "localhost:8080/webhook", txHash, "xdr", tss.RPCTXStatus{OtherStatus: tss.NewStatus}) + req, err := http.NewRequest(http.MethodGet, path.Join(endpoint, txHash), nil) + require.NoError(t, err) + + // Serve request + rw := httptest.NewRecorder() + r.ServeHTTP(rw, req) + resp := rw.Result() + respBody, err := io.ReadAll(resp.Body) + require.NoError(t, err) + var tssResp tss.TSSResponse + _ = json.Unmarshal(respBody, &tssResp) + + assert.Equal(t, http.StatusOK, resp.StatusCode) + assert.Equal(t, txHash, tssResp.TransactionHash) + assert.Equal(t, fmt.Sprint(tss.NoCode), tssResp.TransactionResultCode) + assert.Equal(t, fmt.Sprint(tss.NewStatus), tssResp.Status) + assert.Equal(t, "", tssResp.ResultXDR) + assert.Equal(t, "", tssResp.EnvelopeXDR) + + clearTransactions(ctx) + }) + t.Run("returns_transaction", func(t *testing.T) { txHash := "hash" resultXdr := "resultXdr"