taler-mailbox

Service for asynchronous wallet-to-wallet payment messages
Log | Files | Refs | Submodules | README | LICENSE

commit b6485165f2a2f91f779156d47ea84b45f396a90b
parent ec0ad0a973d4bb35009c6240fa49f15482d9262f
Author: Martin Schanzenbach <schanzen@gnunet.org>
Date:   Fri, 25 Apr 2025 22:07:05 +0200

refactoring

Diffstat:
Mcmd/mailbox-server/main.go | 28++++++++++++++++------------
Mcmd/mailbox-server/main_test.go | 14+++++++++-----
Mpkg/rest/mailbox.go | 38++++++++++++++++++++++++++------------
3 files changed, 51 insertions(+), 29 deletions(-)

diff --git a/cmd/mailbox-server/main.go b/cmd/mailbox-server/main.go @@ -27,14 +27,14 @@ import ( "net/http" "os" - mailbox "taler.net/taler-mailbox/pkg/rest" "github.com/schanzen/taler-go/pkg/merchant" + mailbox "taler.net/taler-mailbox/pkg/rest" ) var m mailbox.Mailbox func handleRequests(m *mailbox.Mailbox) { - log.Fatal(http.ListenAndServe(m.Cfg.Section("mailbox").Key("bind_to").MustString("localhost:11000"), m.Router)) + log.Fatal(http.ListenAndServe(m.Cfg.Ini.Section("mailbox").Key("bind_to").MustString("localhost:11000"), m.Router)) } func main() { @@ -46,21 +46,25 @@ func main() { cfgfile = *cfgFlag } m := mailbox.Mailbox{} - cfg, err := ini.Load(cfgfile) + iniCfg, err := ini.Load(cfgfile) if err != nil { log.Printf("Failed to read config: %v", err) os.Exit(1) } psqlconn := fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s sslmode=disable", - m.Cfg.Section("mailbox-pq").Key("host").MustString("localhost"), - m.Cfg.Section("mailbox-pq").Key("port").MustInt64(5432), - m.Cfg.Section("mailbox-pq").Key("user").MustString("taler-mailbox"), - m.Cfg.Section("mailbox-pq").Key("password").MustString("secret"), - m.Cfg.Section("mailbox-pq").Key("db_name").MustString("taler-mailbox")) + iniCfg.Section("mailbox-pq").Key("host").MustString("localhost"), + iniCfg.Section("mailbox-pq").Key("port").MustInt64(5432), + iniCfg.Section("mailbox-pq").Key("user").MustString("taler-mailbox"), + iniCfg.Section("mailbox-pq").Key("password").MustString("secret"), + iniCfg.Section("mailbox-pq").Key("db_name").MustString("taler-mailbox")) db := postgres.Open(psqlconn) - merchURL := m.Cfg.Section("mailbox").Key("merchant_baseurl_private").MustString("http://merchant.mailbox/instances/myInstance") - merchToken := m.Cfg.Section("mailbox").Key("merchant_token").MustString("secretAccessToken") - merch := merchant.NewMerchant(merchURL, merchToken) - m.Initialize(cfg, db, merch) + merchURL := iniCfg.Section("mailbox").Key("merchant_baseurl_private").MustString("http://merchant.mailbox/instances/myInstance") + merchToken := iniCfg.Section("mailbox").Key("merchant_token").MustString("secretAccessToken") + merch := merchant.NewMerchant(merchURL, merchToken) + m.Initialize(mailbox.MailboxConfig{ + Version: "1.0.0", + Db: db, + Ini: iniCfg, + Merchant: merch}) handleRequests(&m) } diff --git a/cmd/mailbox-server/main_test.go b/cmd/mailbox-server/main_test.go @@ -17,10 +17,10 @@ import ( gnunetutil "git.gnunet.org/gnunet-go.git/pkg/util" "github.com/schanzen/taler-go/pkg/merchant" "github.com/schanzen/taler-go/pkg/util" + "gopkg.in/ini.v1" + "gorm.io/driver/sqlite" "taler.net/taler-mailbox/internal/gana" "taler.net/taler-mailbox/pkg/rest" - "gopkg.in/ini.v1" - "gorm.io/driver/sqlite" ) var a mailbox.Mailbox @@ -73,7 +73,7 @@ func TestMain(m *testing.M) { fmt.Printf("Failed to read config: %v", err) os.Exit(1) } - db := sqlite.Open("file::memory:?cache=shared") + db := sqlite.Open("file::memory:?cache=shared") merchServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { var orderResp merchant.PostOrderRequest if r.URL.Path == "/config" { @@ -106,8 +106,12 @@ func TestMain(m *testing.M) { } })) defer merchServer.Close() - merch := merchant.NewMerchant(merchServer.URL, "supersecret") - a.Initialize(cfg, db, merch) + merch := merchant.NewMerchant(merchServer.URL, "supersecret") + a.Initialize(mailbox.MailboxConfig{ + Version: "testing", + Db: db, + Merchant: merch, + Ini: cfg}) testWalletAlice, testWalletAlicePriv, _ = ed25519.GenerateKey(nil) h := sha512.New() h.Write(testWalletAlice) diff --git a/pkg/rest/mailbox.go b/pkg/rest/mailbox.go @@ -56,8 +56,8 @@ type Mailbox struct { // The main DB handle Db *gorm.DB - // Our configuration from the config.json - Cfg *ini.File + // Our configuration from the ini + Cfg MailboxConfig // Fixed size of message bodies MessageBodyBytes int64 `json:"message_body_bytes"` @@ -135,7 +135,7 @@ type InboxEntry struct { } func (m *Mailbox) configResponse(w http.ResponseWriter, r *http.Request) { - dpStr := m.Cfg.Section("mailbox").Key("delivery_period").MustString("72h") + dpStr := m.Cfg.Ini.Section("mailbox").Key("delivery_period").MustString("72h") dp, err := time.ParseDuration(dpStr) if err != nil { log.Fatal(err) @@ -345,11 +345,11 @@ func (m *Mailbox) deleteMessagesResponse(w http.ResponseWriter, r *http.Request) } func (m *Mailbox) termsResponse(w http.ResponseWriter, r *http.Request) { - tos.ServiceTermsResponse(m.Cfg.Section("mailbox"), w, r) + tos.ServiceTermsResponse(m.Cfg.Ini.Section("mailbox"), w, r) } func (m *Mailbox) privacyResponse(w http.ResponseWriter, r *http.Request) { - tos.PrivacyPolicyResponse(m.Cfg.Section("mailbox"), w, r) + tos.PrivacyPolicyResponse(m.Cfg.Ini.Section("mailbox"), w, r) } func (m *Mailbox) setupHandlers() { @@ -368,22 +368,36 @@ func (m *Mailbox) setupHandlers() { m.Router.HandleFunc("/{mailbox}", m.deleteMessagesResponse).Methods("DELETE") } +type MailboxConfig struct { + // Version + Version string + + // Configuration + Ini *ini.File + + // DB connection + Db gorm.Dialector + + // Merchant connection + Merchant merchant.Merchant +} + // Initialize the Mailbox instance with cfgfile -func (m *Mailbox) Initialize(cfg *ini.File, db gorm.Dialector, merch merchant.Merchant) { +func (m *Mailbox) Initialize(cfg MailboxConfig) { m.Cfg = cfg - if m.Cfg.Section("mailbox").Key("production").MustBool(false) { + if cfg.Ini.Section("mailbox").Key("production").MustBool(false) { fmt.Println("Production mode enabled") } - m.BaseUrl = m.Cfg.Section("mailbox").Key("base_url").MustString("https://example.com") - m.MessageBodyBytes = m.Cfg.Section("mailbox").Key("message_body_bytes").MustInt64(256) + m.BaseUrl = cfg.Ini.Section("mailbox").Key("base_url").MustString("https://example.com") + m.MessageBodyBytes = cfg.Ini.Section("mailbox").Key("message_body_bytes").MustInt64(256) // FIXME actual cost - fee, err := talerutil.ParseAmount(m.Cfg.Section("mailbox").Key("message_fee").MustString("KUDOS:1")) + fee, err := talerutil.ParseAmount(cfg.Ini.Section("mailbox").Key("message_fee").MustString("KUDOS:1")) if err != nil { fmt.Printf("Failed to parse cost: %v", err) os.Exit(1) } m.MessageFee = fee - _db, err := gorm.Open(db, &gorm.Config{ + _db, err := gorm.Open(cfg.Db, &gorm.Config{ Logger: logger.Default.LogMode(logger.Silent), }) if err != nil { @@ -394,6 +408,6 @@ func (m *Mailbox) Initialize(cfg *ini.File, db gorm.Dialector, merch merchant.Me panic(err) } - m.Merchant = merch + m.Merchant = cfg.Merchant m.setupHandlers() }