package main import ( "database/sql" "fmt" "os" "github.com/rs/zerolog/log" "prayertimes/internal/api" "prayertimes/internal/database" "prayertimes/internal/net" "prayertimes/pkg/dbtimesprovider" "prayertimes/pkg/diyanetapi" ) func main() { port := getDefaultEnv("PORT", "8000") services, shutdown, err := newServices() if err != nil { log.Fatal().Err(err).Msg("failed to init services") } defer shutdown() app := api.New(services) err = app.Listen(":" + port) if err != nil { log.Fatal().Err(err).Msg("exit with an error") } } func newServices() (api.Services, func(), error) { diyanetAPIProvider := diyanetapi.New(net.ReqClient) db, err := database.NewSqliteDB(getDefaultEnv("DATABASE_URL", "app.sqlite3")) if err != nil { return api.Services{}, nil, fmt.Errorf("failed to init db: %w", err) } if err := dbtimesprovider.Migrate(db.Db.(*sql.DB)); err != nil { return api.Services{}, nil, fmt.Errorf("failed to migrate database: %w", err) } dbProvider := dbtimesprovider.New(db, diyanetAPIProvider) return api.Services{ TimesProvider: dbProvider, LocationTimesProvider: diyanetAPIProvider, }, func() { defer db.Db.(*sql.DB).Close() }, nil } func getDefaultEnv(name string, defaultValue string) string { v, ok := os.LookupEnv(name) if !ok { return defaultValue } return v }