package main import ( "context" "flag" "fmt" "log" "net/http" "os" "os/signal" "syscall" "time" "resume-builder/internal/api" "resume-builder/internal/db" "resume-builder/internal/llm" "resume-builder/internal/rag" ) func main() { addr := flag.String("addr", ":8080", "HTTP listen address") dbPath := flag.String("db", "./data/resume.db", "SQLite database path") llmBaseURL := flag.String("llm-base", os.Getenv("LLM_BASE_URL"), "LLM API base URL (OpenAI compatible)") llmModel := flag.String("llm-model", os.Getenv("LLM_MODEL"), "LLM model name") llmKey := flag.String("llm-key", os.Getenv("LLM_API_KEY"), "LLM API key") flag.Parse() if *llmBaseURL == "" { *llmBaseURL = "http://localhost:11434" } if *llmModel == "" { *llmModel = "llama3" } if *llmKey == "" { *llmKey = "not-needed" } fmt.Printf("Resume Builder\n") fmt.Printf(" LLM: %s (model: %s)\n", *llmBaseURL, *llmModel) fmt.Printf(" Database: %s\n", *dbPath) fmt.Printf(" Server: http://localhost%s\n", *addr) fmt.Println() // Initialize database database, err := db.New(*dbPath) if err != nil { log.Fatalf("Failed to initialize database: %v", err) } defer database.Close() // Initialize LLM client llmClient := llm.New(*llmBaseURL, *llmKey, *llmModel) // Initialize RAG service ragService := rag.New(database, llmClient) // Setup API handlers handler := api.New(database, ragService) // Create router mux := http.NewServeMux() handler.SetupRoutes(mux) // Wrap with CORS corsHandler := api.CorsMiddleware(mux) // Start server server := &http.Server{ Addr: *addr, Handler: corsHandler, } // Graceful shutdown sig := make(chan os.Signal, 1) signal.Notify(sig, syscall.SIGINT, syscall.SIGTERM) go func() { <-sig log.Println("\nShutting down server...") ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() if err := server.Shutdown(ctx); err != nil { log.Printf("Server shutdown error: %v", err) } }() log.Printf("Server listening on %s", *addr) if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed { log.Fatalf("Server error: %v", err) } }