package main import ( "context" "librapi/server" "librapi/services" "os" "os/signal" "strconv" "sync" "github.com/rs/zerolog" "github.com/rs/zerolog/log" "librapi/handlers/home" "librapi/handlers/login" "librapi/handlers/upload" ) const ( defaultPort = 8585 defaulStoreDir = "./store" ) var ( isSecure = os.Getenv("API_SECURE") == "true" port = sync.OnceValue[int](func() int { port, err := strconv.Atoi(os.Getenv("API_PORT")) if err != nil { log.Warn().Err(err).Int("default", defaultPort).Msg("unable to load API_PORT, set to default") return defaultPort } return port }) storeDir = sync.OnceValue[string](func() string { storeDir := os.Getenv("API_STORE_DIR") if storeDir == "" { log.Warn().Str("default", defaulStoreDir).Msg("API_STORE_DIR env var empty, set to default") return defaulStoreDir } return storeDir }) ) func initLogger() { zerolog.TimeFieldFormat = zerolog.TimeFormatUnix log.Logger = log.With().Caller().Logger().Output(zerolog.ConsoleWriter{Out: os.Stderr}) } func main() { initLogger() ctx, fnCancel := signal.NotifyContext(context.Background(), os.Kill, os.Interrupt) defer fnCancel() auth := services.NewAuthentication(ctx, isSecure) bs := services.NewBookStore(storeDir()) srv := server.NewServer( ctx, port(), server.NewHandler(home.URL, home.Handler(bs)), server.NewHandler(upload.URL, upload.Handler(auth, bs)), server.NewHandler(login.URL, login.Handler(auth)), ) srv.Serve() <-srv.Done() <-auth.Done() <-bs.Done() }