83 lines
3.3 KiB
Go
83 lines
3.3 KiB
Go
package database
|
|
|
|
import (
|
|
"billit/internal/models"
|
|
"database/sql"
|
|
)
|
|
|
|
// CreateProduct inserts a new product for a user
|
|
func (s *service) CreateProduct(p models.Product, userID string) error {
|
|
_, err := s.db.Exec(`
|
|
INSERT INTO products (sku, name, hsn_code, base_price, wholesale_price, gst_rate, small_order_qty, small_order_fee, unit, user_id)
|
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
`, p.SKU, p.Name, p.HSNCode, p.BasePrice, p.WholesalePrice, p.GSTRate, p.SmallOrderQty, p.SmallOrderFee, p.Unit, userID)
|
|
return err
|
|
}
|
|
|
|
// UpdateProduct updates an existing product for a user
|
|
func (s *service) UpdateProduct(p models.Product, userID string) error {
|
|
_, err := s.db.Exec(`
|
|
UPDATE products SET name=?, hsn_code=?, base_price=?, wholesale_price=?, gst_rate=?, small_order_qty=?, small_order_fee=?, unit=?
|
|
WHERE sku=? AND user_id=?
|
|
`, p.Name, p.HSNCode, p.BasePrice, p.WholesalePrice, p.GSTRate, p.SmallOrderQty, p.SmallOrderFee, p.Unit, p.SKU, userID)
|
|
return err
|
|
}
|
|
|
|
// GetAllProducts returns all products for a user
|
|
func (s *service) GetAllProducts(userID string) ([]models.Product, error) {
|
|
rows, err := s.db.Query(`SELECT sku, name, hsn_code, base_price, wholesale_price, gst_rate, small_order_qty, small_order_fee, unit, user_id, created_at FROM products WHERE user_id=? ORDER BY name`, userID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer rows.Close()
|
|
|
|
var products []models.Product
|
|
for rows.Next() {
|
|
var p models.Product
|
|
if err := rows.Scan(&p.SKU, &p.Name, &p.HSNCode, &p.BasePrice, &p.WholesalePrice, &p.GSTRate, &p.SmallOrderQty, &p.SmallOrderFee, &p.Unit, &p.UserID, &p.CreatedAt); err != nil {
|
|
return nil, err
|
|
}
|
|
products = append(products, p)
|
|
}
|
|
return products, nil
|
|
}
|
|
|
|
// GetProductBySKU returns a single product by SKU for a user
|
|
func (s *service) GetProductBySKU(sku string, userID string) (*models.Product, error) {
|
|
var p models.Product
|
|
err := s.db.QueryRow(`SELECT sku, name, hsn_code, base_price, wholesale_price, gst_rate, small_order_qty, small_order_fee, unit, user_id, created_at FROM products WHERE sku=? AND user_id=?`, sku, userID).
|
|
Scan(&p.SKU, &p.Name, &p.HSNCode, &p.BasePrice, &p.WholesalePrice, &p.GSTRate, &p.SmallOrderQty, &p.SmallOrderFee, &p.Unit, &p.UserID, &p.CreatedAt)
|
|
if err == sql.ErrNoRows {
|
|
return nil, nil
|
|
}
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &p, nil
|
|
}
|
|
|
|
// DeleteProduct removes a product by SKU for a user
|
|
func (s *service) DeleteProduct(sku string, userID string) error {
|
|
_, err := s.db.Exec(`DELETE FROM products WHERE sku=? AND user_id=?`, sku, userID)
|
|
return err
|
|
}
|
|
|
|
// GetRecentProducts returns the most recently added products for a user
|
|
func (s *service) GetRecentProducts(userID string, limit int) ([]models.Product, error) {
|
|
rows, err := s.db.Query(`SELECT sku, name, hsn_code, base_price, wholesale_price, gst_rate, small_order_qty, small_order_fee, unit, user_id, created_at FROM products WHERE user_id=? ORDER BY created_at DESC LIMIT ?`, userID, limit)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer rows.Close()
|
|
|
|
var products []models.Product
|
|
for rows.Next() {
|
|
var p models.Product
|
|
if err := rows.Scan(&p.SKU, &p.Name, &p.HSNCode, &p.BasePrice, &p.WholesalePrice, &p.GSTRate, &p.SmallOrderQty, &p.SmallOrderFee, &p.Unit, &p.UserID, &p.CreatedAt); err != nil {
|
|
return nil, err
|
|
}
|
|
products = append(products, p)
|
|
}
|
|
return products, nil
|
|
}
|