env.go (1518B)
1 package backend 2 3 import ( 4 "net/smtp" 5 "database/sql" 6 _ "github.com/lib/pq" 7 "github.com/stripe/stripe-go/v72/client" 8 ) 9 10 type Env struct { 11 Config Config 12 DB *sql.DB 13 Stripe *client.API 14 SMTPAuth smtp.Auth 15 // Private 16 stripeProcessedEvents map[string]bool 17 stmts map[string]*sql.Stmt 18 settingDefs map[string]SettingDef 19 } 20 21 // Creates new backend environemnt with the given database 22 // (which will be managed by these functions afterwords 23 func NewEnv(c Config) (*Env, error) { 24 var e Env 25 var err error 26 27 e.DB, err = sql.Open("postgres", c.Database) 28 if err != nil { 29 return &e, err 30 } 31 e.SMTPAuth = smtp.PlainAuth("", c.SMTP.User, c.SMTP.Password, c.SMTP.Server) 32 e.Stripe = client.New(c.Stripe.Key, nil) 33 e.stripeProcessedEvents = make(map[string]bool) 34 e.stmts = make(map[string]*sql.Stmt) 35 e.settingDefs = make(map[string]SettingDef) 36 e.Config = c 37 return &e, nil 38 } 39 40 func (e *Env) AddSetting(key string, def SettingDef) { 41 e.settingDefs[key] = def 42 } 43 44 func (e *Env) CacheStmt(name, sql string) (*sql.Stmt, error) { 45 stmt, exists := e.stmts[name]; 46 if exists { 47 return stmt, nil 48 } 49 50 stmt, err := e.DB.Prepare(sql) 51 if err != nil { 52 return nil, err 53 } 54 e.stmts[name] = stmt 55 return stmt, nil 56 } 57 58 func (e *Env) CacheTxStmt(tx *sql.Tx, name, sql string) (*sql.Stmt, error) { 59 if tx == nil { 60 return e.CacheStmt(name, sql) 61 } 62 63 stmt, err := e.CacheStmt(name, sql) 64 if err != nil { 65 return nil, err 66 } 67 return tx.Stmt(stmt), nil 68 } 69 70 71 func (e *Env) Free() { 72 for _, s := range e.stmts { 73 s.Close() 74 } 75 e.DB.Close() 76 }