package main import ( "context" "log/slog" "os" "time" "mira/backend/internal/auth" "mira/backend/internal/calendar" "mira/backend/internal/clients" "mira/backend/internal/config" "mira/backend/internal/database" "mira/backend/internal/httpserver" "mira/backend/internal/users" ) func main() { cfg := config.Load() logger := slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{ Level: cfg.LogLevel, })) ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) defer cancel() db, err := database.Connect(ctx, cfg.DatabaseURL) if err != nil { logger.Error("database connection failed", "error", err) os.Exit(1) } defer db.Close() if err := db.Migrate(ctx, logger, "migrations"); err != nil { logger.Error("database migration failed", "error", err) os.Exit(1) } userStore := users.NewStore(db.Pool) clientStore := clients.NewStore(db.Pool) calendarStore := calendar.NewStore(db.Pool) if err := auth.BootstrapSuperAdmin(ctx, cfg, userStore, logger); err != nil { logger.Error("super admin bootstrap failed", "error", err) os.Exit(1) } server := httpserver.New(cfg, logger, db, userStore, clientStore, calendarStore) logger.Info("starting api", "addr", cfg.HTTPAddr, "env", cfg.AppEnv) if err := server.Run(cfg.HTTPAddr); err != nil { logger.Error("api stopped", "error", err) os.Exit(1) } }