From 8ee1b449f93ab81f93a3566a5ef454b9901ae9c0 Mon Sep 17 00:00:00 2001 From: Alfred Kamanda Date: Tue, 21 Oct 2025 15:47:16 +0300 Subject: [PATCH 1/7] use the updated sarafu-api package with error codes --- go.mod | 2 +- go.sum | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 1ce7f3c..a562ebd 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.23.4 require ( git.defalsify.org/vise.git v0.3.2-0.20250528124150-03bf7bfc1b66 git.grassecon.net/grassrootseconomics/common v0.9.0-beta.1.0.20250417111317-2953f4c2f32e - git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250630214912-814bef2b209a + git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20251021120522-6f7802b58cf5 git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.2.0.20250408094335-e2d1f65bb306 git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250129070628-5a539172c694 github.com/alecthomas/assert/v2 v2.2.2 diff --git a/go.sum b/go.sum index c369628..66d0b3e 100644 --- a/go.sum +++ b/go.sum @@ -20,6 +20,8 @@ git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250630213606- git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250630213606-12940bb5f284/go.mod h1:y/vsN8UO0wSxZk3gv0y5df4RPKMJI6TIxjVcVCPF8T8= git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250630214912-814bef2b209a h1:KuhJ/WY4RCGmrXUA680ciaponM4vM5zBOJfnCpUo2fc= git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250630214912-814bef2b209a/go.mod h1:y/vsN8UO0wSxZk3gv0y5df4RPKMJI6TIxjVcVCPF8T8= +git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20251021120522-6f7802b58cf5 h1:bQglHVxMilciZ9M2PGuLgA+Wkvqo8OqQh6TFYwjtuSE= +git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20251021120522-6f7802b58cf5/go.mod h1:y/vsN8UO0wSxZk3gv0y5df4RPKMJI6TIxjVcVCPF8T8= git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.2.0.20250408094335-e2d1f65bb306 h1:Jo+yWysWw/N5BJQtAyEMN8ePVvAyPHv+JG4lQti+1N4= git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.2.0.20250408094335-e2d1f65bb306/go.mod h1:FdLwYtzsjOIcDiW4uDgDYnB4Wdzq12uJUe0QHSSPbSo= git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250129070628-5a539172c694 h1:DjJlBSz0S13acft5XZDWk7ZYnzElym0xLMYEVgyNJ+E= From 20b426935837a70f7b6144fa7eea3180ae0d4920 Mon Sep 17 00:00:00 2001 From: Alfred Kamanda Date: Tue, 21 Oct 2025 15:47:39 +0300 Subject: [PATCH 2/7] add a custom error struct that carries both fields from the API error --- handlers/application/menuhandler.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/handlers/application/menuhandler.go b/handlers/application/menuhandler.go index 4c7b4ec..f2e7fc1 100644 --- a/handlers/application/menuhandler.go +++ b/handlers/application/menuhandler.go @@ -28,6 +28,19 @@ var ( translationDir = path.Join(scriptDir, "locale") ) +// custom error struct that carries both fields from the API error +type APIError struct { + Code string + Description string +} + +func (e *APIError) Error() string { + if e.Code != "" { + return fmt.Sprintf("[%s] %s", e.Code, e.Description) + } + return e.Description +} + // TODO: this is only in use in testing, should be moved to test domain and/or replaced by asm.FlagParser // FlagManager handles centralized flag management type FlagManager struct { From 95bc5ec6affd52655d8b9231d18deb6af017a04b Mon Sep 17 00:00:00 2001 From: Alfred Kamanda Date: Tue, 21 Oct 2025 15:49:02 +0300 Subject: [PATCH 3/7] set a different response content based on the API error code --- handlers/application/send.go | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/handlers/application/send.go b/handlers/application/send.go index 3580288..5e75cbe 100644 --- a/handlers/application/send.go +++ b/handlers/application/send.go @@ -2,6 +2,7 @@ package application import ( "context" + "errors" "fmt" "strconv" "strings" @@ -357,9 +358,20 @@ func (h *MenuHandlers) InitiateTransaction(ctx context.Context, sym string, inpu // Call TokenTransfer r, err := h.accountService.TokenTransfer(ctx, finalAmountStr, data.PublicKey, data.Recipient, data.ActiveAddress) if err != nil { + var apiErr *APIError + if errors.As(err, &apiErr) { + switch apiErr.Code { + case "E10": + res.Content = l.Get("Only USD vouchers are allowed to mpesa.sarafu.eth.") + default: + res.Content = l.Get("Your request failed. Please try again later.") + } + } else { + res.Content = l.Get("An unexpected error occurred. Please try again later.") + } + flag_api_error, _ := h.flagManager.GetFlag("flag_api_call_error") res.FlagSet = append(res.FlagSet, flag_api_error) - res.Content = l.Get("Your request failed. Please try again later.") logg.ErrorCtxf(ctx, "failed on TokenTransfer", "error", err) return res, nil } From d5c2dc0ee0e68fdbd6ae0ef90a95ac66c7a2eb2b Mon Sep 17 00:00:00 2001 From: Alfred Kamanda Date: Tue, 21 Oct 2025 15:49:38 +0300 Subject: [PATCH 4/7] added the translation of the API error --- services/registration/locale/swa/default.po | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/services/registration/locale/swa/default.po b/services/registration/locale/swa/default.po index 235624a..bf9f39a 100644 --- a/services/registration/locale/swa/default.po +++ b/services/registration/locale/swa/default.po @@ -41,4 +41,7 @@ msgid "%s is not in %s. Please update your voucher and try again." msgstr "%s haipo kwenye %s. Tafadhali badilisha sarafu yako na ujaribu tena." msgid "Name: %s\nSymbol: %s" -msgstr "Jina: %s\nSarafu: %s" \ No newline at end of file +msgstr "Jina: %s\nSarafu: %s" + +msgid "Only USD vouchers are allowed to mpesa.sarafu.eth." +msgstr "Ni sarafu za USD pekee zinazoruhusiwa kwa mpesa.sarafu.eth." From bd98034a9b9f4a56d70a017145b51269b0225306 Mon Sep 17 00:00:00 2001 From: Alfred Kamanda Date: Tue, 21 Oct 2025 16:05:00 +0300 Subject: [PATCH 5/7] added debug line --- handlers/application/send.go | 1 + 1 file changed, 1 insertion(+) diff --git a/handlers/application/send.go b/handlers/application/send.go index 5e75cbe..55f87ff 100644 --- a/handlers/application/send.go +++ b/handlers/application/send.go @@ -359,6 +359,7 @@ func (h *MenuHandlers) InitiateTransaction(ctx context.Context, sym string, inpu r, err := h.accountService.TokenTransfer(ctx, finalAmountStr, data.PublicKey, data.Recipient, data.ActiveAddress) if err != nil { var apiErr *APIError + fmt.Printf("Error type: %T | Error value: %v\n", err, err) if errors.As(err, &apiErr) { switch apiErr.Code { case "E10": From 5b4446c04ac4182e0e5519b61313d4c96374b05e Mon Sep 17 00:00:00 2001 From: Alfred Kamanda Date: Wed, 22 Oct 2025 12:10:19 +0300 Subject: [PATCH 6/7] use the upstream APIError --- go.mod | 2 +- go.sum | 2 ++ handlers/application/menuhandler.go | 13 ------------- handlers/application/send.go | 3 ++- 4 files changed, 5 insertions(+), 15 deletions(-) diff --git a/go.mod b/go.mod index a562ebd..6b8984b 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.23.4 require ( git.defalsify.org/vise.git v0.3.2-0.20250528124150-03bf7bfc1b66 git.grassecon.net/grassrootseconomics/common v0.9.0-beta.1.0.20250417111317-2953f4c2f32e - git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20251021120522-6f7802b58cf5 + git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20251022084613-532547899f63 git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.2.0.20250408094335-e2d1f65bb306 git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250129070628-5a539172c694 github.com/alecthomas/assert/v2 v2.2.2 diff --git a/go.sum b/go.sum index 66d0b3e..e59d51f 100644 --- a/go.sum +++ b/go.sum @@ -22,6 +22,8 @@ git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250630214912- git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250630214912-814bef2b209a/go.mod h1:y/vsN8UO0wSxZk3gv0y5df4RPKMJI6TIxjVcVCPF8T8= git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20251021120522-6f7802b58cf5 h1:bQglHVxMilciZ9M2PGuLgA+Wkvqo8OqQh6TFYwjtuSE= git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20251021120522-6f7802b58cf5/go.mod h1:y/vsN8UO0wSxZk3gv0y5df4RPKMJI6TIxjVcVCPF8T8= +git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20251022084613-532547899f63 h1:yznaUXeAy+qiZb2nCxosYXE5HyCPpynIoplEuYV/zQM= +git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20251022084613-532547899f63/go.mod h1:y/vsN8UO0wSxZk3gv0y5df4RPKMJI6TIxjVcVCPF8T8= git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.2.0.20250408094335-e2d1f65bb306 h1:Jo+yWysWw/N5BJQtAyEMN8ePVvAyPHv+JG4lQti+1N4= git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.2.0.20250408094335-e2d1f65bb306/go.mod h1:FdLwYtzsjOIcDiW4uDgDYnB4Wdzq12uJUe0QHSSPbSo= git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250129070628-5a539172c694 h1:DjJlBSz0S13acft5XZDWk7ZYnzElym0xLMYEVgyNJ+E= diff --git a/handlers/application/menuhandler.go b/handlers/application/menuhandler.go index f2e7fc1..4c7b4ec 100644 --- a/handlers/application/menuhandler.go +++ b/handlers/application/menuhandler.go @@ -28,19 +28,6 @@ var ( translationDir = path.Join(scriptDir, "locale") ) -// custom error struct that carries both fields from the API error -type APIError struct { - Code string - Description string -} - -func (e *APIError) Error() string { - if e.Code != "" { - return fmt.Sprintf("[%s] %s", e.Code, e.Description) - } - return e.Description -} - // TODO: this is only in use in testing, should be moved to test domain and/or replaced by asm.FlagParser // FlagManager handles centralized flag management type FlagManager struct { diff --git a/handlers/application/send.go b/handlers/application/send.go index 55f87ff..cc45516 100644 --- a/handlers/application/send.go +++ b/handlers/application/send.go @@ -17,6 +17,7 @@ import ( storedb "git.grassecon.net/grassrootseconomics/sarafu-vise/store/db" "github.com/grassrootseconomics/ethutils" "gopkg.in/leonelquinteros/gotext.v1" + "git.grassecon.net/grassrootseconomics/sarafu-api/remote/http" ) // ValidateRecipient validates that the given input is valid. @@ -358,7 +359,7 @@ func (h *MenuHandlers) InitiateTransaction(ctx context.Context, sym string, inpu // Call TokenTransfer r, err := h.accountService.TokenTransfer(ctx, finalAmountStr, data.PublicKey, data.Recipient, data.ActiveAddress) if err != nil { - var apiErr *APIError + var apiErr *http.APIError fmt.Printf("Error type: %T | Error value: %v\n", err, err) if errors.As(err, &apiErr) { switch apiErr.Code { From 1ba5424e0b2c2ef55226a541bb7ef5ad6c764821 Mon Sep 17 00:00:00 2001 From: Alfred Kamanda Date: Wed, 22 Oct 2025 12:20:41 +0300 Subject: [PATCH 7/7] cleaned up the code and removed the debug statement --- handlers/application/send.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/handlers/application/send.go b/handlers/application/send.go index cc45516..ddddebd 100644 --- a/handlers/application/send.go +++ b/handlers/application/send.go @@ -12,12 +12,12 @@ import ( "git.grassecon.net/grassrootseconomics/common/identity" "git.grassecon.net/grassrootseconomics/common/phone" "git.grassecon.net/grassrootseconomics/sarafu-api/models" + "git.grassecon.net/grassrootseconomics/sarafu-api/remote/http" "git.grassecon.net/grassrootseconomics/sarafu-vise/config" "git.grassecon.net/grassrootseconomics/sarafu-vise/store" storedb "git.grassecon.net/grassrootseconomics/sarafu-vise/store/db" "github.com/grassrootseconomics/ethutils" "gopkg.in/leonelquinteros/gotext.v1" - "git.grassecon.net/grassrootseconomics/sarafu-api/remote/http" ) // ValidateRecipient validates that the given input is valid. @@ -360,7 +360,6 @@ func (h *MenuHandlers) InitiateTransaction(ctx context.Context, sym string, inpu r, err := h.accountService.TokenTransfer(ctx, finalAmountStr, data.PublicKey, data.Recipient, data.ActiveAddress) if err != nil { var apiErr *http.APIError - fmt.Printf("Error type: %T | Error value: %v\n", err, err) if errors.As(err, &apiErr) { switch apiErr.Code { case "E10":