package bootstrap import ( "context" "fmt" "os" "resume-platform/internal/handler" "resume-platform/internal/router" "resume-platform/internal/security" "resume-platform/pkg/config" "resume-platform/pkg/logger" ) func Run(ctx context.Context) error { cfg, err := config.LoadConfig() if err != nil { return fmt.Errorf("failed to load config: %w", err) } if err := initLogger(cfg); err != nil { return fmt.Errorf("failed to initialize logger: %w", err) } if err := initDataDir(); err != nil { return fmt.Errorf("failed to initialize data directory: %w", err) } logger.Infof("Configuration loaded - AdminPath: %s, Mode: %s", cfg.Auth.AdminPath, cfg.Server.Mode) container, err := NewServiceContainer(cfg) if err != nil { return fmt.Errorf("failed to initialize service container: %w", err) } handler.SetResumeRepository(container.Repo) handler.LoadTokens() if err := initSecurity(cfg); err != nil { return fmt.Errorf("failed to initialize security: %w", err) } if err := container.InitResumeAgent(ctx, cfg); err != nil { logger.Warnf("Failed to initialize Resume Agent: %v", err) } if err := startServer(ctx, cfg, container); err != nil { return fmt.Errorf("failed to start server: %w", err) } return nil } func initLogger(cfg *config.Config) error { return logger.Init(logger.Config{ Level: cfg.Log.Level, Output: cfg.Log.Output, }) } func initDataDir() error { return os.MkdirAll("./data", 0755) } func initSecurity(cfg *config.Config) error { security.InitCaptcha(160, 50) return nil } func startServer(ctx context.Context, cfg *config.Config, container *ServiceContainer) error { r := router.NewRouter( container.ResumeHandler, container.AdminHandler, container.AIHandler, container.DocumentHandler, container.ChatHandler, container.IMHandler, container.KnowledgeHandler, cfg, ) engine := r.Setup() addr := fmt.Sprintf("%s:%d", cfg.Server.Host, cfg.Server.Port) logger.Infof("Server starting on %s", addr) return engine.Run(addr) }