package main import ( "database/sql" "fmt" "os" "strings" "github.com/rs/zerolog/log" _ "modernc.org/sqlite" "prayertimes/internal/api" "prayertimes/internal/net" "prayertimes/pkg/citydb" "prayertimes/pkg/diyanetapi" "prayertimes/pkg/diyanetcalc" "prayertimes/pkg/diyanetcitydb" "prayertimes/pkg/diyanetprovider" ) func main() { if err := run(); err != nil { log.Fatal().Err(err).Msg("failed to run app") } } func run() error { port := getDefaultEnv("PORT", "8000") dbPath := strings.TrimSpace(getDefaultEnv("DB_PATH", "./prayertimes.sqlite3")) if dbPath == "" { return fmt.Errorf("DB_PATH is not set") } conn, err := newDB(dbPath) if err != nil { return fmt.Errorf("failed to initialize database connection: %w", err) } defer conn.Close() locationProvider := citydb.NewWithConn(conn) legacyLocationProvider := diyanetcitydb.New(conn) diyanetAPIProvider := diyanetapi.New(net.ReqClient) diyanetCalcProvider := diyanetcalc.New() prayerProvider := diyanetprovider.New(diyanetAPIProvider, diyanetCalcProvider) services := api.Services{ PrayerProvider: prayerProvider, LocationProvider: locationProvider, LegacyLocationProvider: legacyLocationProvider, } app := api.New(services) if err := app.Listen(":" + port); err != nil { return fmt.Errorf("failed to listen on http port: %w", err) } return nil } func getDefaultEnv(name string, defaultValue string) string { v, ok := os.LookupEnv(name) if !ok { return defaultValue } return v } func newDB(path string) (*sql.DB, error) { conn, err := sql.Open("sqlite", path) if err != nil { return nil, fmt.Errorf("failed to open database connection: %w", err) } if err := conn.Ping(); err != nil { _ = conn.Close() return nil, fmt.Errorf("failed to connect to database: %w", err) } return conn, nil }