project-tidyup - menuhandler and tests #90
@ -1919,184 +1919,6 @@ func (h *MenuHandlers) SetPool(ctx context.Context, sym string, input []byte) (r
|
|||||||
return res, nil
|
return res, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// CheckTransactions retrieves the transactions from the API using the "PublicKey" and stores to prefixDb.
|
|
||||||
func (h *MenuHandlers) CheckTransactions(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")
|
|
||||||
}
|
|
||||||
|
|
||||||
flag_no_transfers, _ := h.flagManager.GetFlag("flag_no_transfers")
|
|
||||||
flag_api_error, _ := h.flagManager.GetFlag("flag_api_error")
|
|
||||||
|
|
||||||
userStore := h.userdataStore
|
|
||||||
logdb := h.logDb
|
|
||||||
publicKey, err := userStore.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
|
|
||||||
}
|
|
||||||
|
|
||||||
// Fetch transactions from the API using the public key
|
|
||||||
transactionsResp, err := h.accountService.FetchTransactions(ctx, string(publicKey))
|
|
||||||
if err != nil {
|
|
||||||
res.FlagSet = append(res.FlagSet, flag_api_error)
|
|
||||||
logg.ErrorCtxf(ctx, "failed on FetchTransactions", "error", err)
|
|
||||||
return res, err
|
|
||||||
}
|
|
||||||
res.FlagReset = append(res.FlagReset, flag_api_error)
|
|
||||||
|
|
||||||
// Return if there are no transactions
|
|
||||||
if len(transactionsResp) == 0 {
|
|
||||||
res.FlagSet = append(res.FlagSet, flag_no_transfers)
|
|
||||||
return res, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
data := store.ProcessTransfers(transactionsResp)
|
|
||||||
|
|
||||||
// Store all transaction data
|
|
||||||
dataMap := map[storedb.DataTyp]string{
|
|
||||||
storedb.DATA_TX_SENDERS: data.Senders,
|
|
||||||
storedb.DATA_TX_RECIPIENTS: data.Recipients,
|
|
||||||
storedb.DATA_TX_VALUES: data.TransferValues,
|
|
||||||
storedb.DATA_TX_ADDRESSES: data.Addresses,
|
|
||||||
storedb.DATA_TX_HASHES: data.TxHashes,
|
|
||||||
storedb.DATA_TX_DATES: data.Dates,
|
|
||||||
storedb.DATA_TX_SYMBOLS: data.Symbols,
|
|
||||||
storedb.DATA_TX_DECIMALS: data.Decimals,
|
|
||||||
}
|
|
||||||
|
|
||||||
for key, value := range dataMap {
|
|
||||||
if err := h.prefixDb.Put(ctx, []byte(storedb.ToBytes(key)), []byte(value)); err != nil {
|
|
||||||
logg.ErrorCtxf(ctx, "failed to write to prefixDb", "error", err)
|
|
||||||
return res, err
|
|
||||||
}
|
|
||||||
err = logdb.WriteLogEntry(ctx, sessionId, key, []byte(value))
|
|
||||||
if err != nil {
|
|
||||||
logg.DebugCtxf(ctx, "Failed to write tx db log entry", "key", key, "value", value)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
res.FlagReset = append(res.FlagReset, flag_no_transfers)
|
|
||||||
|
|
||||||
return res, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetTransactionsList fetches the list of transactions and formats them.
|
|
||||||
func (h *MenuHandlers) GetTransactionsList(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")
|
|
||||||
}
|
|
||||||
|
|
||||||
userStore := h.userdataStore
|
|
||||||
publicKey, err := userStore.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
|
|
||||||
}
|
|
||||||
|
|
||||||
// Read transactions from the store and format them
|
|
||||||
TransactionSenders, err := h.prefixDb.Get(ctx, storedb.ToBytes(storedb.DATA_TX_SENDERS))
|
|
||||||
if err != nil {
|
|
||||||
logg.ErrorCtxf(ctx, "Failed to read the TransactionSenders from prefixDb", "error", err)
|
|
||||||
return res, err
|
|
||||||
}
|
|
||||||
TransactionSyms, err := h.prefixDb.Get(ctx, storedb.ToBytes(storedb.DATA_TX_SYMBOLS))
|
|
||||||
if err != nil {
|
|
||||||
logg.ErrorCtxf(ctx, "Failed to read the TransactionSyms from prefixDb", "error", err)
|
|
||||||
return res, err
|
|
||||||
}
|
|
||||||
TransactionValues, err := h.prefixDb.Get(ctx, storedb.ToBytes(storedb.DATA_TX_VALUES))
|
|
||||||
if err != nil {
|
|
||||||
logg.ErrorCtxf(ctx, "Failed to read the TransactionValues from prefixDb", "error", err)
|
|
||||||
return res, err
|
|
||||||
}
|
|
||||||
TransactionDates, err := h.prefixDb.Get(ctx, storedb.ToBytes(storedb.DATA_TX_DATES))
|
|
||||||
if err != nil {
|
|
||||||
logg.ErrorCtxf(ctx, "Failed to read the TransactionDates from prefixDb", "error", err)
|
|
||||||
return res, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Parse the data
|
|
||||||
senders := strings.Split(string(TransactionSenders), "\n")
|
|
||||||
syms := strings.Split(string(TransactionSyms), "\n")
|
|
||||||
values := strings.Split(string(TransactionValues), "\n")
|
|
||||||
dates := strings.Split(string(TransactionDates), "\n")
|
|
||||||
|
|
||||||
var formattedTransactions []string
|
|
||||||
for i := 0; i < len(senders); i++ {
|
|
||||||
sender := strings.TrimSpace(senders[i])
|
|
||||||
sym := strings.TrimSpace(syms[i])
|
|
||||||
value := strings.TrimSpace(values[i])
|
|
||||||
date := strings.Split(strings.TrimSpace(dates[i]), " ")[0]
|
|
||||||
|
|
||||||
status := "Received"
|
|
||||||
if sender == string(publicKey) {
|
|
||||||
status = "Sent"
|
|
||||||
}
|
|
||||||
|
|
||||||
// Use the ReplaceSeparator function for the menu separator
|
|
||||||
transactionLine := fmt.Sprintf("%d%s%s %s %s %s", i+1, h.ReplaceSeparatorFunc(":"), status, value, sym, date)
|
|
||||||
formattedTransactions = append(formattedTransactions, transactionLine)
|
|
||||||
}
|
|
||||||
|
|
||||||
res.Content = strings.Join(formattedTransactions, "\n")
|
|
||||||
|
|
||||||
return res, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ViewTransactionStatement retrieves the transaction statement
|
|
||||||
// and displays it to the user.
|
|
||||||
func (h *MenuHandlers) ViewTransactionStatement(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")
|
|
||||||
}
|
|
||||||
userStore := h.userdataStore
|
|
||||||
publicKey, err := userStore.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
|
|
||||||
}
|
|
||||||
|
|
||||||
flag_incorrect_statement, _ := h.flagManager.GetFlag("flag_incorrect_statement")
|
|
||||||
|
|
||||||
inputStr := string(input)
|
|
||||||
if inputStr == "0" || inputStr == "99" || inputStr == "11" || inputStr == "22" {
|
|
||||||
res.FlagReset = append(res.FlagReset, flag_incorrect_statement)
|
|
||||||
return res, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Convert input string to integer
|
|
||||||
index, err := strconv.Atoi(strings.TrimSpace(inputStr))
|
|
||||||
if err != nil {
|
|
||||||
return res, fmt.Errorf("invalid input: must be a number between 1 and 10")
|
|
||||||
}
|
|
||||||
|
|
||||||
if index < 1 || index > 10 {
|
|
||||||
return res, fmt.Errorf("invalid input: index must be between 1 and 10")
|
|
||||||
}
|
|
||||||
|
|
||||||
statement, err := store.GetTransferData(ctx, h.prefixDb, string(publicKey), index)
|
|
||||||
if err != nil {
|
|
||||||
return res, fmt.Errorf("failed to retrieve transfer data: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
if statement == "" {
|
|
||||||
res.FlagSet = append(res.FlagSet, flag_incorrect_statement)
|
|
||||||
return res, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
res.FlagReset = append(res.FlagReset, flag_incorrect_statement)
|
|
||||||
res.Content = statement
|
|
||||||
|
|
||||||
return res, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// persistInitialLanguageCode receives an initial language code and persists it to the store
|
// persistInitialLanguageCode receives an initial language code and persists it to the store
|
||||||
func (h *MenuHandlers) persistInitialLanguageCode(ctx context.Context, sessionId string, code string) error {
|
func (h *MenuHandlers) persistInitialLanguageCode(ctx context.Context, sessionId string, code string) error {
|
||||||
store := h.userdataStore
|
store := h.userdataStore
|
||||||
|
190
handlers/application/transactions.go
Normal file
190
handlers/application/transactions.go
Normal file
@ -0,0 +1,190 @@
|
|||||||
|
package application
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"git.defalsify.org/vise.git/resource"
|
||||||
|
"git.grassecon.net/grassrootseconomics/sarafu-vise/store"
|
||||||
|
storedb "git.grassecon.net/grassrootseconomics/sarafu-vise/store/db"
|
||||||
|
)
|
||||||
|
|
||||||
|
// CheckTransactions retrieves the transactions from the API using the "PublicKey" and stores to prefixDb.
|
||||||
|
func (h *MenuHandlers) CheckTransactions(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")
|
||||||
|
}
|
||||||
|
|
||||||
|
flag_no_transfers, _ := h.flagManager.GetFlag("flag_no_transfers")
|
||||||
|
flag_api_error, _ := h.flagManager.GetFlag("flag_api_error")
|
||||||
|
|
||||||
|
userStore := h.userdataStore
|
||||||
|
logdb := h.logDb
|
||||||
|
publicKey, err := userStore.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
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fetch transactions from the API using the public key
|
||||||
|
transactionsResp, err := h.accountService.FetchTransactions(ctx, string(publicKey))
|
||||||
|
if err != nil {
|
||||||
|
res.FlagSet = append(res.FlagSet, flag_api_error)
|
||||||
|
logg.ErrorCtxf(ctx, "failed on FetchTransactions", "error", err)
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
res.FlagReset = append(res.FlagReset, flag_api_error)
|
||||||
|
|
||||||
|
// Return if there are no transactions
|
||||||
|
if len(transactionsResp) == 0 {
|
||||||
|
res.FlagSet = append(res.FlagSet, flag_no_transfers)
|
||||||
|
return res, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
data := store.ProcessTransfers(transactionsResp)
|
||||||
|
|
||||||
|
// Store all transaction data
|
||||||
|
dataMap := map[storedb.DataTyp]string{
|
||||||
|
storedb.DATA_TX_SENDERS: data.Senders,
|
||||||
|
storedb.DATA_TX_RECIPIENTS: data.Recipients,
|
||||||
|
storedb.DATA_TX_VALUES: data.TransferValues,
|
||||||
|
storedb.DATA_TX_ADDRESSES: data.Addresses,
|
||||||
|
storedb.DATA_TX_HASHES: data.TxHashes,
|
||||||
|
storedb.DATA_TX_DATES: data.Dates,
|
||||||
|
storedb.DATA_TX_SYMBOLS: data.Symbols,
|
||||||
|
storedb.DATA_TX_DECIMALS: data.Decimals,
|
||||||
|
}
|
||||||
|
|
||||||
|
for key, value := range dataMap {
|
||||||
|
if err := h.prefixDb.Put(ctx, []byte(storedb.ToBytes(key)), []byte(value)); err != nil {
|
||||||
|
logg.ErrorCtxf(ctx, "failed to write to prefixDb", "error", err)
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
err = logdb.WriteLogEntry(ctx, sessionId, key, []byte(value))
|
||||||
|
if err != nil {
|
||||||
|
logg.DebugCtxf(ctx, "Failed to write tx db log entry", "key", key, "value", value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
res.FlagReset = append(res.FlagReset, flag_no_transfers)
|
||||||
|
|
||||||
|
return res, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetTransactionsList fetches the list of transactions and formats them.
|
||||||
|
func (h *MenuHandlers) GetTransactionsList(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")
|
||||||
|
}
|
||||||
|
|
||||||
|
userStore := h.userdataStore
|
||||||
|
publicKey, err := userStore.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
|
||||||
|
}
|
||||||
|
|
||||||
|
// Read transactions from the store and format them
|
||||||
|
TransactionSenders, err := h.prefixDb.Get(ctx, storedb.ToBytes(storedb.DATA_TX_SENDERS))
|
||||||
|
if err != nil {
|
||||||
|
logg.ErrorCtxf(ctx, "Failed to read the TransactionSenders from prefixDb", "error", err)
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
TransactionSyms, err := h.prefixDb.Get(ctx, storedb.ToBytes(storedb.DATA_TX_SYMBOLS))
|
||||||
|
if err != nil {
|
||||||
|
logg.ErrorCtxf(ctx, "Failed to read the TransactionSyms from prefixDb", "error", err)
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
TransactionValues, err := h.prefixDb.Get(ctx, storedb.ToBytes(storedb.DATA_TX_VALUES))
|
||||||
|
if err != nil {
|
||||||
|
logg.ErrorCtxf(ctx, "Failed to read the TransactionValues from prefixDb", "error", err)
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
TransactionDates, err := h.prefixDb.Get(ctx, storedb.ToBytes(storedb.DATA_TX_DATES))
|
||||||
|
if err != nil {
|
||||||
|
logg.ErrorCtxf(ctx, "Failed to read the TransactionDates from prefixDb", "error", err)
|
||||||
|
return res, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Parse the data
|
||||||
|
senders := strings.Split(string(TransactionSenders), "\n")
|
||||||
|
syms := strings.Split(string(TransactionSyms), "\n")
|
||||||
|
values := strings.Split(string(TransactionValues), "\n")
|
||||||
|
dates := strings.Split(string(TransactionDates), "\n")
|
||||||
|
|
||||||
|
var formattedTransactions []string
|
||||||
|
for i := 0; i < len(senders); i++ {
|
||||||
|
sender := strings.TrimSpace(senders[i])
|
||||||
|
sym := strings.TrimSpace(syms[i])
|
||||||
|
value := strings.TrimSpace(values[i])
|
||||||
|
date := strings.Split(strings.TrimSpace(dates[i]), " ")[0]
|
||||||
|
|
||||||
|
status := "Received"
|
||||||
|
if sender == string(publicKey) {
|
||||||
|
status = "Sent"
|
||||||
|
}
|
||||||
|
|
||||||
|
// Use the ReplaceSeparator function for the menu separator
|
||||||
|
transactionLine := fmt.Sprintf("%d%s%s %s %s %s", i+1, h.ReplaceSeparatorFunc(":"), status, value, sym, date)
|
||||||
|
formattedTransactions = append(formattedTransactions, transactionLine)
|
||||||
|
}
|
||||||
|
|
||||||
|
res.Content = strings.Join(formattedTransactions, "\n")
|
||||||
|
|
||||||
|
return res, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// ViewTransactionStatement retrieves the transaction statement
|
||||||
|
// and displays it to the user.
|
||||||
|
func (h *MenuHandlers) ViewTransactionStatement(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")
|
||||||
|
}
|
||||||
|
userStore := h.userdataStore
|
||||||
|
publicKey, err := userStore.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
|
||||||
|
}
|
||||||
|
|
||||||
|
flag_incorrect_statement, _ := h.flagManager.GetFlag("flag_incorrect_statement")
|
||||||
|
|
||||||
|
inputStr := string(input)
|
||||||
|
if inputStr == "0" || inputStr == "99" || inputStr == "11" || inputStr == "22" {
|
||||||
|
res.FlagReset = append(res.FlagReset, flag_incorrect_statement)
|
||||||
|
return res, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Convert input string to integer
|
||||||
|
index, err := strconv.Atoi(strings.TrimSpace(inputStr))
|
||||||
|
if err != nil {
|
||||||
|
return res, fmt.Errorf("invalid input: must be a number between 1 and 10")
|
||||||
|
}
|
||||||
|
|
||||||
|
if index < 1 || index > 10 {
|
||||||
|
return res, fmt.Errorf("invalid input: index must be between 1 and 10")
|
||||||
|
}
|
||||||
|
|
||||||
|
statement, err := store.GetTransferData(ctx, h.prefixDb, string(publicKey), index)
|
||||||
|
if err != nil {
|
||||||
|
return res, fmt.Errorf("failed to retrieve transfer data: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if statement == "" {
|
||||||
|
res.FlagSet = append(res.FlagSet, flag_incorrect_statement)
|
||||||
|
return res, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
res.FlagReset = append(res.FlagReset, flag_incorrect_statement)
|
||||||
|
res.Content = statement
|
||||||
|
|
||||||
|
return res, nil
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user