89 lines
2.6 KiB
Go
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
|
|
}
|