package repository import ( "database/sql" "fmt" "time" models "vibeStonk/server/models/v1" "google.golang.org/protobuf/types/known/timestamppb" ) func newSqliteSaleFragmentRepo(db *sql.DB) SaleFragmentRepo { return &sqliteSaleFragmentRepo{db: db} } type sqliteSaleFragmentRepo struct { db *sql.DB } func (s *sqliteSaleFragmentRepo) GetBySaleID(saleID int64) ([]*models.SaleFragment, error) { query := ` SELECT t.id, t.qty, p.price as purchase_price, s.price as sale_price, p.purchase_date, s.sale_date FROM transactions t JOIN purchases p ON t.purchase_id = p.id JOIN sales s ON t.sale_id = s.id WHERE t.sale_id = ? ` rows, err := s.db.Query(query, saleID) if err != nil { return nil, fmt.Errorf("failed to get sale fragments by sale ID: %w", err) } defer rows.Close() var fragments []*models.SaleFragment for rows.Next() { fragment := &models.SaleFragment{} var purchaseDate, saleDate time.Time err := rows.Scan(&fragment.Id, &fragment.Qty, &fragment.PurchasePrice, &fragment.SalePrice, &purchaseDate, &saleDate) if err != nil { return nil, fmt.Errorf("failed to scan sale fragment row: %w", err) } // Convert time.Time to protobuf timestamp fragment.PurchaseDate = timestamppb.New(purchaseDate) fragment.SaleDate = timestamppb.New(saleDate) fragments = append(fragments, fragment) } if err := rows.Err(); err != nil { return nil, fmt.Errorf("error iterating sale fragment rows: %w", err) } return fragments, nil } func (s *sqliteSaleFragmentRepo) GetByPurchaseID(purchaseID int64) ([]*models.SaleFragment, error) { query := ` SELECT t.id, t.qty, p.price as purchase_price, s.price as sale_price, p.purchase_date, s.sale_date FROM transactions t JOIN purchases p ON t.purchase_id = p.id JOIN sales s ON t.sale_id = s.id WHERE t.purchase_id = ? ` rows, err := s.db.Query(query, purchaseID) if err != nil { return nil, fmt.Errorf("failed to get sale fragments by purchase ID: %w", err) } defer rows.Close() var fragments []*models.SaleFragment for rows.Next() { fragment := &models.SaleFragment{} var purchaseDate, saleDate time.Time err := rows.Scan(&fragment.Id, &fragment.Qty, &fragment.PurchasePrice, &fragment.SalePrice, &purchaseDate, &saleDate) if err != nil { return nil, fmt.Errorf("failed to scan sale fragment row: %w", err) } // Convert time.Time to protobuf timestamp fragment.PurchaseDate = timestamppb.New(purchaseDate) fragment.SaleDate = timestamppb.New(saleDate) fragments = append(fragments, fragment) } if err := rows.Err(); err != nil { return nil, fmt.Errorf("error iterating sale fragment rows: %w", err) } return fragments, nil }