Files
Portfolio-Engine/main.go
2026-03-28 08:33:12 +01:00

141 lines
3.8 KiB
Go

package main
import (
"Portifolio/internal/database"
"Portifolio/internal/handlers"
"Portifolio/internal/shell"
"bufio"
"database/sql"
"fmt"
"log"
"net/http"
"os"
"strings"
_ "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"))
if r.Method == http.MethodOptions {
w.WriteHeader(http.StatusNoContent)
return
}
next.ServeHTTP(w, r)
})
}
func main() {
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")
mux := http.NewServeMux()
mux.HandleFunc("/health", handlers.HealthHandler(db))
//Trades
mux.HandleFunc("POST /trade/add", handlers.AddTradeHandler(db))
mux.HandleFunc("GET /trade/list", handlers.GetTradeListHandler(db))
mux.HandleFunc("GET /trade/search", handlers.GetTradeListHandler(db)) // new
//Positions
mux.HandleFunc("GET /positions/list", handlers.GetPositionListHandler(db))
mux.HandleFunc("GET /positions/closed/list", handlers.GetPositionListHandler(db)) // new
mux.HandleFunc("GET /positions/closed/search", handlers.GetTradeListHandler(db)) // new
// Company
mux.HandleFunc("POST /company/add", handlers.AddCompanyHandler(db))
mux.HandleFunc("GET /company/list", handlers.GetCompaniesHandler(db))
mux.HandleFunc("GET /company/revenue/categories", handlers.GetCompanyRevenueCategories(db))
mux.HandleFunc("POST /company/S-O/add", handlers.GetCompaniesHandler(db)) // new
mux.HandleFunc("GET /company/S-O/list", handlers.GetCompaniesHandler(db)) // new
// Currency
mux.HandleFunc("GET /currency/list", handlers.GetCurrenciesHandler(db))
mux.HandleFunc("POST /currency/add", handlers.AddCurrencyHandler(db))
// Revenue
mux.HandleFunc("POST /add/revenue/entry", handlers.AddRevenueEntryHandler(db))
mux.HandleFunc("POST /api/v1/revenue/add", handlers.AddRevenueEntryHandler(db))
//http.HandleFunc("GET /revenue/report", handlers.GetRevenueReportHandler(db))
fmt.Println("Server running on :8080")
go func() {
log.Fatal(http.ListenAndServe(":8080", corsMiddleware(mux)))
}()
runShell(db)
}
func runShell(db *sql.DB) {
scanner := bufio.NewScanner(os.Stdin)
fmt.Println("\nShell ready. Type 'help' for commands.")
for {
fmt.Print("> ")
if !scanner.Scan() {
break
}
parts := strings.Fields(scanner.Text())
if len(parts) == 0 {
continue
}
switch parts[0] {
// Company
case "add-company":
shell.AddCompany(scanner, db)
case "list-companies":
shell.ListCompanies(db)
// Currency
case "add-currency":
shell.AddCurrency(scanner, db)
case "list-currency":
shell.ListCurrencies(db)
// Revenue
case "add-revenue":
shell.AddRevenue(scanner, db)
case "list-revenue":
shell.ListRevenue(scanner, db)
case "help":
fmt.Println("\nCommands:")
fmt.Println(" --- Company ---")
fmt.Println(" add-company add a new company")
fmt.Println(" list-companies list all companies")
fmt.Println(" --- Currency ---")
fmt.Println(" add-currency add a new currency")
fmt.Println(" list-currency list all currencies")
fmt.Println(" --- Revenue ---")
fmt.Println(" add-revenue add a revenue entry interactively")
fmt.Println(" list-revenue list revenue for a company/period")
fmt.Println(" sum-revenue sum revenue across periods")
fmt.Println(" --- Other ---")
fmt.Println(" exit quit")
case "exit":
fmt.Println("Bye!")
os.Exit(0)
default:
fmt.Printf("Unknown command: %s. Type 'help' for commands.\n", parts[0])
}
}
}