diff --git a/go.mod b/go.mod index a75e399..0063d15 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.23.4 require ( git.defalsify.org/vise.git v0.2.3-0.20250205173834-d1f6647211ac git.grassecon.net/grassrootseconomics/common v0.0.0-20250121134736-ba8cbbccea7d - git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250206112944-31eb30de0f69 + git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250310093912-8145b4bd004b git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.1.0.20250204132347-1eb0b1555244 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 1cd58c7..fc169cb 100644 --- a/go.sum +++ b/go.sum @@ -4,6 +4,14 @@ git.grassecon.net/grassrootseconomics/common v0.0.0-20250121134736-ba8cbbccea7d git.grassecon.net/grassrootseconomics/common v0.0.0-20250121134736-ba8cbbccea7d/go.mod h1:wgQJZGIS6QuNLHqDhcsvehsbn5PvgV7aziRebMnJi60= git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250206112944-31eb30de0f69 h1:cbBpm9uNJak58MpFpNXJuvgCmz+A8kquXr9har4expg= git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250206112944-31eb30de0f69/go.mod h1:gOn89ipaDcDvmQXRMQYKUqcw/sJcwVOPVt2eC6Geip8= +git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250307064509-9c8a3df971ae h1:C8k2d/QY6KPjz+3uzX5IJiRgwGjRniP14UBPcroAT94= +git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250307064509-9c8a3df971ae/go.mod h1:gOn89ipaDcDvmQXRMQYKUqcw/sJcwVOPVt2eC6Geip8= +git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250307131040-6e437cb8e033 h1:nFesCueH+xTUKRtzRlrD/ha42MJBE1D7r/JjD/MwbHU= +git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250307131040-6e437cb8e033/go.mod h1:gOn89ipaDcDvmQXRMQYKUqcw/sJcwVOPVt2eC6Geip8= +git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250310084949-dda02852bf46 h1:ikchtIvwd2MYWWvKZ8xFiozeON5JyIUnFZNq7pUgXlg= +git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250310084949-dda02852bf46/go.mod h1:gOn89ipaDcDvmQXRMQYKUqcw/sJcwVOPVt2eC6Geip8= +git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250310093912-8145b4bd004b h1:xiTpaqWWoF5qcnarY/9ZkT6aVdnKwqztb2gzIahJn4w= +git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250310093912-8145b4bd004b/go.mod h1:gOn89ipaDcDvmQXRMQYKUqcw/sJcwVOPVt2eC6Geip8= git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.1.0.20250204132347-1eb0b1555244 h1:BXotWSKg04U97sf/xeWJuUTSVgKk2aEK+5BtBrnafXQ= git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.1.0.20250204132347-1eb0b1555244/go.mod h1:6B6ByxXOiRY0NR7K02Bf3fEu7z+2c/6q8PFVNjC5G8w= 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 b4cbd7b..1aeda8e 100644 --- a/handlers/application/menuhandler.go +++ b/handlers/application/menuhandler.go @@ -1,7 +1,9 @@ package application import ( + "bytes" "context" + "errors" "fmt" "path" "strconv" @@ -453,6 +455,14 @@ func (h *MenuHandlers) CheckBlockedNumPinMisMatch(ctx context.Context, sym strin return res, nil } +// ResetInvalidPIN resets the invalid PIN flag +func (h *MenuHandlers) ResetInvalidPIN(ctx context.Context, sym string, input []byte) (resource.Result, error) { + var res resource.Result + flag_invalid_pin, _ := h.flagManager.GetFlag("flag_invalid_pin") + res.FlagReset = append(res.FlagReset, flag_invalid_pin) + return res, nil +} + // ConfirmPinChange validates user's new PIN. If input matches the temporary PIN, saves it as the new account PIN. func (h *MenuHandlers) ConfirmPinChange(ctx context.Context, sym string, input []byte) (resource.Result, error) { var res resource.Result @@ -707,10 +717,6 @@ func (h *MenuHandlers) SaveFirstname(ctx context.Context, sym string, input []by logg.ErrorCtxf(ctx, "failed to write firstName entry with", "key", storedb.DATA_FIRST_NAME, "value", temporaryFirstName, "error", err) return res, err } - err := h.constructAccountAlias(ctx) - if err != nil { - return res, err - } res.FlagSet = append(res.FlagSet, flag_firstname_set) } else { if firstNameSet { @@ -1104,6 +1110,17 @@ func (h *MenuHandlers) GetCurrentProfileInfo(ctx context.Context, sym string, in } res.FlagSet = append(res.FlagSet, flag_offerings_set) res.Content = string(profileInfo) + case storedb.DATA_ACCOUNT_ALIAS: + profileInfo, err = store.ReadEntry(ctx, sessionId, storedb.DATA_ACCOUNT_ALIAS) + if err != nil { + if db.IsNotFound(err) { + res.Content = defaultValue + break + } + logg.ErrorCtxf(ctx, "Failed to read account alias entry with", "key", "error", storedb.DATA_ACCOUNT_ALIAS, err) + return res, err + } + res.Content = string(profileInfo) default: break } @@ -1229,13 +1246,19 @@ func (h *MenuHandlers) UpdateAllProfileItems(ctx context.Context, sym string, in if !ok { return res, fmt.Errorf("missing session") } + flag_alias_set, _ := h.flagManager.GetFlag("flag_alias_set") + aliasSet := h.st.MatchFlag(flag_alias_set, true) + err := h.insertProfileItems(ctx, sessionId, &res) if err != nil { return res, err } - err = h.constructAccountAlias(ctx) - if err != nil { - return res, err + //Only request an alias if it has not been set yet: + if !aliasSet { + err = h.constructAccountAlias(ctx) + if err != nil { + return res, err + } } return res, nil } @@ -1275,6 +1298,7 @@ func (h *MenuHandlers) Authorize(ctx context.Context, sym string, input []byte) flag_incorrect_pin, _ := h.flagManager.GetFlag("flag_incorrect_pin") flag_account_authorized, _ := h.flagManager.GetFlag("flag_account_authorized") flag_allow_update, _ := h.flagManager.GetFlag("flag_allow_update") + flag_invalid_pin, _ := h.flagManager.GetFlag("flag_invalid_pin") store := h.userdataStore AccountPin, err := store.ReadEntry(ctx, sessionId, storedb.DATA_ACCOUNT_PIN) @@ -1311,6 +1335,9 @@ func (h *MenuHandlers) Authorize(ctx context.Context, sym string, input []byte) return res, nil } } else { + if string(input) != "0" { + res.FlagSet = append(res.FlagSet, flag_invalid_pin) + } return res, nil } return res, nil @@ -1411,53 +1438,84 @@ func (h *MenuHandlers) ShowBlockedAccount(ctx context.Context, sym string, input return res, nil } +// loadUserContent loads the main user content in the main menu: the alias,balance associated with active voucher +func loadUserContent(ctx context.Context, activeSym string, balance string, alias string) (string, error) { + var content string + + code := codeFromCtx(ctx) + l := gotext.NewLocale(translationDir, code) + l.AddDomain("default") + + balFloat, err := strconv.ParseFloat(balance, 64) + if err != nil { + //Only exclude ErrSyntax error to avoid returning an error if the active bal is not available yet + if !errors.Is(err, strconv.ErrSyntax) { + logg.ErrorCtxf(ctx, "failed to parse activeBal as float", "value", balance, "error", err) + return "", err + } + balFloat = 0.00 + } + // Format to 2 decimal places + balStr := fmt.Sprintf("%.2f %s", balFloat, activeSym) + if alias != "" { + content = l.Get("%s balance: %s\n", alias, balStr) + } else { + content = l.Get("balance: %s\n", balStr) + } + return content, nil +} + // CheckBalance retrieves the balance of the active voucher and sets // the balance as the result content. func (h *MenuHandlers) CheckBalance(ctx context.Context, sym string, input []byte) (resource.Result, error) { - var res resource.Result - var err error + + var ( + res resource.Result + err error + alias string + content string + ) sessionId, ok := ctx.Value("SessionId").(string) if !ok { return res, fmt.Errorf("missing session") } - code := codeFromCtx(ctx) - l := gotext.NewLocale(translationDir, code) - l.AddDomain("default") - store := h.userdataStore + accAlias, err := store.ReadEntry(ctx, sessionId, storedb.DATA_ACCOUNT_ALIAS) + if err != nil { + if !db.IsNotFound(err) { + logg.ErrorCtxf(ctx, "failed to read account alias entry with", "key", storedb.DATA_ACCOUNT_ALIAS, "error", err) + return res, err + } + } else { + alias = strings.Split(string(accAlias), ".")[0] + } + // get the active sym and active balance activeSym, err := store.ReadEntry(ctx, sessionId, storedb.DATA_ACTIVE_SYM) if err != nil { - if db.IsNotFound(err) { - balance := "0.00" - res.Content = l.Get("Balance: %s\n", balance) - return res, nil + if !db.IsNotFound(err) { + logg.ErrorCtxf(ctx, "failed to read activeSym entry with", "key", storedb.DATA_ACTIVE_SYM, "error", err) + return res, err } - - logg.ErrorCtxf(ctx, "failed to read activeSym entry with", "key", storedb.DATA_ACTIVE_SYM, "error", err) - return res, err } activeBal, err := store.ReadEntry(ctx, sessionId, storedb.DATA_ACTIVE_BAL) if err != nil { - logg.ErrorCtxf(ctx, "failed to read activeBal entry with", "key", storedb.DATA_ACTIVE_BAL, "error", err) - return res, err + if !db.IsNotFound(err) { + logg.ErrorCtxf(ctx, "failed to read activeBal entry with", "key", storedb.DATA_ACTIVE_BAL, "error", err) + return res, err + } + } - // Convert activeBal from []byte to float64 - balFloat, err := strconv.ParseFloat(string(activeBal), 64) + content, err = loadUserContent(ctx, string(activeSym), string(activeBal), alias) if err != nil { - logg.ErrorCtxf(ctx, "failed to parse activeBal as float", "value", string(activeBal), "error", err) return res, err } - - // Format to 2 decimal places - balStr := fmt.Sprintf("%.2f %s", balFloat, activeSym) - - res.Content = l.Get("Balance: %s\n", balStr) + res.Content = content return res, nil } @@ -1561,6 +1619,7 @@ func (h *MenuHandlers) ValidateRecipient(ctx context.Context, sym string, input //Perform a search for each search domain,break on first match for _, domain := range config.SearchDomains() { fqdn := fmt.Sprintf("%s.%s", recipient, domain) + logg.InfoCtxf(ctx, "Resolving with fqdn alias", "alias", fqdn) AliasAddress, err = h.accountService.CheckAliasAddress(ctx, fqdn) if err == nil { AliasAddressResult = AliasAddress.Address @@ -2394,6 +2453,96 @@ func (h *MenuHandlers) constructAccountAlias(ctx context.Context) error { return nil } +// RequestCustomAlias requests an ENS based alias name based on a user's input,then saves it as temporary value +func (h *MenuHandlers) RequestCustomAlias(ctx context.Context, sym string, input []byte) (resource.Result, error) { + var res resource.Result + sessionId, ok := ctx.Value("SessionId").(string) + if !ok { + return res, fmt.Errorf("missing session") + } + if string(input) == "0" { + return res, nil + } + + store := h.userdataStore + aliasHint, err := store.ReadEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE) + if err != nil { + if db.IsNotFound(err) { + return res, nil + } + return res, err + } + //Ensures that the call doesn't happen twice for the same alias hint + if !bytes.Equal(aliasHint, input) { + err = store.WriteEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE, []byte(string(input))) + if err != nil { + return res, err + } + pubKey, err := store.ReadEntry(ctx, sessionId, storedb.DATA_PUBLIC_KEY) + if err != nil { + if db.IsNotFound(err) { + return res, nil + } + } + aliasResult, err := h.accountService.RequestAlias(ctx, string(pubKey), string(input)) + if err != nil { + logg.ErrorCtxf(ctx, "failed to retrieve alias", "alias", string(aliasHint), "error_alias_request", err) + return res, fmt.Errorf("Failed to retrieve alias: %s", err.Error()) + } + alias := aliasResult.Alias + + //Store the returned alias,wait for user to confirm it as new account alias + err = store.WriteEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE, []byte(alias)) + if err != nil { + logg.ErrorCtxf(ctx, "failed to write account alias", "key", storedb.DATA_TEMPORARY_VALUE, "value", alias, "error", err) + return res, err + } + } + return res, nil +} + +// GetSuggestedAlias loads and displays the suggested alias name from the temporary value +func (h *MenuHandlers) GetSuggestedAlias(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") + } + suggestedAlias, err := store.ReadEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE) + if err != nil { + return res, nil + } + res.Content = string(suggestedAlias) + return res, nil +} + +// ConfirmNewAlias reads the suggested alias from the temporary value and confirms it as the new account alias. +func (h *MenuHandlers) ConfirmNewAlias(ctx context.Context, sym string, input []byte) (resource.Result, error) { + var res resource.Result + store := h.userdataStore + + flag_alias_set, _ := h.flagManager.GetFlag("flag_alias_set") + + sessionId, ok := ctx.Value("SessionId").(string) + if !ok { + return res, fmt.Errorf("missing session") + } + newAlias, err := store.ReadEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE) + if err != nil { + return res, nil + } + err = store.WriteEntry(ctx, sessionId, storedb.DATA_ACCOUNT_ALIAS, []byte(string(newAlias))) + if err != nil { + logg.ErrorCtxf(ctx, "failed to clear DATA_ACCOUNT_ALIAS_VALUE entry with", "key", storedb.DATA_ACCOUNT_ALIAS, "value", "empty", "error", err) + return res, err + } + + res.FlagSet = append(res.FlagSet, flag_alias_set) + return res, nil +} + // ClearTemporaryValue empties the DATA_TEMPORARY_VALUE at the main menu to prevent // previously stored data from being accessed func (h *MenuHandlers) ClearTemporaryValue(ctx context.Context, sym string, input []byte) (resource.Result, error) { diff --git a/handlers/application/menuhandler_test.go b/handlers/application/menuhandler_test.go index 75b9de2..c3b27c4 100644 --- a/handlers/application/menuhandler_test.go +++ b/handlers/application/menuhandler_test.go @@ -1281,6 +1281,7 @@ func TestAuthorize(t *testing.T) { flag_incorrect_pin, _ := fm.GetFlag("flag_incorrect_pin") flag_account_authorized, _ := fm.GetFlag("flag_account_authorized") flag_allow_update, _ := fm.GetFlag("flag_allow_update") + flag_invalid_pin, _ := fm.GetFlag("flag_invalid_pin") // Set 1234 is the correct account pin accountPIN := "1234" @@ -1314,9 +1315,11 @@ func TestAuthorize(t *testing.T) { }, }, { - name: "Test with pin that is not a 4 digit", - input: []byte("1235aqds"), - expectedResult: resource.Result{}, + name: "Test with pin that is not a 4 digit", + input: []byte("1235aqds"), + expectedResult: resource.Result{ + FlagSet: []uint32{flag_invalid_pin}, + }, }, } @@ -1973,7 +1976,7 @@ func TestCheckBalance(t *testing.T) { publicKey: "0X98765432109", activeSym: "ETH", activeBal: "1.5", - expectedResult: resource.Result{Content: "Balance: 1.50 ETH\n"}, + expectedResult: resource.Result{Content: "balance: 1.50 ETH\n"}, expectError: false, }, } diff --git a/handlers/local.go b/handlers/local.go index 7d66c7d..2103c2f 100644 --- a/handlers/local.go +++ b/handlers/local.go @@ -124,6 +124,11 @@ func (ls *LocalHandlerService) GetHandler(accountService remote.AccountService) ls.DbRs.AddLocalFunc("set_back", appHandlers.SetBack) ls.DbRs.AddLocalFunc("show_blocked_account", appHandlers.ShowBlockedAccount) ls.DbRs.AddLocalFunc("clear_temporary_value", appHandlers.ClearTemporaryValue) + ls.DbRs.AddLocalFunc("reset_invalid_pin", appHandlers.ResetInvalidPIN) + ls.DbRs.AddLocalFunc("request_custom_alias", appHandlers.RequestCustomAlias) + ls.DbRs.AddLocalFunc("get_suggested_alias", appHandlers.GetSuggestedAlias) + ls.DbRs.AddLocalFunc("confirm_new_alias", appHandlers.ConfirmNewAlias) + ls.first = appHandlers.Init return appHandlers, nil diff --git a/menutraversal_test/group_test.json b/menutraversal_test/group_test.json index f4bc2df..b3177a9 100644 --- a/menutraversal_test/group_test.json +++ b/menutraversal_test/group_test.json @@ -71,7 +71,7 @@ }, { "input": "3", - "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back" + "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n7:My Alias\n0:Back" }, { "input": "5", @@ -108,11 +108,11 @@ }, { "input": "3", - "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back" + "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n7:My Alias\n0:Back" }, { "input": "", - "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back" + "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n7:My Alias\n0:Back" }, { "input": "2", @@ -149,7 +149,7 @@ }, { "input": "3", - "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back" + "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n7:My Alias\n0:Back" }, { "input": "5", @@ -173,7 +173,7 @@ }, { "input": "0", - "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back" + "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n7:My Alias\n0:Back" }, { "input": "0", @@ -190,7 +190,7 @@ }, { "input": "3", - "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back" + "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n7:My Alias\n0:Back" }, { "input": "5", @@ -239,7 +239,7 @@ }, { "input": "3", - "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back" + "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n7:My Alias\n0:Back" }, { "input": "5", @@ -264,7 +264,7 @@ }, { "input": "3", - "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back" + "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n7:My Alias\n0:Back" }, { "input": "3", @@ -284,7 +284,7 @@ }, { "input": "1234", - "expectedContent": "Balance: {balance}\n\n0:Back\n9:Quit" + "expectedContent": "{balance}\n\n0:Back\n9:Quit" }, { "input": "0", @@ -292,7 +292,7 @@ }, { "input": "0", - "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back" + "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n7:My Alias\n0:Back" }, { "input": "0", @@ -309,7 +309,7 @@ }, { "input": "3", - "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back" + "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n7:My Alias\n0:Back" }, { "input": "3", @@ -337,7 +337,7 @@ }, { "input": "0", - "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back" + "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n7:My Alias\n0:Back" }, { "input": "0", @@ -354,7 +354,7 @@ }, { "input": "3", - "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back" + "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n7:My Alias\n0:Back" }, { "input": "1", @@ -411,7 +411,7 @@ }, { "input": "3", - "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back" + "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n7:My Alias\n0:Back" }, { "input": "1", @@ -448,7 +448,7 @@ }, { "input": "3", - "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back" + "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n7:My Alias\n0:Back" }, { "input": "1", @@ -489,7 +489,7 @@ }, { "input": "3", - "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back" + "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n7:My Alias\n0:Back" }, { "input": "1", @@ -526,7 +526,7 @@ }, { "input": "3", - "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back" + "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n7:My Alias\n0:Back" }, { "input": "1", @@ -563,7 +563,7 @@ }, { "input": "3", - "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back" + "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n7:My Alias\n0:Back" }, { "input": "1", @@ -600,7 +600,7 @@ }, { "input": "3", - "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back" + "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n7:My Alias\n0:Back" }, { "input": "1", @@ -633,7 +633,7 @@ }, { "input": "3", - "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back" + "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n7:My Alias\n0:Back" }, { "input": "1", diff --git a/menutraversal_test/profile_edit_start_familyname.json b/menutraversal_test/profile_edit_start_familyname.json index 98325b0..bb8bf0d 100644 --- a/menutraversal_test/profile_edit_start_familyname.json +++ b/menutraversal_test/profile_edit_start_familyname.json @@ -9,7 +9,7 @@ }, { "input": "3", - "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back" + "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n7:My Alias\n0:Back" }, { "input": "1", diff --git a/menutraversal_test/profile_edit_start_firstname.json b/menutraversal_test/profile_edit_start_firstname.json index 0f6be8b..1fa2ca6 100644 --- a/menutraversal_test/profile_edit_start_firstname.json +++ b/menutraversal_test/profile_edit_start_firstname.json @@ -9,7 +9,7 @@ }, { "input": "3", - "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back" + "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n7:My Alias\n0:Back" }, { "input": "1", diff --git a/menutraversal_test/profile_edit_start_gender.json b/menutraversal_test/profile_edit_start_gender.json index afca12a..d95420f 100644 --- a/menutraversal_test/profile_edit_start_gender.json +++ b/menutraversal_test/profile_edit_start_gender.json @@ -9,7 +9,7 @@ }, { "input": "3", - "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back" + "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n7:My Alias\n0:Back" }, { "input": "1", diff --git a/menutraversal_test/profile_edit_start_location.json b/menutraversal_test/profile_edit_start_location.json index 8852911..86541a3 100644 --- a/menutraversal_test/profile_edit_start_location.json +++ b/menutraversal_test/profile_edit_start_location.json @@ -9,7 +9,7 @@ }, { "input": "3", - "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back" + "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n7:My Alias\n0:Back" }, { "input": "1", diff --git a/menutraversal_test/profile_edit_start_offerings.json b/menutraversal_test/profile_edit_start_offerings.json index 6aa40f6..2fc976a 100644 --- a/menutraversal_test/profile_edit_start_offerings.json +++ b/menutraversal_test/profile_edit_start_offerings.json @@ -9,7 +9,7 @@ }, { "input": "3", - "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back" + "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n7:My Alias\n0:Back" }, { "input": "1", diff --git a/menutraversal_test/profile_edit_start_yob.json b/menutraversal_test/profile_edit_start_yob.json index 45227f7..10c1d11 100644 --- a/menutraversal_test/profile_edit_start_yob.json +++ b/menutraversal_test/profile_edit_start_yob.json @@ -9,7 +9,7 @@ }, { "input": "3", - "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back" + "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n7:My Alias\n0:Back" }, { "input": "1", diff --git a/menutraversal_test/profile_edit_when_adjacent_item_set.json b/menutraversal_test/profile_edit_when_adjacent_item_set.json index f8d7263..ec7c880 100644 --- a/menutraversal_test/profile_edit_when_adjacent_item_set.json +++ b/menutraversal_test/profile_edit_when_adjacent_item_set.json @@ -9,7 +9,7 @@ }, { "input": "3", - "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back" + "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n7:My Alias\n0:Back" }, { "input": "1", diff --git a/menutraversal_test/test_setup.json b/menutraversal_test/test_setup.json index 8728640..375be80 100644 --- a/menutraversal_test/test_setup.json +++ b/menutraversal_test/test_setup.json @@ -116,7 +116,7 @@ }, { "input": "3", - "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n0:Back" + "expectedContent": "My Account\n1:Profile\n2:Change language\n3:Check balances\n4:Check statement\n5:PIN options\n6:My Address\n7:My Alias\n0:Back" }, { "input": "6", diff --git a/services/registration/confirm_new_alias b/services/registration/confirm_new_alias new file mode 100644 index 0000000..6cc2cc3 --- /dev/null +++ b/services/registration/confirm_new_alias @@ -0,0 +1,2 @@ +Your full alias will be: {{.get_suggested_alias}} +Please enter your PIN to confirm: diff --git a/services/registration/confirm_new_alias.vis b/services/registration/confirm_new_alias.vis new file mode 100644 index 0000000..ad56fe0 --- /dev/null +++ b/services/registration/confirm_new_alias.vis @@ -0,0 +1,12 @@ +LOAD reset_invalid_pin 6 +RELOAD reset_invalid_pin +LOAD get_suggested_alias 0 +RELOAD get_suggested_alias +MAP get_suggested_alias +MOUT back 0 +HALT +INCMP _ 0 +RELOAD authorize_account +CATCH incorrect_pin flag_incorrect_pin 1 +CATCH invalid_pin flag_invalid_pin 1 +CATCH update_alias flag_allow_update 1 diff --git a/services/registration/confirm_new_alias_swa b/services/registration/confirm_new_alias_swa new file mode 100644 index 0000000..e622e9c --- /dev/null +++ b/services/registration/confirm_new_alias_swa @@ -0,0 +1,2 @@ +Lakabu yako kamili itakuwa: {{.get_suggested_alias}} +Tafadhali weka PIN yako ili kuthibitisha: diff --git a/services/registration/invalid_pin b/services/registration/invalid_pin index dd984ea..607c151 100644 --- a/services/registration/invalid_pin +++ b/services/registration/invalid_pin @@ -1 +1 @@ -The PIN you entered is invalid.The PIN must be different from your current PIN.For help call +254757628885 \ No newline at end of file +The PIN you entered is invalid.The PIN must be a 4 digit number. \ No newline at end of file diff --git a/services/registration/invalid_pin.vis b/services/registration/invalid_pin.vis index 3790a08..34e4193 100644 --- a/services/registration/invalid_pin.vis +++ b/services/registration/invalid_pin.vis @@ -1,3 +1,8 @@ -MOUT back 0 +LOAD reset_invalid_pin 6 +RELOAD reset_invalid_pin +MOUT retry 1 +MOUT quit 9 HALT -INCMP _ 0 +INCMP _ 1 +INCMP quit 9 +INCMP . * diff --git a/services/registration/invalid_pin_swa b/services/registration/invalid_pin_swa index 7512242..bba32c7 100644 --- a/services/registration/invalid_pin_swa +++ b/services/registration/invalid_pin_swa @@ -1 +1 @@ -PIN mpya na udhibitisho wa PIN mpya hazilingani.Tafadhali jaribu tena.Kwa usaidizi piga simu +254757628885. +PIN uliyoweka si sahihi. PIN lazima iwe nambari 4. \ No newline at end of file diff --git a/services/registration/my_account.vis b/services/registration/my_account.vis index e3956d2..c0b624e 100644 --- a/services/registration/my_account.vis +++ b/services/registration/my_account.vis @@ -1,3 +1,4 @@ +LOAD authorize_account 16 LOAD reset_allow_update 0 MOUT profile 1 MOUT change_language 2 @@ -5,6 +6,7 @@ MOUT check_balance 3 MOUT check_statement 4 MOUT pin_options 5 MOUT my_address 6 +MOUT my_account_alias 7 MOUT back 0 HALT INCMP main 0 @@ -14,4 +16,5 @@ INCMP balances 3 INCMP check_statement 4 INCMP pin_management 5 INCMP address 6 +INCMP my_account_alias 7 INCMP . * diff --git a/services/registration/my_account_alias b/services/registration/my_account_alias new file mode 100644 index 0000000..678037b --- /dev/null +++ b/services/registration/my_account_alias @@ -0,0 +1,2 @@ +Current alias: {{.get_current_profile_info}} +Edit my alias: \ No newline at end of file diff --git a/services/registration/my_account_alias.vis b/services/registration/my_account_alias.vis new file mode 100644 index 0000000..506f432 --- /dev/null +++ b/services/registration/my_account_alias.vis @@ -0,0 +1,8 @@ +LOAD get_current_profile_info 0 +MAP get_current_profile_info +MOUT back 0 +HALT +INCMP _ 0 +LOAD request_custom_alias 0 +RELOAD request_custom_alias +INCMP confirm_new_alias * diff --git a/services/registration/my_account_alias_menu b/services/registration/my_account_alias_menu new file mode 100644 index 0000000..3351fdf --- /dev/null +++ b/services/registration/my_account_alias_menu @@ -0,0 +1 @@ +My Alias \ No newline at end of file diff --git a/services/registration/my_account_alias_menu_swa b/services/registration/my_account_alias_menu_swa new file mode 100644 index 0000000..fdb3f58 --- /dev/null +++ b/services/registration/my_account_alias_menu_swa @@ -0,0 +1 @@ +Lakabu yangu \ No newline at end of file diff --git a/services/registration/my_account_alias_swa b/services/registration/my_account_alias_swa new file mode 100644 index 0000000..6d88e89 --- /dev/null +++ b/services/registration/my_account_alias_swa @@ -0,0 +1,2 @@ +Lakabu ya sasa: {{.get_current_profile_info}} +Badilisha Lakabu yangu: \ No newline at end of file diff --git a/services/registration/old_pin.vis b/services/registration/old_pin.vis index aa6eabf..de66e2c 100644 --- a/services/registration/old_pin.vis +++ b/services/registration/old_pin.vis @@ -1,8 +1,8 @@ -RELOAD reset_allow_update +RELOAD reset_incorrect MOUT back 0 HALT INCMP _ 0 RELOAD authorize_account CATCH incorrect_pin flag_incorrect_pin 1 -CATCH _ flag_allow_update 0 +CATCH invalid_pin flag_invalid_pin 1 INCMP new_pin * diff --git a/services/registration/pin_management.vis b/services/registration/pin_management.vis index 409b3c8..ca54ee4 100644 --- a/services/registration/pin_management.vis +++ b/services/registration/pin_management.vis @@ -1,9 +1,10 @@ LOAD set_back 6 -LOAD authorize_account 5 +LOAD authorize_account 16 LOAD reset_allow_update 4 LOAD verify_new_pin 2 LOAD save_temporary_pin 1 LOAD reset_incorrect 0 +LOAD reset_invalid_pin 6 MOUT change_pin 1 MOUT reset_pin 2 MOUT back 0 diff --git a/services/registration/pp.csv b/services/registration/pp.csv index aa1eb05..e34de5d 100644 --- a/services/registration/pp.csv +++ b/services/registration/pp.csv @@ -29,4 +29,5 @@ flag,flag_location_set,35,this is set when the location of the profile is set flag,flag_offerings_set,36,this is set when the offerings of the profile is set flag,flag_back_set,37,this is set when it is a back navigation flag,flag_account_blocked,38,this is set when an account has been blocked after the allowed incorrect PIN attempts have been exceeded - +flag,flag_invalid_pin,39,this is set when the given PIN is invalid(is less than or more than 4 digits) +flag,flag_alias_set,40,this is set when an account alias has been assigned to a user diff --git a/services/registration/update_alias b/services/registration/update_alias new file mode 100644 index 0000000..30f4a65 --- /dev/null +++ b/services/registration/update_alias @@ -0,0 +1 @@ +Your alias has been updated successfully \ No newline at end of file diff --git a/services/registration/update_alias.vis b/services/registration/update_alias.vis new file mode 100644 index 0000000..fcbfc17 --- /dev/null +++ b/services/registration/update_alias.vis @@ -0,0 +1,7 @@ +LOAD confirm_new_alias 0 +RELOAD confirm_new_alias +MOUT back 0 +MOUT quit 9 +HALT +INCMP ^ 0 +INCMP quit 9 diff --git a/services/registration/update_alias_swa b/services/registration/update_alias_swa new file mode 100644 index 0000000..bc60faf --- /dev/null +++ b/services/registration/update_alias_swa @@ -0,0 +1 @@ +Ombi lako la kubadilisha lakabu limefanikiwa. \ No newline at end of file diff --git a/services/remote.go b/services/remote.go index baad08f..07e78fe 100644 --- a/services/remote.go +++ b/services/remote.go @@ -14,6 +14,6 @@ import ( func New(ctx context.Context, storageService storage.StorageService) remote.AccountService { return &httpremote.HTTPAccountService{ SS: storageService, - UseApi: false, + UseApi: true, } } diff --git a/store/db/db.go b/store/db/db.go index 10f360a..73c9c5d 100644 --- a/store/db/db.go +++ b/store/db/db.go @@ -130,7 +130,8 @@ func StringToDataTyp(str string) (DataTyp, error) { return DATA_GENDER, nil case "DATA_OFFERINGS": return DATA_OFFERINGS, nil - + case "DATA_ACCOUNT_ALIAS": + return DATA_ACCOUNT_ALIAS, nil default: return 0, errors.New("invalid DataTyp string") }