diff --git a/cmd/africastalking/main.go b/cmd/africastalking/main.go index 3f7e372..2f34b56 100644 --- a/cmd/africastalking/main.go +++ b/cmd/africastalking/main.go @@ -44,6 +44,7 @@ func main() { var err error var gettextDir string var langs args.LangVar + var logDbConnStr string flag.BoolVar(&engineDebug, "d", false, "use engine debug output") flag.StringVar(&override.DbConn, "c", "?", "default connection string (replaces all unspecified strings)") @@ -55,6 +56,7 @@ func main() { flag.UintVar(&port, "p", config.Port(), "http port") flag.StringVar(&gettextDir, "gettext", "", "use gettext translations from given directory") flag.Var(&langs, "language", "add symbol resolution for language") + flag.StringVar(&logDbConnStr, "log-c", "db-logs", "log db connection string") flag.Parse() config.Apply(override) @@ -100,6 +102,11 @@ func main() { fmt.Fprintf(os.Stderr, "userdatadb: %v\n", err) os.Exit(1) } + logdb, err := menuStorageService.GetLogDb(ctx, userdataStore, logDbConnStr, "user-data") + if err != nil { + fmt.Fprintf(os.Stderr, "get log db error: %v\n", err) + os.Exit(1) + } dbResource, ok := rs.(*resource.DbResource) if !ok { @@ -113,6 +120,7 @@ func main() { os.Exit(1) } lhs.SetDataStore(&userdataStore) + lhs.SetLogDb(&logdb) if err != nil { fmt.Fprintf(os.Stderr, "setdatastore: %v\n", err) os.Exit(1) diff --git a/cmd/async/main.go b/cmd/async/main.go index 9a064a6..5bb6816 100644 --- a/cmd/async/main.go +++ b/cmd/async/main.go @@ -56,6 +56,7 @@ func main() { var err error var gettextDir string var langs args.LangVar + var logDbConnStr string flag.StringVar(&sessionId, "session-id", "075xx2123", "session id") flag.StringVar(&override.DbConn, "c", "?", "default connection string (replaces all unspecified strings)") @@ -69,6 +70,7 @@ func main() { flag.UintVar(&port, "p", config.Port(), "http port") flag.StringVar(&gettextDir, "gettext", "", "use gettext translations from given directory") flag.Var(&langs, "language", "add symbol resolution for language") + flag.StringVar(&logDbConnStr, "log-c", "db-logs", "log db connection string") flag.Parse() config.Apply(override) @@ -120,6 +122,12 @@ func main() { fmt.Fprintf(os.Stderr, err.Error()) os.Exit(1) } + + logdb, err := menuStorageService.GetLogDb(ctx, userdataStore, logDbConnStr, "user-data") + if err != nil { + fmt.Fprintf(os.Stderr, "get log db error: %v\n", err) + os.Exit(1) + } //defer userdataStore.Close(ctx) dbResource, ok := rs.(*resource.DbResource) @@ -129,6 +137,7 @@ func main() { lhs, err := handlers.NewLocalHandlerService(ctx, pfp, true, dbResource, cfg, rs) lhs.SetDataStore(&userdataStore) + lhs.SetLogDb(&logdb) accountService := services.New(ctx, menuStorageService) hl, err := lhs.GetHandler(accountService) diff --git a/cmd/http/main.go b/cmd/http/main.go index 13ef408..eed729a 100644 --- a/cmd/http/main.go +++ b/cmd/http/main.go @@ -43,6 +43,7 @@ func main() { var err error var gettextDir string var langs args.LangVar + var logDbConnStr string flag.StringVar(&override.DbConn, "c", "?", "default connection string (replaces all unspecified strings)") flag.StringVar(&override.UserConn, "userdata", "?", "userdata store connection string") @@ -55,6 +56,7 @@ func main() { flag.UintVar(&port, "p", config.Port(), "http port") flag.StringVar(&gettextDir, "gettext", "", "use gettext translations from given directory") flag.Var(&langs, "language", "add symbol resolution for language") + flag.StringVar(&logDbConnStr, "log-c", "db-logs", "log db connection string") flag.Parse() config.Apply(override) @@ -103,6 +105,12 @@ func main() { os.Exit(1) } + logdb, err := menuStorageService.GetLogDb(ctx, userdataStore, logDbConnStr, "user-data") + if err != nil { + fmt.Fprintf(os.Stderr, "get log db error: %v\n", err) + os.Exit(1) + } + dbResource, ok := rs.(*resource.DbResource) if !ok { os.Exit(1) @@ -110,6 +118,7 @@ func main() { lhs, err := handlers.NewLocalHandlerService(ctx, pfp, true, dbResource, cfg, rs) lhs.SetDataStore(&userdataStore) + lhs.SetLogDb(&logdb) if err != nil { fmt.Fprintf(os.Stderr, err.Error()) diff --git a/cmd/main.go b/cmd/main.go index a18bfab..1b40e32 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -36,6 +36,7 @@ func main() { var err error var gettextDir string var langs args.LangVar + var logDbConnStr string flag.StringVar(&sessionId, "session-id", "075xx2123", "session id") flag.StringVar(&override.DbConn, "c", "?", "default connection string (replaces all unspecified strings)") @@ -46,6 +47,7 @@ func main() { flag.UintVar(&size, "s", 160, "max size of output") flag.StringVar(&gettextDir, "gettext", "", "use gettext translations from given directory") flag.Var(&langs, "language", "add symbol resolution for language") + flag.StringVar(&logDbConnStr, "log-c", "db-logs", "log db connection string") flag.Parse() config.Apply(override) @@ -110,6 +112,12 @@ func main() { os.Exit(1) } + logdb, err := menuStorageService.GetLogDb(ctx, userdatastore, logDbConnStr, "user-data") + if err != nil { + fmt.Fprintf(os.Stderr, "get log db error: %v\n", err) + os.Exit(1) + } + dbResource, ok := rs.(*resource.DbResource) if !ok { fmt.Fprintf(os.Stderr, "get dbresource error: %v\n", err) @@ -118,6 +126,7 @@ func main() { lhs, err := handlers.NewLocalHandlerService(ctx, pfp, true, dbResource, cfg, rs) lhs.SetDataStore(&userdatastore) + lhs.SetLogDb(&logdb) lhs.SetPersister(pe) if err != nil { fmt.Fprintf(os.Stderr, "localhandler service error: %v\n", err) diff --git a/go.mod b/go.mod index 490fc8d..31b4dc1 100644 --- a/go.mod +++ b/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.20250425131748-8b84f59792ce 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.20250417201442-5c0ed48e678c - git.grassecon.net/grassrootseconomics/visedriver v0.9.0-beta.2 + git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250428082711-5d221b8d565f + 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 diff --git a/go.sum b/go.sum index 98ae1c9..1a2410d 100644 --- a/go.sum +++ b/go.sum @@ -1,31 +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.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.defalsify.org/vise.git v0.3.2-0.20250425131748-8b84f59792ce h1:Uke2jQ4wG97gQKnTzxPyBGyhosrU1IWnRNFHtKVrmrk= +git.defalsify.org/vise.git v0.3.2-0.20250425131748-8b84f59792ce/go.mod h1:jyBMe1qTYUz3mmuoC9JQ/TvFeW0vTanCUcPu3H8p4Ck= git.grassecon.net/grassrootseconomics/common v0.9.0-beta.1.0.20250417111317-2953f4c2f32e h1:DcC9qkNl9ny3hxQmsMK6W81+5R/j4ZwYUbvewMI/rlc= git.grassecon.net/grassrootseconomics/common v0.9.0-beta.1.0.20250417111317-2953f4c2f32e/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/sarafu-api v0.9.0-beta.1.0.20250401111804-2eed990921c5 h1:DwBZHP4sebfHxK8EU2nlA2CXU81+a7Kj/pnC5vDPcf4= -git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250401111804-2eed990921c5/go.mod h1:gOn89ipaDcDvmQXRMQYKUqcw/sJcwVOPVt2eC6Geip8= -git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250401115503-5b41c8dc6440 h1:eWrBZMM3pBMCFyRl4rO/aaR+OmOMFJxogNyFAFry+EM= -git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250401115503-5b41c8dc6440/go.mod h1:gOn89ipaDcDvmQXRMQYKUqcw/sJcwVOPVt2eC6Geip8= -git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250401122510-441e289854ad h1:tYjanaCf6mF+iXRtDx5gckQm5vhZYx9N/JlNIBZj1m0= -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/sarafu-api v0.9.0-beta.1.0.20250428082711-5d221b8d565f h1:OAHCP3YR1C5h1WFnnEnLs5kn6jTxQHQYWYtQaMZJIMY= +git.grassecon.net/grassrootseconomics/sarafu-api v0.9.0-beta.1.0.20250428082711-5d221b8d565f/go.mod h1:gOn89ipaDcDvmQXRMQYKUqcw/sJcwVOPVt2eC6Geip8= +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= diff --git a/handlers/application/menuhandler.go b/handlers/application/menuhandler.go index 73f5283..97b84ea 100644 --- a/handlers/application/menuhandler.go +++ b/handlers/application/menuhandler.go @@ -79,12 +79,13 @@ type MenuHandlers struct { accountService remote.AccountService prefixDb storedb.PrefixDb smsService sms.SmsService + 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") } @@ -96,6 +97,10 @@ func NewMenuHandlers(appFlags *FlagManager, userdataStore db.Db, accountService Userdatastore: *userDb, } + logDb := store.LogDb{ + Db: logdb, + } + // Instantiate the SubPrefixDb with "DATATYPE_USERDATA" prefix prefix := storedb.ToBytes(db.DATATYPE_USERDATA) prefixDb := storedb.NewSubPrefixDb(userdataStore, prefix) @@ -106,6 +111,7 @@ func NewMenuHandlers(appFlags *FlagManager, userdataStore db.Db, accountService accountService: accountService, smsService: smsservice, prefixDb: prefixDb, + logDb: logDb, profile: &profile.Profile{Max: 6}, ReplaceSeparatorFunc: replaceSeparatorFunc, } @@ -206,11 +212,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", key, "value", value) + } } publicKeyNormalized, err := hex.NormalizeHex(publicKey) if err != nil { @@ -220,6 +231,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 } @@ -389,12 +406,19 @@ func (h *MenuHandlers) SaveTemporaryPin(ctx context.Context, sym string, input [ } store := h.userdataStore + logdb := h.logDb + err = store.WriteEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE, []byte(hashedPIN)) if err != nil { logg.ErrorCtxf(ctx, "failed to write temporaryAccountPIN entry with", "key", storedb.DATA_TEMPORARY_VALUE, "value", accountPIN, "error", err) return res, err } + err = logdb.WriteLogEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE, []byte(hashedPIN)) + if err != nil { + logg.DebugCtxf(ctx, "Failed to write temporaryAccountPIN log entry", "key", storedb.DATA_TEMPORARY_VALUE, "value", accountPIN, "error", err) + } + return res, nil } @@ -422,6 +446,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) @@ -445,6 +470,12 @@ 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 AccountPIN log entry", "key", storedb.DATA_ACCOUNT_PIN, "value", hashedTemporaryPin, "error", err) + } + // set the DATA_SELF_PIN_RESET as 0 err = store.WriteEntry(ctx, sessionId, storedb.DATA_SELF_PIN_RESET, []byte("0")) if err != nil { @@ -465,6 +496,7 @@ func (h *MenuHandlers) ValidateBlockedNumber(ctx context.Context, sym string, in flag_unregistered_number, _ := h.flagManager.GetFlag("flag_unregistered_number") store := h.userdataStore + logdb := h.logDb sessionId, ok := ctx.Value("SessionId").(string) if !ok { return res, fmt.Errorf("missing session") @@ -500,6 +532,11 @@ func (h *MenuHandlers) ValidateBlockedNumber(ctx context.Context, sym string, in return res, nil } + err = logdb.WriteLogEntry(ctx, sessionId, storedb.DATA_BLOCKED_NUMBER, []byte(formattedNumber)) + if err != nil { + logg.DebugCtxf(ctx, "Failed to write blocked number log entry", "key", storedb.DATA_BLOCKED_NUMBER, "value", formattedNumber, "error", err) + } + return res, nil } @@ -626,6 +663,8 @@ func (h *MenuHandlers) VerifyCreatePin(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) @@ -652,6 +691,11 @@ func (h *MenuHandlers) VerifyCreatePin(ctx context.Context, sym string, input [] return res, err } + err = logdb.WriteLogEntry(ctx, sessionId, storedb.DATA_ACCOUNT_PIN, []byte(hashedTemporaryPin)) + if err != nil { + logg.DebugCtxf(ctx, "Failed to write DATA_ACCOUNT_PIN log entry", "key", storedb.DATA_ACCOUNT_PIN, "value", hashedTemporaryPin, "error", err) + } + return res, nil } @@ -664,7 +708,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") @@ -682,6 +729,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)) @@ -707,6 +759,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") @@ -726,6 +779,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)) @@ -782,6 +840,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") @@ -800,6 +860,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)) @@ -825,6 +890,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") @@ -843,6 +909,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)) @@ -870,6 +941,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") @@ -888,6 +960,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)) @@ -914,6 +992,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") @@ -933,6 +1012,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)) @@ -1912,6 +1996,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 { @@ -1966,6 +2051,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) @@ -2162,6 +2251,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) @@ -2201,6 +2291,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) @@ -2483,6 +2577,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") @@ -2501,6 +2596,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 } diff --git a/handlers/application/menuhandler_test.go b/handlers/application/menuhandler_test.go index 6f9118b..bd0211c 100644 --- a/handlers/application/menuhandler_test.go +++ b/handlers/application/menuhandler_test.go @@ -62,6 +62,25 @@ func InitializeTestStore(t *testing.T) (context.Context, *store.UserDataStore) { return ctx, store } +// InitializeTestLogdbStore sets up and returns an in-memory database and logdb store. +func InitializeTestLogdbStore(t *testing.T) (context.Context, *store.UserDataStore) { + ctx := context.Background() + + // Initialize memDb + db := memdb.NewMemDb() + err := db.Connect(ctx, "") + require.NoError(t, err, "Failed to connect to memDb") + + // Create UserDataStore with memDb + logdb := &store.UserDataStore{Db: db} + + t.Cleanup(func() { + db.Close(ctx) // Ensure the DB is closed after each test + }) + + return ctx, logdb +} + func InitializeTestSubPrefixDb(t *testing.T, ctx context.Context) *storedb.SubPrefixDb { db := memdb.NewMemDb() err := db.Connect(ctx, "") @@ -76,6 +95,7 @@ func InitializeTestSubPrefixDb(t *testing.T, ctx context.Context) *storedb.SubPr func TestNewMenuHandlers(t *testing.T) { _, store := InitializeTestStore(t) + _, logdb := InitializeTestLogdbStore(t) fm, err := NewFlagManager(flagsPath) if err != nil { @@ -86,7 +106,7 @@ func TestNewMenuHandlers(t *testing.T) { // Test case for valid UserDataStore t.Run("Valid UserDataStore", func(t *testing.T) { - handlers, err := NewMenuHandlers(fm, store, &accountService, mockReplaceSeparator) + handlers, err := NewMenuHandlers(fm, store, logdb, &accountService, mockReplaceSeparator) if err != nil { t.Fatalf("expected no error, got %v", err) } @@ -110,7 +130,7 @@ func TestNewMenuHandlers(t *testing.T) { // Test case for nil UserDataStore t.Run("Nil UserDataStore", func(t *testing.T) { - handlers, err := NewMenuHandlers(fm, nil, &accountService, mockReplaceSeparator) + handlers, err := NewMenuHandlers(fm, nil, logdb, &accountService, mockReplaceSeparator) if err == nil { t.Fatal("expected an error, got none") } @@ -192,8 +212,13 @@ func TestInit(t *testing.T) { func TestCreateAccount(t *testing.T) { sessionId := "session123" - ctx, store := InitializeTestStore(t) + ctx, userStore := InitializeTestStore(t) ctx = context.WithValue(ctx, "SessionId", sessionId) + _, logdb := InitializeTestLogdbStore(t) + + logDb := store.LogDb{ + Db: logdb, + } fm, err := NewFlagManager(flagsPath) if err != nil { @@ -226,8 +251,9 @@ func TestCreateAccount(t *testing.T) { mockAccountService := new(mocks.MockAccountService) h := &MenuHandlers{ - userdataStore: store, + userdataStore: userStore, accountService: mockAccountService, + logDb: logDb, flagManager: fm, } @@ -265,8 +291,13 @@ func TestWithPersister_PanicWhenAlreadySet(t *testing.T) { func TestSaveFirstname(t *testing.T) { sessionId := "session123" - ctx, store := InitializeTestStore(t) + ctx, userStore := InitializeTestStore(t) ctx = context.WithValue(ctx, "SessionId", sessionId) + _, logdb := InitializeTestLogdbStore(t) + + logDb := store.LogDb{ + Db: logdb, + } fm, _ := NewFlagManager(flagsPath) @@ -282,7 +313,7 @@ func TestSaveFirstname(t *testing.T) { // Define test data firstName := "John" - if err := store.WriteEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE, []byte(firstName)); err != nil { + if err := userStore.WriteEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE, []byte(firstName)); err != nil { t.Fatal(err) } @@ -290,9 +321,10 @@ func TestSaveFirstname(t *testing.T) { // Create the MenuHandlers instance with the mock store h := &MenuHandlers{ - userdataStore: store, + userdataStore: userStore, flagManager: fm, st: mockState, + logDb: logDb, } // Call the method @@ -303,14 +335,19 @@ func TestSaveFirstname(t *testing.T) { assert.Equal(t, expectedResult, res) // Verify that the DATA_FIRST_NAME entry has been updated with the temporary value - storedFirstName, _ := store.ReadEntry(ctx, sessionId, storedb.DATA_FIRST_NAME) + storedFirstName, _ := userStore.ReadEntry(ctx, sessionId, storedb.DATA_FIRST_NAME) assert.Equal(t, firstName, string(storedFirstName)) } func TestSaveFamilyname(t *testing.T) { sessionId := "session123" - ctx, store := InitializeTestStore(t) + ctx, userStore := InitializeTestStore(t) ctx = context.WithValue(ctx, "SessionId", sessionId) + _, logdb := InitializeTestLogdbStore(t) + + logDb := store.LogDb{ + Db: logdb, + } fm, _ := NewFlagManager(flagsPath) @@ -328,15 +365,16 @@ func TestSaveFamilyname(t *testing.T) { // Define test data familyName := "Doeee" - if err := store.WriteEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE, []byte(familyName)); err != nil { + if err := userStore.WriteEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE, []byte(familyName)); err != nil { t.Fatal(err) } // Create the MenuHandlers instance with the mock store h := &MenuHandlers{ - userdataStore: store, + userdataStore: userStore, st: mockState, flagManager: fm, + logDb: logDb, } // Call the method @@ -347,14 +385,19 @@ func TestSaveFamilyname(t *testing.T) { assert.Equal(t, expectedResult, res) // Verify that the DATA_FAMILY_NAME entry has been updated with the temporary value - storedFamilyName, _ := store.ReadEntry(ctx, sessionId, storedb.DATA_FAMILY_NAME) + storedFamilyName, _ := userStore.ReadEntry(ctx, sessionId, storedb.DATA_FAMILY_NAME) assert.Equal(t, familyName, string(storedFamilyName)) } func TestSaveYoB(t *testing.T) { sessionId := "session123" - ctx, store := InitializeTestStore(t) + ctx, userStore := InitializeTestStore(t) ctx = context.WithValue(ctx, "SessionId", sessionId) + _, logdb := InitializeTestLogdbStore(t) + + logDb := store.LogDb{ + Db: logdb, + } fm, _ := NewFlagManager(flagsPath) @@ -370,7 +413,7 @@ func TestSaveYoB(t *testing.T) { // Define test data yob := "1980" - if err := store.WriteEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE, []byte(yob)); err != nil { + if err := userStore.WriteEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE, []byte(yob)); err != nil { t.Fatal(err) } @@ -378,9 +421,10 @@ func TestSaveYoB(t *testing.T) { // Create the MenuHandlers instance with the mock store h := &MenuHandlers{ - userdataStore: store, + userdataStore: userStore, flagManager: fm, st: mockState, + logDb: logDb, } // Call the method @@ -391,14 +435,19 @@ func TestSaveYoB(t *testing.T) { assert.Equal(t, expectedResult, res) // Verify that the DATA_YOB entry has been updated with the temporary value - storedYob, _ := store.ReadEntry(ctx, sessionId, storedb.DATA_YOB) + storedYob, _ := userStore.ReadEntry(ctx, sessionId, storedb.DATA_YOB) assert.Equal(t, yob, string(storedYob)) } func TestSaveLocation(t *testing.T) { sessionId := "session123" - ctx, store := InitializeTestStore(t) + ctx, userStore := InitializeTestStore(t) ctx = context.WithValue(ctx, "SessionId", sessionId) + _, logdb := InitializeTestLogdbStore(t) + + logDb := store.LogDb{ + Db: logdb, + } fm, _ := NewFlagManager(flagsPath) @@ -414,7 +463,7 @@ func TestSaveLocation(t *testing.T) { // Define test data location := "Kilifi" - if err := store.WriteEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE, []byte(location)); err != nil { + if err := userStore.WriteEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE, []byte(location)); err != nil { t.Fatal(err) } @@ -422,9 +471,10 @@ func TestSaveLocation(t *testing.T) { // Create the MenuHandlers instance with the mock store h := &MenuHandlers{ - userdataStore: store, + userdataStore: userStore, flagManager: fm, st: mockState, + logDb: logDb, } // Call the method @@ -435,14 +485,19 @@ func TestSaveLocation(t *testing.T) { assert.Equal(t, expectedResult, res) // Verify that the DATA_LOCATION entry has been updated with the temporary value - storedLocation, _ := store.ReadEntry(ctx, sessionId, storedb.DATA_LOCATION) + storedLocation, _ := userStore.ReadEntry(ctx, sessionId, storedb.DATA_LOCATION) assert.Equal(t, location, string(storedLocation)) } func TestSaveOfferings(t *testing.T) { sessionId := "session123" - ctx, store := InitializeTestStore(t) + ctx, userStore := InitializeTestStore(t) ctx = context.WithValue(ctx, "SessionId", sessionId) + _, logdb := InitializeTestLogdbStore(t) + + logDb := store.LogDb{ + Db: logdb, + } fm, _ := NewFlagManager(flagsPath) @@ -458,7 +513,7 @@ func TestSaveOfferings(t *testing.T) { // Define test data offerings := "Bananas" - if err := store.WriteEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE, []byte(offerings)); err != nil { + if err := userStore.WriteEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE, []byte(offerings)); err != nil { t.Fatal(err) } @@ -466,9 +521,10 @@ func TestSaveOfferings(t *testing.T) { // Create the MenuHandlers instance with the mock store h := &MenuHandlers{ - userdataStore: store, + userdataStore: userStore, flagManager: fm, st: mockState, + logDb: logDb, } // Call the method @@ -479,14 +535,19 @@ func TestSaveOfferings(t *testing.T) { assert.Equal(t, expectedResult, res) // Verify that the DATA_OFFERINGS entry has been updated with the temporary value - storedOfferings, _ := store.ReadEntry(ctx, sessionId, storedb.DATA_OFFERINGS) + storedOfferings, _ := userStore.ReadEntry(ctx, sessionId, storedb.DATA_OFFERINGS) assert.Equal(t, offerings, string(storedOfferings)) } func TestSaveGender(t *testing.T) { sessionId := "session123" - ctx, store := InitializeTestStore(t) + ctx, userStore := InitializeTestStore(t) ctx = context.WithValue(ctx, "SessionId", sessionId) + _, logdb := InitializeTestLogdbStore(t) + + logDb := store.LogDb{ + Db: logdb, + } fm, _ := NewFlagManager(flagsPath) @@ -526,16 +587,17 @@ func TestSaveGender(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if err := store.WriteEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE, []byte(tt.expectedGender)); err != nil { + if err := userStore.WriteEntry(ctx, sessionId, storedb.DATA_TEMPORARY_VALUE, []byte(tt.expectedGender)); err != nil { t.Fatal(err) } mockState.ExecPath = append(mockState.ExecPath, tt.executingSymbol) // Create the MenuHandlers instance with the mock store h := &MenuHandlers{ - userdataStore: store, + userdataStore: userStore, st: mockState, flagManager: fm, + logDb: logDb, } expectedResult := resource.Result{} @@ -550,7 +612,7 @@ func TestSaveGender(t *testing.T) { assert.Equal(t, expectedResult, res) // Verify that the DATA_GENDER entry has been updated with the temporary value - storedGender, _ := store.ReadEntry(ctx, sessionId, storedb.DATA_GENDER) + storedGender, _ := userStore.ReadEntry(ctx, sessionId, storedb.DATA_GENDER) assert.Equal(t, tt.expectedGender, string(storedGender)) }) } @@ -1950,8 +2012,13 @@ func TestManageVouchers(t *testing.T) { sessionId := "session123" publicKey := "0X13242618721" - ctx, store := InitializeTestStore(t) + ctx, userStore := InitializeTestStore(t) ctx = context.WithValue(ctx, "SessionId", sessionId) + _, logdb := InitializeTestLogdbStore(t) + + logDb := store.LogDb{ + Db: logdb, + } fm, err := NewFlagManager(flagsPath) if err != nil { @@ -1962,7 +2029,7 @@ func TestManageVouchers(t *testing.T) { t.Fatal(err) } - err = store.WriteEntry(ctx, sessionId, storedb.DATA_PUBLIC_KEY, []byte(publicKey)) + err = userStore.WriteEntry(ctx, sessionId, storedb.DATA_PUBLIC_KEY, []byte(publicKey)) if err != nil { t.Fatal(err) } @@ -2020,20 +2087,21 @@ func TestManageVouchers(t *testing.T) { mockAccountService := new(mocks.MockAccountService) h := &MenuHandlers{ - userdataStore: store, + userdataStore: userStore, accountService: mockAccountService, flagManager: fm, + logDb: logDb, } mockAccountService.On("FetchVouchers", string(publicKey)).Return(tt.vouchersResp, nil) // Store active voucher if needed if tt.storedActiveVoucher != "" { - err := store.WriteEntry(ctx, sessionId, storedb.DATA_ACTIVE_SYM, []byte(tt.storedActiveVoucher)) + err := userStore.WriteEntry(ctx, sessionId, storedb.DATA_ACTIVE_SYM, []byte(tt.storedActiveVoucher)) if err != nil { t.Fatal(err) } - err = store.WriteEntry(ctx, sessionId, storedb.DATA_ACTIVE_ADDRESS, []byte("0x41c188D45rfg6ds")) + err = userStore.WriteEntry(ctx, sessionId, storedb.DATA_ACTIVE_ADDRESS, []byte("0x41c188D45rfg6ds")) if err != nil { t.Fatal(err) } @@ -2045,12 +2113,12 @@ func TestManageVouchers(t *testing.T) { if tt.storedActiveVoucher != "" { // Validate stored voucher symbols - voucherData, err := store.ReadEntry(ctx, sessionId, storedb.DATA_VOUCHER_SYMBOLS) + voucherData, err := userStore.ReadEntry(ctx, sessionId, storedb.DATA_VOUCHER_SYMBOLS) assert.NoError(t, err) assert.Equal(t, tt.expectedVoucherSymbols, voucherData) // Validate stored active contract address - updatedAddress, err := store.ReadEntry(ctx, sessionId, storedb.DATA_ACTIVE_ADDRESS) + updatedAddress, err := userStore.ReadEntry(ctx, sessionId, storedb.DATA_ACTIVE_ADDRESS) assert.NoError(t, err) assert.Equal(t, tt.expectedUpdatedAddress, updatedAddress) @@ -2308,7 +2376,7 @@ func TestCheckBlockedStatus(t *testing.T) { { name: "Currently blocked account", currentWrongPinAttempts: "4", - expectedResult: resource.Result{ + expectedResult: resource.Result{ FlagReset: []uint32{flag_account_pin_reset}, }, }, @@ -2377,8 +2445,14 @@ func TestCheckTransactions(t *testing.T) { sessionId := "session123" publicKey := "0X13242618721" - ctx, store := InitializeTestStore(t) + ctx, userStore := InitializeTestStore(t) ctx = context.WithValue(ctx, "SessionId", sessionId) + _, logdb := InitializeTestLogdbStore(t) + + logDb := store.LogDb{ + Db: logdb, + } + spdb := InitializeTestSubPrefixDb(t, ctx) fm, err := NewFlagManager(flagsPath) @@ -2387,13 +2461,14 @@ func TestCheckTransactions(t *testing.T) { } h := &MenuHandlers{ - userdataStore: store, + userdataStore: userStore, accountService: mockAccountService, prefixDb: spdb, + logDb: logDb, flagManager: fm, } - err = store.WriteEntry(ctx, sessionId, storedb.DATA_PUBLIC_KEY, []byte(publicKey)) + err = userStore.WriteEntry(ctx, sessionId, storedb.DATA_PUBLIC_KEY, []byte(publicKey)) if err != nil { t.Fatal(err) } diff --git a/handlers/local.go b/handlers/local.go index 6f4963f..9f80e7e 100644 --- a/handlers/local.go +++ b/handlers/local.go @@ -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 } diff --git a/store/log_db.go b/store/log_db.go new file mode 100644 index 0000000..d056a2e --- /dev/null +++ b/store/log_db.go @@ -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) +} diff --git a/testutil/engine.go b/testutil/engine.go index 0cae8d4..531481d 100644 --- a/testutil/engine.go +++ b/testutil/engine.go @@ -113,6 +113,12 @@ func TestEngine(sessionId string) (engine.Engine, func(), chan bool, *persist.Pe os.Exit(1) } + logdb, err := menuStorageService.GetLogDb(ctx, userDataStore, "test-db-logs", "user-data") + if err != nil { + fmt.Fprintf(os.Stderr, "get log db error: %v\n", err) + os.Exit(1) + } + dbResource, ok := rs.(*resource.DbResource) if !ok { fmt.Fprintf(os.Stderr, "dbresource cast error") @@ -121,6 +127,7 @@ func TestEngine(sessionId string) (engine.Engine, func(), chan bool, *persist.Pe lhs, err := handlers.NewLocalHandlerService(ctx, pfp, true, dbResource, cfg, rs) lhs.SetDataStore(&userDataStore) + lhs.SetLogDb(&logdb) lhs.SetPersister(pe) if err != nil { fmt.Fprintf(os.Stderr, err.Error()) @@ -154,6 +161,7 @@ func TestEngine(sessionId string) (engine.Engine, func(), chan bool, *persist.Pe en := lhs.GetEngine(lhs.Cfg, rs, pe) cleanFn := func() { + logdb.Close(ctx) err := en.Finish(ctx) if err != nil { logg.Errorf(err.Error())