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/diyanet" "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) diyanetProvider := diyanet.New(net.GetParsed) 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) } return api.Services{ TimesProvider: dbtimesprovider.New(db, diyanetProvider), 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 }