You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
83 lines
1.8 KiB
Go
83 lines
1.8 KiB
Go
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
|
|
}
|