From cea920c1f506df053343a071e64dd94241f6ffff Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Thu, 17 Apr 2025 23:30:54 +0300 Subject: [PATCH 1/9] dep: upgrade sarafu-api dep to include address and pin reset sms --- go.mod | 2 +- go.sum | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 7e6025c..490fc8d 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.20250401123711-d481b04a6805 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.20250411080608-34957e5b6ff8 + git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250417201442-5c0ed48e678c git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.2 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 9e24620..98ae1c9 100644 --- a/go.sum +++ b/go.sum @@ -16,6 +16,14 @@ git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250401122510- git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250401122510-441e289854ad/go.mod h1:gOn89ipaDcDvmQXRMQYKUqcw/sJcwVOPVt2eC6Geip8= git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250411080608-34957e5b6ff8 h1:Emesd0rybSLhPwZwqdvLsk/P9ZsT+7CQwQV/mrjQp3o= git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250411080608-34957e5b6ff8/go.mod h1:gOn89ipaDcDvmQXRMQYKUqcw/sJcwVOPVt2eC6Geip8= +git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250417155812-58366274c3e1 h1:Yt9S+9JtCB4Y6jw6Xo1WGoVVu591n3/tSRIwM3kw1uY= +git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250417155812-58366274c3e1/go.mod h1:gOn89ipaDcDvmQXRMQYKUqcw/sJcwVOPVt2eC6Geip8= +git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250417191830-86cfb9c02028 h1:HuIL9BClNieD7QCikCW1sJ9HyIo9iqRDFqULJGHxbrM= +git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250417191830-86cfb9c02028/go.mod h1:gOn89ipaDcDvmQXRMQYKUqcw/sJcwVOPVt2eC6Geip8= +git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250417200733-5ff139b6494b h1:0Ldq9SKqu+oNljNaKpQFyUgl3cOi6LJulGZwf5vXuWo= +git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250417200733-5ff139b6494b/go.mod h1:gOn89ipaDcDvmQXRMQYKUqcw/sJcwVOPVt2eC6Geip8= +git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250417201442-5c0ed48e678c h1:fO8NGQ/sLdwpbi3UWzZZxqOXGrEzMVXyxER5ziGuZLI= +git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250417201442-5c0ed48e678c/go.mod h1:gOn89ipaDcDvmQXRMQYKUqcw/sJcwVOPVt2eC6Geip8= git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.2 h1:YFztSsexCUgFo6M0tbngRwYdgJd3LQV3RO/Jw09u3+k= git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.2/go.mod h1:6B6ByxXOiRY0NR7K02Bf3fEu7z+2c/6q8PFVNjC5G8w= git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250129070628-5a539172c694 h1:DjJlBSz0S13acft5XZDWk7ZYnzElym0xLMYEVgyNJ+E= From 08deeca500ca4b47bbf3be1be8337c6ef856137c Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Thu, 17 Apr 2025 23:31:22 +0300 Subject: [PATCH 2/9] register handler to trigger address sms --- handlers/local.go | 1 + 1 file changed, 1 insertion(+) diff --git a/handlers/local.go b/handlers/local.go index 6f4963f..870a50e 100644 --- a/handlers/local.go +++ b/handlers/local.go @@ -124,6 +124,7 @@ func (ls *LocalHandlerService) GetHandler(accountService remote.AccountService) ls.DbRs.AddLocalFunc("get_suggested_alias", appHandlers.GetSuggestedAlias) ls.DbRs.AddLocalFunc("confirm_new_alias", appHandlers.ConfirmNewAlias) ls.DbRs.AddLocalFunc("check_account_created", appHandlers.CheckAccountCreated) + ls.DbRs.AddLocalFunc("send_address_sms", appHandlers.SendAddressSMS) ls.first = appHandlers.Init From 5ff2e794ff98e1c1802ec4a3d3efb7082e7065ec Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Thu, 17 Apr 2025 23:31:48 +0300 Subject: [PATCH 3/9] feat: implement address and pin reset sms --- handlers/application/menuhandler.go | 70 ++++++++++++++++++++++++++++- 1 file changed, 69 insertions(+), 1 deletion(-) diff --git a/handlers/application/menuhandler.go b/handlers/application/menuhandler.go index 615f500..03631ad 100644 --- a/handlers/application/menuhandler.go +++ b/handlers/application/menuhandler.go @@ -524,7 +524,15 @@ func (h *MenuHandlers) ResetOthersPin(ctx context.Context, sym string, input []b logg.ErrorCtxf(ctx, "failed to reset incorrect PIN attempts", "key", storedb.DATA_INCORRECT_PIN_ATTEMPTS, "error", err) return res, err } - + blockedPhoneStr := string(blockedPhonenumber) + //Trigger an SMS to inform a user that the blocked account has been reset + if phone.IsValidPhoneNumber(blockedPhoneStr) { + err = h.sendPINResetSMS(ctx, sessionId, blockedPhoneStr) + if err != nil { + logg.DebugCtxf(ctx, "Failed to send PIN reset SMS", "error", err) + return res, nil + } + } return res, nil } @@ -2491,3 +2499,63 @@ func (h *MenuHandlers) ClearTemporaryValue(ctx context.Context, sym string, inpu } return res, nil } + +// SendAddressSMS will triger an SMS when a user navigates to the my address node.The SMS will be sent to the associated phonenumber. +func (h *MenuHandlers) SendAddressSMS(ctx context.Context, sym string, input []byte) (resource.Result, error) { + var res resource.Result + store := h.userdataStore + + sessionId, ok := ctx.Value("SessionId").(string) + if !ok { + return res, fmt.Errorf("missing session") + } + + publicKey, err := store.ReadEntry(ctx, sessionId, storedb.DATA_PUBLIC_KEY) + if err != nil { + logg.ErrorCtxf(ctx, "failed to read publicKey entry with", "key", storedb.DATA_PUBLIC_KEY, "error", err) + return res, err + } + originPhone, err := phone.FormatPhoneNumber(sessionId) + if err != nil { + logg.DebugCtxf(ctx, "Failed to format origin phonenumber", "sessionid", sessionId) + return res, nil + } + + if !phone.IsValidPhoneNumber(originPhone) { + logg.InfoCtxf(ctx, "Invalid origin phone number", "sessionid:", sessionId) + return res, nil + } + err = h.accountService.SendAddressSMS(ctx, string(publicKey), sessionId) + if err != nil { + logg.DebugCtxf(ctx, "Failed to send address sms", "error", err) + return res, nil + } + return res, nil +} + +// sendPINResetSMS will send an SMS to a user's phonenumber in the event that the associated account's PIN has been reset. +func (h *MenuHandlers) sendPINResetSMS(ctx context.Context, adminPhoneNumber, blockedPhoneNumber string) error { + formattedAdminPhone, err := phone.FormatPhoneNumber(adminPhoneNumber) + if err != nil { + return fmt.Errorf("failed to format admin phone number: %w", err) + } + + formattedBlockedPhone, err := phone.FormatPhoneNumber(blockedPhoneNumber) + if err != nil { + return fmt.Errorf("failed to format blocked phone number: %w", err) + } + + if !phone.IsValidPhoneNumber(formattedAdminPhone) { + return fmt.Errorf("invalid admin phone number") + } + if !phone.IsValidPhoneNumber(formattedBlockedPhone) { + return fmt.Errorf("invalid blocked phone number") + } + + err = h.accountService.SendPINResetSMS(ctx, formattedAdminPhone, formattedBlockedPhone) + if err != nil { + return fmt.Errorf("failed to send pin reset sms: %v", err) + } + + return nil +} From 0274133d4892e5b766bc5767c89f7b5aad6f4647 Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Thu, 17 Apr 2025 23:32:05 +0300 Subject: [PATCH 4/9] add handler to send an address sms --- services/registration/address.vis | 1 + 1 file changed, 1 insertion(+) diff --git a/services/registration/address.vis b/services/registration/address.vis index dfc46d1..ba98b6b 100644 --- a/services/registration/address.vis +++ b/services/registration/address.vis @@ -1,3 +1,4 @@ +LOAD send_address_sms 16 LOAD check_identifier 0 RELOAD check_identifier MAP check_identifier From 7ea3cb6b5116105b3ef7bda1024c59d0e8be6332 Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Fri, 18 Apr 2025 10:54:23 +0300 Subject: [PATCH 5/9] remove reload for check identifier to prevent double address sms trigger --- services/registration/address.vis | 2 -- 1 file changed, 2 deletions(-) diff --git a/services/registration/address.vis b/services/registration/address.vis index ba98b6b..a078306 100644 --- a/services/registration/address.vis +++ b/services/registration/address.vis @@ -1,6 +1,4 @@ -LOAD send_address_sms 16 LOAD check_identifier 0 -RELOAD check_identifier MAP check_identifier MOUT back 0 MOUT quit 9 From ac2a3721b21c1fed9ddbed2c3724a32399f9de5c Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Fri, 18 Apr 2025 10:55:02 +0300 Subject: [PATCH 6/9] remove dedicated address sms trigger --- handlers/local.go | 1 - 1 file changed, 1 deletion(-) diff --git a/handlers/local.go b/handlers/local.go index 870a50e..6f4963f 100644 --- a/handlers/local.go +++ b/handlers/local.go @@ -124,7 +124,6 @@ func (ls *LocalHandlerService) GetHandler(accountService remote.AccountService) ls.DbRs.AddLocalFunc("get_suggested_alias", appHandlers.GetSuggestedAlias) ls.DbRs.AddLocalFunc("confirm_new_alias", appHandlers.ConfirmNewAlias) ls.DbRs.AddLocalFunc("check_account_created", appHandlers.CheckAccountCreated) - ls.DbRs.AddLocalFunc("send_address_sms", appHandlers.SendAddressSMS) ls.first = appHandlers.Init From a38ac06a3d7bcfc69d96e0c406a755d84fe9f333 Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Fri, 18 Apr 2025 10:56:41 +0300 Subject: [PATCH 7/9] trigger an address sms in the check_identifier handler --- handlers/application/menuhandler.go | 33 ++++++++++++++++++----------- 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/handlers/application/menuhandler.go b/handlers/application/menuhandler.go index 03631ad..510be83 100644 --- a/handlers/application/menuhandler.go +++ b/handlers/application/menuhandler.go @@ -1222,7 +1222,8 @@ func (h *MenuHandlers) ResetAccountAuthorized(ctx context.Context, sym string, i return res, nil } -// CheckIdentifier retrieves the PublicKey from the JSON data file. +// CheckIdentifier retrieves the Public key from the userdatastore under the key: DATA_PUBLIC_KEY and triggers an sms that +// will be sent to the associated session id func (h *MenuHandlers) CheckIdentifier(ctx context.Context, sym string, input []byte) (resource.Result, error) { var res resource.Result sessionId, ok := ctx.Value("SessionId").(string) @@ -1230,9 +1231,18 @@ func (h *MenuHandlers) CheckIdentifier(ctx context.Context, sym string, input [] return res, fmt.Errorf("missing session") } store := h.userdataStore - publicKey, _ := store.ReadEntry(ctx, sessionId, storedb.DATA_PUBLIC_KEY) - + publicKey, err := store.ReadEntry(ctx, sessionId, storedb.DATA_PUBLIC_KEY) + if err != nil { + logg.ErrorCtxf(ctx, "failed to read publicKey entry with", "key", storedb.DATA_PUBLIC_KEY, "error", err) + return res, err + } res.Content = string(publicKey) + //trigger an address sms to be delivered to the associated session id + err = h.sendAddressSMS(ctx) + if err != nil { + logg.DebugCtxf(ctx, "Failed to trigger an address sms", "error", err) + return res, nil + } return res, nil } @@ -2501,36 +2511,35 @@ func (h *MenuHandlers) ClearTemporaryValue(ctx context.Context, sym string, inpu } // SendAddressSMS will triger an SMS when a user navigates to the my address node.The SMS will be sent to the associated phonenumber. -func (h *MenuHandlers) SendAddressSMS(ctx context.Context, sym string, input []byte) (resource.Result, error) { - var res resource.Result +func (h *MenuHandlers) sendAddressSMS(ctx context.Context) error { store := h.userdataStore sessionId, ok := ctx.Value("SessionId").(string) if !ok { - return res, fmt.Errorf("missing session") + return fmt.Errorf("missing session") } publicKey, err := store.ReadEntry(ctx, sessionId, storedb.DATA_PUBLIC_KEY) if err != nil { logg.ErrorCtxf(ctx, "failed to read publicKey entry with", "key", storedb.DATA_PUBLIC_KEY, "error", err) - return res, err + return err } originPhone, err := phone.FormatPhoneNumber(sessionId) if err != nil { logg.DebugCtxf(ctx, "Failed to format origin phonenumber", "sessionid", sessionId) - return res, nil + return nil } if !phone.IsValidPhoneNumber(originPhone) { - logg.InfoCtxf(ctx, "Invalid origin phone number", "sessionid:", sessionId) - return res, nil + logg.InfoCtxf(ctx, "Invalid origin phone number", "origin phonenumber", originPhone) + return fmt.Errorf("invalid origin phone number") } err = h.accountService.SendAddressSMS(ctx, string(publicKey), sessionId) if err != nil { logg.DebugCtxf(ctx, "Failed to send address sms", "error", err) - return res, nil + return fmt.Errorf("Failed to send address sms: %v", err) } - return res, nil + return nil } // sendPINResetSMS will send an SMS to a user's phonenumber in the event that the associated account's PIN has been reset. From 7c0651d218a047e73bfa0e49aa1b97ffdc54d92f Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Fri, 18 Apr 2025 12:12:33 +0300 Subject: [PATCH 8/9] use dedicated sms package for triggering sms --- internal/sms/sms.go | 96 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 internal/sms/sms.go diff --git a/internal/sms/sms.go b/internal/sms/sms.go new file mode 100644 index 0000000..f6d51ce --- /dev/null +++ b/internal/sms/sms.go @@ -0,0 +1,96 @@ +package sms + +import ( + "context" + "fmt" + + "git.defalsify.org/vise.git/logging" + "git.grassecon.net/grassrootseconomics/common/phone" + "git.grassecon.net/grassrootseconomics/sarafu-api/remote" + "git.grassecon.net/grassrootseconomics/sarafu-vise/store" + storedb "git.grassecon.net/grassrootseconomics/sarafu-vise/store/db" +) + +var ( + logg = logging.NewVanilla().WithDomain("smsservice") +) + +type SmsService struct { + Accountservice remote.AccountService + Userdatastore store.UserDataStore +} + +// SendUpsellSMS will send an invitation SMS to an unregistered phone number +func (smsservice *SmsService) SendUpsellSMS(ctx context.Context, inviterPhone, inviteePhone string) error { + if !phone.IsValidPhoneNumber(inviterPhone) { + return fmt.Errorf("invalid inviter phone number %v", inviterPhone) + } + + if !phone.IsValidPhoneNumber(inviteePhone) { + return fmt.Errorf("Invalid invitee phone number %v", inviteePhone) + } + _, err := smsservice.Accountservice.SendUpsellSMS(ctx, inviterPhone, inviteePhone) + if err != nil { + return fmt.Errorf("Failed to send upsell sms: %v", err) + } + return nil +} + +// sendPINResetSMS will send an SMS to a user's phonenumber in the event that the associated account's PIN has been reset. +func (smsService *SmsService) SendPINResetSMS(ctx context.Context, adminPhoneNumber, blockedPhoneNumber string) error { + formattedAdminPhone, err := phone.FormatPhoneNumber(adminPhoneNumber) + if err != nil { + return fmt.Errorf("failed to format admin phone number: %w", err) + } + + formattedBlockedPhone, err := phone.FormatPhoneNumber(blockedPhoneNumber) + if err != nil { + return fmt.Errorf("failed to format blocked phone number: %w", err) + } + + if !phone.IsValidPhoneNumber(formattedAdminPhone) { + return fmt.Errorf("invalid admin phone number") + } + if !phone.IsValidPhoneNumber(formattedBlockedPhone) { + return fmt.Errorf("invalid blocked phone number") + } + + err = smsService.Accountservice.SendPINResetSMS(ctx, formattedAdminPhone, formattedBlockedPhone) + if err != nil { + return fmt.Errorf("failed to send pin reset sms: %v", err) + } + + return nil +} + +// SendAddressSMS will triger an SMS when a user navigates to the my address node.The SMS will be sent to the associated phonenumber. +func (smsService *SmsService) SendAddressSMS(ctx context.Context) error { + store := smsService.Userdatastore + sessionId, ok := ctx.Value("SessionId").(string) + if !ok { + return fmt.Errorf("missing session") + } + + publicKey, err := store.ReadEntry(ctx, sessionId, storedb.DATA_PUBLIC_KEY) + if err != nil { + logg.ErrorCtxf(ctx, "failed to read publicKey entry with", "key", storedb.DATA_PUBLIC_KEY, "error", err) + return err + } + + originPhone, err := phone.FormatPhoneNumber(sessionId) + if err != nil { + logg.DebugCtxf(ctx, "Failed to format origin phonenumber", "sessionid", sessionId) + return nil + } + + if !phone.IsValidPhoneNumber(originPhone) { + logg.InfoCtxf(ctx, "Invalid origin phone number", "origin phonenumber", originPhone) + return fmt.Errorf("invalid origin phone number") + } + err = smsService.Accountservice.SendAddressSMS(ctx, string(publicKey), originPhone) + if err != nil { + logg.DebugCtxf(ctx, "Failed to send address sms", "error", err) + return fmt.Errorf("Failed to send address sms: %v", err) + } + return nil +} From 0370a3def4e27bf47da76aa4af9141a784cef7f9 Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Fri, 18 Apr 2025 12:13:24 +0300 Subject: [PATCH 9/9] use dedicated smsservice for triggering extra sms --- handlers/application/menuhandler.go | 79 +++++++---------------------- 1 file changed, 17 insertions(+), 62 deletions(-) diff --git a/handlers/application/menuhandler.go b/handlers/application/menuhandler.go index 510be83..73f5283 100644 --- a/handlers/application/menuhandler.go +++ b/handlers/application/menuhandler.go @@ -29,6 +29,7 @@ import ( "git.grassecon.net/grassrootseconomics/sarafu-api/models" "git.grassecon.net/grassrootseconomics/sarafu-api/remote" "git.grassecon.net/grassrootseconomics/sarafu-vise/config" + "git.grassecon.net/grassrootseconomics/sarafu-vise/internal/sms" "git.grassecon.net/grassrootseconomics/sarafu-vise/profile" "git.grassecon.net/grassrootseconomics/sarafu-vise/store" storedb "git.grassecon.net/grassrootseconomics/sarafu-vise/store/db" @@ -77,6 +78,7 @@ type MenuHandlers struct { flagManager *FlagManager accountService remote.AccountService prefixDb storedb.PrefixDb + smsService sms.SmsService profile *profile.Profile ReplaceSeparatorFunc func(string) string } @@ -89,6 +91,10 @@ func NewMenuHandlers(appFlags *FlagManager, userdataStore db.Db, accountService userDb := &store.UserDataStore{ Db: userdataStore, } + smsservice := sms.SmsService{ + Accountservice: accountService, + Userdatastore: *userDb, + } // Instantiate the SubPrefixDb with "DATATYPE_USERDATA" prefix prefix := storedb.ToBytes(db.DATATYPE_USERDATA) @@ -98,6 +104,7 @@ func NewMenuHandlers(appFlags *FlagManager, userdataStore db.Db, accountService userdataStore: userDb, flagManager: appFlags, accountService: accountService, + smsService: smsservice, prefixDb: prefixDb, profile: &profile.Profile{Max: 6}, ReplaceSeparatorFunc: replaceSeparatorFunc, @@ -502,7 +509,10 @@ func (h *MenuHandlers) ValidateBlockedNumber(ctx context.Context, sym string, in // 3. Resetting the DATA_INCORRECT_PIN_ATTEMPTS to 0 for the blocked phone number func (h *MenuHandlers) ResetOthersPin(ctx context.Context, sym string, input []byte) (resource.Result, error) { var res resource.Result + store := h.userdataStore + smsservice := h.smsService + sessionId, ok := ctx.Value("SessionId").(string) if !ok { return res, fmt.Errorf("missing session") @@ -527,7 +537,7 @@ func (h *MenuHandlers) ResetOthersPin(ctx context.Context, sym string, input []b blockedPhoneStr := string(blockedPhonenumber) //Trigger an SMS to inform a user that the blocked account has been reset if phone.IsValidPhoneNumber(blockedPhoneStr) { - err = h.sendPINResetSMS(ctx, sessionId, blockedPhoneStr) + err = smsservice.SendPINResetSMS(ctx, sessionId, blockedPhoneStr) if err != nil { logg.DebugCtxf(ctx, "Failed to send PIN reset SMS", "error", err) return res, nil @@ -1226,6 +1236,9 @@ func (h *MenuHandlers) ResetAccountAuthorized(ctx context.Context, sym string, i // will be sent to the associated session id func (h *MenuHandlers) CheckIdentifier(ctx context.Context, sym string, input []byte) (resource.Result, error) { var res resource.Result + + smsservice := h.smsService + sessionId, ok := ctx.Value("SessionId").(string) if !ok { return res, fmt.Errorf("missing session") @@ -1238,7 +1251,7 @@ func (h *MenuHandlers) CheckIdentifier(ctx context.Context, sym string, input [] } res.Content = string(publicKey) //trigger an address sms to be delivered to the associated session id - err = h.sendAddressSMS(ctx) + err = smsservice.SendAddressSMS(ctx) if err != nil { logg.DebugCtxf(ctx, "Failed to trigger an address sms", "error", err) return res, nil @@ -1639,6 +1652,7 @@ func (h *MenuHandlers) TransactionReset(ctx context.Context, sym string, input [ func (h *MenuHandlers) InviteValidRecipient(ctx context.Context, sym string, input []byte) (resource.Result, error) { var res resource.Result store := h.userdataStore + smsservice := h.smsService sessionId, ok := ctx.Value("SessionId").(string) if !ok { @@ -1660,7 +1674,7 @@ func (h *MenuHandlers) InviteValidRecipient(ctx context.Context, sym string, inp return res, nil } - _, err = h.accountService.SendUpsellSMS(ctx, sessionId, string(recipient)) + _, err = smsservice.Accountservice.SendUpsellSMS(ctx, sessionId, string(recipient)) if err != nil { res.Content = l.Get("Your invite request for %s to Sarafu Network failed. Please try again later.", string(recipient)) return res, nil @@ -2509,62 +2523,3 @@ func (h *MenuHandlers) ClearTemporaryValue(ctx context.Context, sym string, inpu } return res, nil } - -// SendAddressSMS will triger an SMS when a user navigates to the my address node.The SMS will be sent to the associated phonenumber. -func (h *MenuHandlers) sendAddressSMS(ctx context.Context) error { - store := h.userdataStore - - sessionId, ok := ctx.Value("SessionId").(string) - if !ok { - return fmt.Errorf("missing session") - } - - publicKey, err := store.ReadEntry(ctx, sessionId, storedb.DATA_PUBLIC_KEY) - if err != nil { - logg.ErrorCtxf(ctx, "failed to read publicKey entry with", "key", storedb.DATA_PUBLIC_KEY, "error", err) - return err - } - originPhone, err := phone.FormatPhoneNumber(sessionId) - if err != nil { - logg.DebugCtxf(ctx, "Failed to format origin phonenumber", "sessionid", sessionId) - return nil - } - - if !phone.IsValidPhoneNumber(originPhone) { - logg.InfoCtxf(ctx, "Invalid origin phone number", "origin phonenumber", originPhone) - return fmt.Errorf("invalid origin phone number") - } - err = h.accountService.SendAddressSMS(ctx, string(publicKey), sessionId) - if err != nil { - logg.DebugCtxf(ctx, "Failed to send address sms", "error", err) - return fmt.Errorf("Failed to send address sms: %v", err) - } - return nil -} - -// sendPINResetSMS will send an SMS to a user's phonenumber in the event that the associated account's PIN has been reset. -func (h *MenuHandlers) sendPINResetSMS(ctx context.Context, adminPhoneNumber, blockedPhoneNumber string) error { - formattedAdminPhone, err := phone.FormatPhoneNumber(adminPhoneNumber) - if err != nil { - return fmt.Errorf("failed to format admin phone number: %w", err) - } - - formattedBlockedPhone, err := phone.FormatPhoneNumber(blockedPhoneNumber) - if err != nil { - return fmt.Errorf("failed to format blocked phone number: %w", err) - } - - if !phone.IsValidPhoneNumber(formattedAdminPhone) { - return fmt.Errorf("invalid admin phone number") - } - if !phone.IsValidPhoneNumber(formattedBlockedPhone) { - return fmt.Errorf("invalid blocked phone number") - } - - err = h.accountService.SendPINResetSMS(ctx, formattedAdminPhone, formattedBlockedPhone) - if err != nil { - return fmt.Errorf("failed to send pin reset sms: %v", err) - } - - return nil -}