diff --git a/internal/database/main.go b/internal/database/main.go index 8805e0d..36603c1 100644 --- a/internal/database/main.go +++ b/internal/database/main.go @@ -30,6 +30,7 @@ func InitDB(db *sql.DB) { CREATE TABLE IF NOT EXISTS position ( id INTEGER PRIMARY KEY AUTOINCREMENT, company_id INTEGER NOT NULL, + currency_id INTEGER NOT NULL, shares INTEGER NOT NULL, weight REAL NOT NULL, CostBases REAL NOT NULL, diff --git a/internal/database/portfolio.go b/internal/database/portfolio.go index 0703a8e..7483c85 100644 --- a/internal/database/portfolio.go +++ b/internal/database/portfolio.go @@ -30,6 +30,29 @@ func GetTrades(db *sql.DB) ([]model.Trade, error) { return trades, nil } +func GetPositions(db *sql.DB) ([]model.Position, error) { + rows, err := db.Query("SELECT company_id, shares, weight, CostBases, currency_id") + if err != nil { + return nil, err + } + defer rows.Close() + + var positions []model.Position + for rows.Next() { + var t model.Position + err := rows.Scan(&t.Company.ID, &t.Shares, &t.Weight, &t.CostBasis, t.Currency) + if err != nil { + return nil, err + } + positions = append(positions, t) + } + if err = rows.Err(); err != nil { + return nil, err + } + + return positions, nil +} + func InsertTrade(db *sql.DB, trade model.Trade) error { _, err := db.Exec( "INSERT INTO trades (company_id, currency_id, shares, product, type, price, traded_at) VALUES (?, ?, ?, ?, ?, ?, ?)", diff --git a/internal/handlers/portfolio.go b/internal/handlers/portfolio.go index 871943f..590aac5 100644 --- a/internal/handlers/portfolio.go +++ b/internal/handlers/portfolio.go @@ -42,3 +42,19 @@ func GetTradeListHandler(db *sql.DB) http.HandlerFunc { } } } + +func GetPositionListHandler(db *sql.DB) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + tradeList, err := database.GetPositions(db) + if err != nil { + http.Error(w, "failed to fetch trades", http.StatusInternalServerError) + return + } + + w.Header().Set("Content-Type", "application/json") + if err := json.NewEncoder(w).Encode(tradeList); err != nil { + http.Error(w, "failed to encode trades", http.StatusInternalServerError) + return + } + } +} diff --git a/internal/model/portifolio.go b/internal/model/portifolio.go index dcb3b5b..598c075 100644 --- a/internal/model/portifolio.go +++ b/internal/model/portifolio.go @@ -7,7 +7,8 @@ import ( type Position struct { Company Company - weight float64 + Currency Currency + Weight float64 CostBasis float64 Shares int } diff --git a/main.go b/main.go index 3f34dbf..85efcbd 100644 --- a/main.go +++ b/main.go @@ -38,6 +38,7 @@ func main() { //Trades http.HandleFunc("POST /trade/add", handlers.AddTradeHandler(db)) http.HandleFunc("GET /trade/list", handlers.GetTradeListHandler(db)) + http.HandleFunc("GET /positions/list", handlers.GetTradeListHandler(db)) // Company http.HandleFunc("POST /add/company", handlers.AddCompanyHandler(db))