Compare commits
4 Commits
a11ca2a618
...
79bf09f3d1
Author | SHA1 | Date | |
---|---|---|---|
79bf09f3d1 | |||
f4804546d9 | |||
3fff03a164 | |||
094866c129 |
4
go.mod
4
go.mod
@ -3,10 +3,10 @@ module git.grassecon.net/grassrootseconomics/sarafu-vise
|
||||
go 1.23.4
|
||||
|
||||
require (
|
||||
git.defalsify.org/vise.git v0.3.2-0.20250401123711-d481b04a6805
|
||||
git.defalsify.org/vise.git v0.3.2-0.20250407143413-e55cf9bcb7d2
|
||||
git.grassecon.net/grassrootseconomics/common v0.0.0-20250121134736-ba8cbbccea7d
|
||||
git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250310093912-8145b4bd004b
|
||||
git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.2
|
||||
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
|
||||
github.com/gofrs/uuid v4.4.0+incompatible
|
||||
|
10
go.sum
10
go.sum
@ -1,13 +1,11 @@
|
||||
git.defalsify.org/vise.git v0.3.1 h1:A6FhMcur09ft/JzUPGXR+KpA17fltfeBnasyvLMZmq4=
|
||||
git.defalsify.org/vise.git v0.3.1/go.mod h1:jyBMe1qTYUz3mmuoC9JQ/TvFeW0vTanCUcPu3H8p4Ck=
|
||||
git.defalsify.org/vise.git v0.3.2-0.20250401123711-d481b04a6805 h1:FnT39aqXcP5YWhwPDBABopSjCu2SlbPFoOVitSpAVxU=
|
||||
git.defalsify.org/vise.git v0.3.2-0.20250401123711-d481b04a6805/go.mod h1:jyBMe1qTYUz3mmuoC9JQ/TvFeW0vTanCUcPu3H8p4Ck=
|
||||
git.defalsify.org/vise.git v0.3.2-0.20250407143413-e55cf9bcb7d2 h1:kbiDZtvphEKsTAnebrB6QxRbB7zdoTHSmzzumXrJ4hw=
|
||||
git.defalsify.org/vise.git v0.3.2-0.20250407143413-e55cf9bcb7d2/go.mod h1:jyBMe1qTYUz3mmuoC9JQ/TvFeW0vTanCUcPu3H8p4Ck=
|
||||
git.grassecon.net/grassrootseconomics/common v0.0.0-20250121134736-ba8cbbccea7d h1:5mzLas+jxTUtusOKx4XvU+n2QvrV/mH17MnJRy46siQ=
|
||||
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.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.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 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=
|
||||
git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250129070628-5a539172c694/go.mod h1:DpibtYpnT3nG4Kn556hRAkdu4+CtiI/6MbnQHal51mQ=
|
||||
github.com/alecthomas/assert/v2 v2.2.2 h1:Z/iVC0xZfWTaFNE6bA3z07T86hd45Xe2eLt6WVy2bbk=
|
||||
|
@ -77,12 +77,13 @@ type MenuHandlers struct {
|
||||
flagManager *FlagManager
|
||||
accountService remote.AccountService
|
||||
prefixDb storedb.PrefixDb
|
||||
logDb store.LogDb
|
||||
profile *profile.Profile
|
||||
ReplaceSeparatorFunc func(string) string
|
||||
}
|
||||
|
||||
// NewHandlers creates a new instance of the Handlers struct with the provided dependencies.
|
||||
func NewMenuHandlers(appFlags *FlagManager, userdataStore db.Db, accountService remote.AccountService, replaceSeparatorFunc func(string) string) (*MenuHandlers, error) {
|
||||
func NewMenuHandlers(appFlags *FlagManager, userdataStore db.Db, logdb db.Db, accountService remote.AccountService, replaceSeparatorFunc func(string) string) (*MenuHandlers, error) {
|
||||
if userdataStore == nil {
|
||||
return nil, fmt.Errorf("cannot create handler with nil userdata store")
|
||||
}
|
||||
@ -90,6 +91,10 @@ func NewMenuHandlers(appFlags *FlagManager, userdataStore db.Db, accountService
|
||||
Db: userdataStore,
|
||||
}
|
||||
|
||||
logDb := store.LogDb{
|
||||
Db: logdb,
|
||||
}
|
||||
|
||||
// Instantiate the SubPrefixDb with "DATATYPE_USERDATA" prefix
|
||||
prefix := storedb.ToBytes(db.DATATYPE_USERDATA)
|
||||
prefixDb := storedb.NewSubPrefixDb(userdataStore, prefix)
|
||||
@ -99,6 +104,7 @@ func NewMenuHandlers(appFlags *FlagManager, userdataStore db.Db, accountService
|
||||
flagManager: appFlags,
|
||||
accountService: accountService,
|
||||
prefixDb: prefixDb,
|
||||
logDb: logDb,
|
||||
profile: &profile.Profile{Max: 6},
|
||||
ReplaceSeparatorFunc: replaceSeparatorFunc,
|
||||
}
|
||||
@ -199,11 +205,16 @@ func (h *MenuHandlers) createAccountNoExist(ctx context.Context, sessionId strin
|
||||
storedb.DATA_ACCOUNT_ALIAS: "",
|
||||
}
|
||||
store := h.userdataStore
|
||||
logdb := h.logDb
|
||||
for key, value := range data {
|
||||
err = store.WriteEntry(ctx, sessionId, key, []byte(value))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
err = logdb.WriteLogEntry(ctx, sessionId, key, []byte(value))
|
||||
if err != nil {
|
||||
logg.DebugCtxf(ctx, "Failed to write log entry", "key", string(key), "value", value)
|
||||
}
|
||||
}
|
||||
publicKeyNormalized, err := hex.NormalizeHex(publicKey)
|
||||
if err != nil {
|
||||
@ -213,6 +224,12 @@ func (h *MenuHandlers) createAccountNoExist(ctx context.Context, sessionId strin
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
err = logdb.WriteLogEntry(ctx, sessionId, storedb.DATA_PUBLIC_KEY_REVERSE, []byte(sessionId))
|
||||
if err != nil {
|
||||
logg.DebugCtxf(ctx, "Failed to write log entry", "key", storedb.DATA_PUBLIC_KEY_REVERSE, "value", sessionId)
|
||||
}
|
||||
|
||||
res.FlagSet = append(res.FlagSet, flag_account_created)
|
||||
return nil
|
||||
}
|
||||
@ -509,6 +526,7 @@ func (h *MenuHandlers) ConfirmPinChange(ctx context.Context, sym string, input [
|
||||
}
|
||||
|
||||
store := h.userdataStore
|
||||
logdb := h.logDb
|
||||
hashedTemporaryPin, err := store.ReadEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE)
|
||||
if err != nil {
|
||||
logg.ErrorCtxf(ctx, "failed to read hashedTemporaryPin entry with", "key", storedb.DATA_TEMPORARY_VALUE, "error", err)
|
||||
@ -532,6 +550,10 @@ func (h *MenuHandlers) ConfirmPinChange(ctx context.Context, sym string, input [
|
||||
logg.ErrorCtxf(ctx, "failed to write DATA_ACCOUNT_PIN entry with", "key", storedb.DATA_ACCOUNT_PIN, "hashedPIN value", hashedTemporaryPin, "error", err)
|
||||
return res, err
|
||||
}
|
||||
err = logdb.WriteLogEntry(ctx, sessionId, storedb.DATA_ACCOUNT_PIN, []byte(hashedTemporaryPin))
|
||||
if err != nil {
|
||||
logg.DebugCtxf(ctx, "Failed to write hashed PIN db log entry", "key", storedb.DATA_ACCOUNT_PIN, "value", hashedTemporaryPin)
|
||||
}
|
||||
|
||||
return res, nil
|
||||
}
|
||||
@ -731,7 +753,10 @@ func (h *MenuHandlers) SaveFirstname(ctx context.Context, sym string, input []by
|
||||
return res, fmt.Errorf("missing session")
|
||||
}
|
||||
firstName := string(input)
|
||||
|
||||
store := h.userdataStore
|
||||
logdb := h.logDb
|
||||
|
||||
flag_allow_update, _ := h.flagManager.GetFlag("flag_allow_update")
|
||||
flag_firstname_set, _ := h.flagManager.GetFlag("flag_firstname_set")
|
||||
|
||||
@ -749,6 +774,11 @@ func (h *MenuHandlers) SaveFirstname(ctx context.Context, sym string, input []by
|
||||
return res, err
|
||||
}
|
||||
res.FlagSet = append(res.FlagSet, flag_firstname_set)
|
||||
|
||||
err = logdb.WriteLogEntry(ctx, sessionId, storedb.DATA_FIRST_NAME, []byte(temporaryFirstName))
|
||||
if err != nil {
|
||||
logg.DebugCtxf(ctx, "Failed to write firtname db log entry", "key", storedb.DATA_FIRST_NAME, "value", temporaryFirstName)
|
||||
}
|
||||
} else {
|
||||
if firstNameSet {
|
||||
err = store.WriteEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE, []byte(firstName))
|
||||
@ -774,6 +804,7 @@ func (h *MenuHandlers) SaveFamilyname(ctx context.Context, sym string, input []b
|
||||
}
|
||||
|
||||
store := h.userdataStore
|
||||
logdb := h.logDb
|
||||
familyName := string(input)
|
||||
|
||||
flag_allow_update, _ := h.flagManager.GetFlag("flag_allow_update")
|
||||
@ -793,6 +824,11 @@ func (h *MenuHandlers) SaveFamilyname(ctx context.Context, sym string, input []b
|
||||
return res, err
|
||||
}
|
||||
res.FlagSet = append(res.FlagSet, flag_familyname_set)
|
||||
|
||||
err = logdb.WriteLogEntry(ctx, sessionId, storedb.DATA_FAMILY_NAME, []byte(temporaryFamilyName))
|
||||
if err != nil {
|
||||
logg.DebugCtxf(ctx, "Failed to write firtname db log entry", "key", storedb.DATA_FAMILY_NAME, "value", temporaryFamilyName)
|
||||
}
|
||||
} else {
|
||||
if familyNameSet {
|
||||
err = store.WriteEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE, []byte(familyName))
|
||||
@ -849,6 +885,8 @@ func (h *MenuHandlers) SaveYob(ctx context.Context, sym string, input []byte) (r
|
||||
}
|
||||
yob := string(input)
|
||||
store := h.userdataStore
|
||||
logdb := h.logDb
|
||||
|
||||
flag_allow_update, _ := h.flagManager.GetFlag("flag_allow_update")
|
||||
flag_yob_set, _ := h.flagManager.GetFlag("flag_yob_set")
|
||||
|
||||
@ -867,6 +905,11 @@ func (h *MenuHandlers) SaveYob(ctx context.Context, sym string, input []byte) (r
|
||||
return res, err
|
||||
}
|
||||
res.FlagSet = append(res.FlagSet, flag_yob_set)
|
||||
|
||||
err = logdb.WriteLogEntry(ctx, sessionId, storedb.DATA_YOB, []byte(temporaryYob))
|
||||
if err != nil {
|
||||
logg.DebugCtxf(ctx, "Failed to write yob db log entry", "key", storedb.DATA_YOB, "value", temporaryYob)
|
||||
}
|
||||
} else {
|
||||
if yobSet {
|
||||
err = store.WriteEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE, []byte(yob))
|
||||
@ -892,6 +935,7 @@ func (h *MenuHandlers) SaveLocation(ctx context.Context, sym string, input []byt
|
||||
}
|
||||
location := string(input)
|
||||
store := h.userdataStore
|
||||
logdb := h.logDb
|
||||
|
||||
flag_allow_update, _ := h.flagManager.GetFlag("flag_allow_update")
|
||||
flag_location_set, _ := h.flagManager.GetFlag("flag_location_set")
|
||||
@ -910,6 +954,11 @@ func (h *MenuHandlers) SaveLocation(ctx context.Context, sym string, input []byt
|
||||
return res, err
|
||||
}
|
||||
res.FlagSet = append(res.FlagSet, flag_location_set)
|
||||
|
||||
err = logdb.WriteLogEntry(ctx, sessionId, storedb.DATA_LOCATION, []byte(temporaryLocation))
|
||||
if err != nil {
|
||||
logg.DebugCtxf(ctx, "Failed to write location db log entry", "key", storedb.DATA_LOCATION, "value", temporaryLocation)
|
||||
}
|
||||
} else {
|
||||
if locationSet {
|
||||
err = store.WriteEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE, []byte(location))
|
||||
@ -937,6 +986,7 @@ func (h *MenuHandlers) SaveGender(ctx context.Context, sym string, input []byte)
|
||||
}
|
||||
gender := strings.Split(symbol, "_")[1]
|
||||
store := h.userdataStore
|
||||
logdb := h.logDb
|
||||
flag_allow_update, _ := h.flagManager.GetFlag("flag_allow_update")
|
||||
flag_gender_set, _ := h.flagManager.GetFlag("flag_gender_set")
|
||||
|
||||
@ -955,6 +1005,12 @@ func (h *MenuHandlers) SaveGender(ctx context.Context, sym string, input []byte)
|
||||
return res, err
|
||||
}
|
||||
res.FlagSet = append(res.FlagSet, flag_gender_set)
|
||||
|
||||
err = logdb.WriteLogEntry(ctx, sessionId, storedb.DATA_GENDER, []byte(temporaryGender))
|
||||
if err != nil {
|
||||
logg.DebugCtxf(ctx, "Failed to write gender db log entry", "key", storedb.DATA_TEMPORARY_VALUE, "value", temporaryGender)
|
||||
}
|
||||
|
||||
} else {
|
||||
if genderSet {
|
||||
err = store.WriteEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE, []byte(gender))
|
||||
@ -981,6 +1037,7 @@ func (h *MenuHandlers) SaveOfferings(ctx context.Context, sym string, input []by
|
||||
|
||||
offerings := string(input)
|
||||
store := h.userdataStore
|
||||
logdb := h.logDb
|
||||
|
||||
flag_allow_update, _ := h.flagManager.GetFlag("flag_allow_update")
|
||||
flag_offerings_set, _ := h.flagManager.GetFlag("flag_offerings_set")
|
||||
@ -1000,6 +1057,11 @@ func (h *MenuHandlers) SaveOfferings(ctx context.Context, sym string, input []by
|
||||
return res, err
|
||||
}
|
||||
res.FlagSet = append(res.FlagSet, flag_offerings_set)
|
||||
|
||||
err = logdb.WriteLogEntry(ctx, sessionId, storedb.DATA_FIRST_NAME, []byte(temporaryOfferings))
|
||||
if err != nil {
|
||||
logg.DebugCtxf(ctx, "Failed to write offerings db log entry", "key", storedb.DATA_OFFERINGS, "value", offerings)
|
||||
}
|
||||
} else {
|
||||
if offeringsSet {
|
||||
err = store.WriteEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE, []byte(offerings))
|
||||
@ -1960,6 +2022,7 @@ func (h *MenuHandlers) InitiateTransaction(ctx context.Context, sym string, inpu
|
||||
func (h *MenuHandlers) ManageVouchers(ctx context.Context, sym string, input []byte) (resource.Result, error) {
|
||||
var res resource.Result
|
||||
userStore := h.userdataStore
|
||||
logdb := h.logDb
|
||||
|
||||
sessionId, ok := ctx.Value("SessionId").(string)
|
||||
if !ok {
|
||||
@ -2014,6 +2077,10 @@ func (h *MenuHandlers) ManageVouchers(ctx context.Context, sym string, input []b
|
||||
logg.ErrorCtxf(ctx, "Failed to write active voucher data", "key", key, "error", err)
|
||||
return res, err
|
||||
}
|
||||
err = logdb.WriteLogEntry(ctx, sessionId, key, []byte(value))
|
||||
if err != nil {
|
||||
logg.DebugCtxf(ctx, "Failed to write voucher db log entry", "key", key, "value", value)
|
||||
}
|
||||
}
|
||||
|
||||
logg.InfoCtxf(ctx, "Default voucher set", "symbol", defaultSym, "balance", defaultBal, "decimals", defaultDec, "address", defaultAddr)
|
||||
@ -2210,6 +2277,7 @@ func (h *MenuHandlers) CheckTransactions(ctx context.Context, sym string, input
|
||||
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)
|
||||
@ -2249,6 +2317,10 @@ func (h *MenuHandlers) CheckTransactions(ctx context.Context, sym string, input
|
||||
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)
|
||||
@ -2531,6 +2603,7 @@ func (h *MenuHandlers) GetSuggestedAlias(ctx context.Context, sym string, input
|
||||
func (h *MenuHandlers) ConfirmNewAlias(ctx context.Context, sym string, input []byte) (resource.Result, error) {
|
||||
var res resource.Result
|
||||
store := h.userdataStore
|
||||
logdb := h.logDb
|
||||
|
||||
flag_alias_set, _ := h.flagManager.GetFlag("flag_alias_set")
|
||||
|
||||
@ -2549,6 +2622,11 @@ func (h *MenuHandlers) ConfirmNewAlias(ctx context.Context, sym string, input []
|
||||
return res, err
|
||||
}
|
||||
|
||||
err = logdb.WriteLogEntry(ctx, sessionId, storedb.DATA_ACCOUNT_ALIAS, []byte(newAlias))
|
||||
if err != nil {
|
||||
logg.DebugCtxf(ctx, "Failed to write account alias db log entry", "key", storedb.DATA_ACCOUNT_ALIAS, "value", newAlias)
|
||||
}
|
||||
|
||||
res.FlagSet = append(res.FlagSet, flag_alias_set)
|
||||
return res, nil
|
||||
}
|
||||
|
@ -27,6 +27,7 @@ type LocalHandlerService struct {
|
||||
DbRs *resource.DbResource
|
||||
Pe *persist.Persister
|
||||
UserdataStore *db.Db
|
||||
LogDb *db.Db
|
||||
Cfg engine.Config
|
||||
Rs resource.Resource
|
||||
first resource.EntryFunc
|
||||
@ -57,12 +58,16 @@ func (ls *LocalHandlerService) SetDataStore(db *db.Db) {
|
||||
ls.UserdataStore = db
|
||||
}
|
||||
|
||||
func (ls *LocalHandlerService) SetLogDb(db *db.Db) {
|
||||
ls.LogDb = db
|
||||
}
|
||||
|
||||
func (ls *LocalHandlerService) GetHandler(accountService remote.AccountService) (*application.MenuHandlers, error) {
|
||||
replaceSeparatorFunc := func(input string) string {
|
||||
return strings.ReplaceAll(input, ":", ls.Cfg.MenuSeparator)
|
||||
}
|
||||
|
||||
appHandlers, err := application.NewMenuHandlers(ls.Parser, *ls.UserdataStore, accountService, replaceSeparatorFunc)
|
||||
appHandlers, err := application.NewMenuHandlers(ls.Parser, *ls.UserdataStore, *ls.LogDb, accountService, replaceSeparatorFunc)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
27
store/log_db.go
Normal file
27
store/log_db.go
Normal file
@ -0,0 +1,27 @@
|
||||
package store
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
visedb "git.defalsify.org/vise.git/db"
|
||||
"git.grassecon.net/grassrootseconomics/sarafu-vise/store/db"
|
||||
storedb "git.grassecon.net/grassrootseconomics/sarafu-vise/store/db"
|
||||
)
|
||||
|
||||
type LogDb struct {
|
||||
visedb.Db
|
||||
}
|
||||
|
||||
func (db *LogDb) WriteLogEntry(ctx context.Context, sessionId string, typ db.DataTyp, v []byte) error {
|
||||
db.SetPrefix(visedb.DATATYPE_USERDATA)
|
||||
db.SetSession(sessionId)
|
||||
k := storedb.ToBytes(typ)
|
||||
return db.Put(ctx, k, v)
|
||||
}
|
||||
|
||||
func (db *LogDb) ReadLogEntry(ctx context.Context, sessionId string, typ db.DataTyp) ([]byte, error) {
|
||||
db.SetPrefix(visedb.DATATYPE_USERDATA)
|
||||
db.SetSession(sessionId)
|
||||
k := storedb.ToBytes(typ)
|
||||
return db.Get(ctx, k)
|
||||
}
|
Loading…
Reference in New Issue
Block a user