From 7c0651d218a047e73bfa0e49aa1b97ffdc54d92f Mon Sep 17 00:00:00 2001 From: Carlosokumu Date: Fri, 18 Apr 2025 12:12:33 +0300 Subject: [PATCH] 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 +}