diff --git a/config/config.go b/config/config.go index d5d3cfe..69ede1d 100644 --- a/config/config.go +++ b/config/config.go @@ -31,6 +31,7 @@ type ( App AppConfig Cache CacheConfig Database DatabaseConfig + Mail MailConfig } // HTTPConfig stores HTTP configuration @@ -68,6 +69,14 @@ type ( Database string `env:"DB_NAME,default=app"` TestDatabase string `env:"DB_NAME_TEST,default=app_test"` } + + MailConfig struct { + Hostname string `env:"MAIL_HOSTNAME,default=localhost"` + Port uint16 `env:"MAIL_PORT,default=25"` + User string `env:"MAIL_USER,default=admin"` + Password string `env:"MAIL_PASSWORD,default=admin"` + FromAddress string `env:"MAIL_FROM_ADDRESS,default=admin@localhost"` + } ) // GetConfig loads and returns application configuration diff --git a/container/container.go b/container/container.go index c31d09c..b5e1819 100644 --- a/container/container.go +++ b/container/container.go @@ -5,6 +5,8 @@ import ( "database/sql" "fmt" + "goweb/mail" + "entgo.io/ent/dialect" entsql "entgo.io/ent/dialect/sql" "github.com/eko/gocache/v2/cache" @@ -24,6 +26,7 @@ type Container struct { Cache *cache.Cache Database *sql.DB ORM *ent.Client + Mail *mail.Client } func NewContainer() *Container { @@ -33,6 +36,7 @@ func NewContainer() *Container { c.initCache() c.initDatabase() c.initORM() + c.initMail() return c } @@ -113,3 +117,11 @@ func (c *Container) initORM() { panic(fmt.Sprintf("failed to create database schema: %v", err)) } } + +func (c *Container) initMail() { + var err error + c.Mail, err = mail.NewClient(c.Config) + if err != nil { + panic(fmt.Sprintf("failed to create mail client: %v", err)) + } +} diff --git a/mail/mail.go b/mail/mail.go new file mode 100644 index 0000000..8db46ac --- /dev/null +++ b/mail/mail.go @@ -0,0 +1,27 @@ +package mail + +import ( + "goweb/config" + + "github.com/labstack/echo/v4" +) + +type Client struct { + config *config.Config +} + +func NewClient(cfg *config.Config) (*Client, error) { + return &Client{ + config: cfg, + }, nil +} + +func (c *Client) Send(ctx echo.Context, to, body string) error { + if c.config.App.Environment != config.EnvProduction { + // IE, skip sending email.. + } + ctx.Logger().Debugf("Mock email sent. To: %s Body: %s", to, body) + return nil +} + +// TODO: Send with template?