vibeStonk/server/repository/sqliteSaleFragment.go
2025-06-12 16:57:42 -04:00

89 lines
2.6 KiB
Go

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
}