api.spaceplanner.app

Spaceplanner API
git clone git://jacobedwards.org/api.spaceplanner.app
Log | Files | Refs

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 }