package main import ( "context" "database/sql" "expvar" "flag" "os" "runtime" "strings" "sync" "time" "gitea.local.lab/Lbenedar/greenlight/internal/data" "gitea.local.lab/Lbenedar/greenlight/internal/jsonlog" "gitea.local.lab/Lbenedar/greenlight/internal/mailer" _ "github.com/lib/pq" ) const version = "1.0.0" type application struct { config config logger *jsonlog.Logger models data.Models mailer mailer.Mailer wg sync.WaitGroup } type config struct { port int env string db struct { dsn string maxOpenConns int maxIdleConns int maxIdleTime string } limiter struct { rps float64 burst int enabled bool } smtp struct { host string port int username string password string sender string } cors struct { trustedOrigins []string } } func openDB(cfg config) (*sql.DB, error) { db, err := sql.Open("postgres", cfg.db.dsn) if err != nil { return nil, err } db.SetMaxIdleConns(cfg.db.maxIdleConns) db.SetMaxOpenConns(cfg.db.maxOpenConns) duration, err := time.ParseDuration(cfg.db.maxIdleTime) if err != nil { return nil, err } db.SetConnMaxIdleTime(duration) ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() err = db.PingContext(ctx) if err != nil { return nil, err } return db, nil } func main() { var cfg config flag.IntVar(&cfg.port, "port", 4000, "API server port") flag.StringVar(&cfg.env, "env", "development", "Enivornment (development|staging|production)") flag.StringVar(&cfg.db.dsn, "db-dsn", "", "PostgreSQL DSN") flag.IntVar(&cfg.db.maxOpenConns, "db-max-open-conns", 25, "PostgreSQL max open connections") flag.IntVar(&cfg.db.maxIdleConns, "db-max-idle-conns", 25, "PostgreSQL max idle connections") flag.StringVar(&cfg.db.maxIdleTime, "db-max-idle-time", "15m", "PostgreSQL max connection idle time") flag.Float64Var(&cfg.limiter.rps, "limiter-rps", 2, "Rate limiter maximum requests per second") flag.IntVar(&cfg.limiter.burst, "limiter-burst", 4, "Rate limiter maximum burst") flag.BoolVar(&cfg.limiter.enabled, "limiter-enabled", true, "Enable rate limiter") flag.StringVar(&cfg.smtp.host, "smtp-host", "smtp.mailtrap.io", "SMTP host") flag.IntVar(&cfg.smtp.port, "smtp-port", 25, "SMTP port") flag.StringVar(&cfg.smtp.username, "smtp-username", "0abf276416b183", "SMTP username") flag.StringVar(&cfg.smtp.password, "smtp-password", "d8672aa2264bb5", "SMTP password") flag.StringVar(&cfg.smtp.sender, "smtp-sender", "Greenlight