package main import ( "Portifolio/internal/database" "Portifolio/internal/service" "Portifolio/internal/website" "database/sql" "flag" "fmt" "log" "net/http" _ "github.com/mattn/go-sqlite3" ) var db *sql.DB func corsMiddleware(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { log.Printf("Incoming request: %s %s from %s", r.Method, r.URL.Path, r.Header.Get("Origin")) w.Header().Set("Access-Control-Allow-Origin", "http://localhost:8081") w.Header().Set("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS") w.Header().Set("Access-Control-Allow-Headers", "Content-Type, Authorization") if r.Method == http.MethodOptions { w.WriteHeader(http.StatusNoContent) return } next.ServeHTTP(w, r) }) } func RegisterRoutes(mux *http.ServeMux, db *sql.DB) { svc := service.New(db) // ← create it here, once // ── Website (HTMX fragments) ────────────────────────────── mux.HandleFunc("/", website.Getsite()) mux.HandleFunc("/style", website.Getstylesheet()) mux.HandleFunc("/health/fragment", website.HealthFragment(svc)) mux.HandleFunc("/positions/fragment", website.PositionsFragment(svc)) mux.HandleFunc("/company/fragment", website.CompanyFragment(svc)) mux.HandleFunc("/summary/fragment", website.SummaryFragment(svc)) mux.HandleFunc("/trade/fragment", website.TradeFragment(svc)) mux.HandleFunc("/trade/count", website.TradeCount(svc)) // ── API (JSON) ──────────────────────────────────────────── mux.HandleFunc("/health", svc.HealthHandler()) // Trades mux.HandleFunc("POST /trade/add", svc.AddTradeHandler()) mux.HandleFunc("GET /trade/list", svc.GetTradeListHandler()) //mux.HandleFunc("GET /trade/search", svc.SearchTradeHandler(svc)) // Positions mux.HandleFunc("GET /positions/list", svc.GetPositionListHandler()) //mux.HandleFunc("GET /positions/closed/list", svc.GetClosedPositionListHandler(svc)) //mux.HandleFunc("GET /positions/closed/search", svc.SearchClosedPositionsHandler(svc)) // Company mux.HandleFunc("POST /company/add", svc.AddCompanyHandler()) mux.HandleFunc("GET /company/list", svc.GetCompaniesHandler()) mux.HandleFunc("GET /company/revenue/categories", svc.GetCompanyRevenueCategories()) //mux.HandleFunc("POST /company/S-O/add", svc.AddSharesOutstandingHandler(svc)) //mux.HandleFunc("GET /company/S-O/list", svc.GetSharesOutstandingHandler(svc)) // Currency mux.HandleFunc("GET /currency/list", svc.GetCurrenciesHandler()) mux.HandleFunc("POST /currency/add", svc.AddCurrencyHandler()) // Revenue mux.HandleFunc("POST /add/revenue/entry", svc.AddRevenueEntryHandler()) mux.HandleFunc("POST /api/v1/revenue/add", svc.AddRevenueEntryHandler()) } func main() { // --- CLI flags --- port := flag.String("port", "8080", "Port to listen on") host := flag.String("host", "", "Host/IP to listen on (default: all interfaces)") flag.Parse() addr := fmt.Sprintf("%s:%s", *host, *port) // --- Database --- var err error db, err = sql.Open("sqlite3", "./app.db?_foreign_keys=on") if err != nil { log.Fatal("Failed to open database:", err) } defer db.Close() if err = db.Ping(); err != nil { log.Fatal("Failed to connect to database:", err) } database.InitDB(db) fmt.Println("Connected to SQLite database") // --- Routes --- mux := http.NewServeMux() RegisterRoutes(mux, db) fmt.Println("Server running on :8080") http.ListenAndServe(addr, corsMiddleware(mux)) }