Files
Portfolio-Engine/main.go
2026-04-30 08:02:03 +02:00

129 lines
4.3 KiB
Go

package main
import (
"Portifolio/internal/database"
"Portifolio/internal/middleware"
"Portifolio/internal/service"
"Portifolio/internal/website"
"database/sql"
"flag"
"fmt"
"log"
"net/http"
"os"
"github.com/joho/godotenv"
_ "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 EnvCheck() error {
if os.Getenv("username") == "" {
return fmt.Errorf("Missing: username")
}
if os.Getenv("password") == "" {
return fmt.Errorf("Missing: password")
}
if os.Getenv("AUTH_TOTP_SECRET") == "" {
return fmt.Errorf("Missing: AUTH_TOTP_SECRET")
}
return nil
}
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("/styles/main", website.GetstylesheetMain())
mux.HandleFunc("/styles/login", website.GetstylesheetLogin())
mux.HandleFunc("/styles/admin", website.GetstylesheetAdmin())
mux.Handle("/admin", middleware.RequireSession(website.GetAdmin()))
mux.HandleFunc("/login", website.GetAdminLogin())
mux.HandleFunc("POST /auth/login", website.LoginHandler())
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())
mux.HandleFunc("POST /trade/add", svc.AddTradeHandler())
mux.HandleFunc("GET /trade/list", svc.GetTradeListHandler())
//mux.HandleFunc("GET /trade/search", svc.SearchTradeHandler(svc))
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))
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))
mux.HandleFunc("GET /currency/list", svc.GetCurrenciesHandler())
mux.HandleFunc("POST /currency/add", svc.AddCurrencyHandler())
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)
}
err = godotenv.Load(".env")
if err != nil {
log.Fatal("Error loading .env file")
}
err = EnvCheck()
if err != nil {
log.Fatal("Env vars not found:", 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))
}