cake-order-tracker/store/special_cake.go
2026-06-15 20:30:15 +02:00

133 lines
3.7 KiB
Go

package store
import (
"database/sql"
"log"
"time"
"git.bronku.xyz/bronku/cake-order-tracker/config"
"git.bronku.xyz/bronku/cake-order-tracker/models"
)
func (s *Store) GetSpecialCakeTags(specialCakeID int) ([]models.Tag, error) {
rows, err := s.db.Query(`
select t.id, t.name from tag t
join special_cake_tag sct on sct.tag = t.id
where sct.special_cake = ?
order by t.name
`, specialCakeID)
if err != nil {
return nil, err
}
defer rows.Close()
var out []models.Tag
for rows.Next() {
var t models.Tag
if err := rows.Scan(&t.ID, &t.Name); err != nil {
return nil, err
}
out = append(out, t)
}
return out, rows.Err()
}
func (s *Store) GetSpecialCakes(orderID int) ([]models.SpecialCake, error) {
rows, err := s.db.Query("select id, customer_order, name, price, size, shape, flavour, notes from special_cake where customer_order = ?;", orderID)
if err != nil {
return nil, err
}
defer rows.Close()
var out []models.SpecialCake
for rows.Next() {
var sc models.SpecialCake
var price int
if err := rows.Scan(&sc.ID, &sc.OrderID, &sc.Name, &price, &sc.Size, &sc.Shape, &sc.Flavour, &sc.Notes); err != nil {
return nil, err
}
sc.Price = models.Price(price)
tags, err := s.GetSpecialCakeTags(sc.ID)
if err != nil {
return nil, err
}
sc.Tags = tags
out = append(out, sc)
}
return out, rows.Err()
}
func (s *Store) saveSpecialCakeTags(tx *sql.Tx, specialCakeID int, tagIDs []int) error {
if _, err := tx.Exec("delete from special_cake_tag where special_cake = ?;", specialCakeID); err != nil {
return err
}
for _, tid := range tagIDs {
if _, err := tx.Exec("insert or ignore into special_cake_tag(special_cake, tag) values (?, ?);", specialCakeID, tid); err != nil {
return err
}
}
return nil
}
func (s *Store) GetSpecialCakesInRange(from, to time.Time) ([]models.SpecialCakeWithOrder, error) {
start, end := dateRangeParams(from, to)
rows, err := s.db.Query(`
SELECT sc.id, sc.customer_order, sc.name, sc.price, sc.size, sc.shape, sc.flavour, sc.notes,
co.name, co.surname, co.delivery_date
FROM special_cake sc
JOIN customer_order co ON sc.customer_order = co.id
WHERE co.status != 'picked_up' AND co.delivery_date >= ? AND co.delivery_date <= ?
ORDER BY co.delivery_date
`, start, end)
if err != nil {
return nil, err
}
defer rows.Close()
var out []models.SpecialCakeWithOrder
for rows.Next() {
var sw models.SpecialCakeWithOrder
var price int
var deliveryDate string
if err := rows.Scan(&sw.ID, &sw.OrderID, &sw.Name, &price, &sw.Size, &sw.Shape, &sw.Flavour, &sw.Notes,
&sw.ClientName, &sw.ClientSurname, &deliveryDate); err != nil {
return nil, err
}
sw.Price = models.Price(price)
sw.OrderDate, err = time.Parse(config.DateTimeFormat, deliveryDate)
if err != nil {
return nil, err
}
sw.Tags, err = s.GetSpecialCakeTags(sw.ID)
if err != nil {
return nil, err
}
out = append(out, sw)
}
return out, rows.Err()
}
func (s *Store) SaveSpecialCakes(tx *sql.Tx, orderID int, cakes []models.SpecialCake) error {
if _, err := tx.Exec("delete from special_cake where customer_order = ?;", orderID); err != nil {
return err
}
if len(cakes) == 0 {
return nil
}
q := "insert into special_cake(customer_order, name, price, size, shape, flavour, notes) values (?, ?, ?, ?, ?, ?, ?);"
for _, sc := range cakes {
log.Printf("INSERT special_cake order=%d name=%q price=%d", orderID, sc.Name, sc.Price)
res, err := tx.Exec(q, orderID, sc.Name, int(sc.Price), sc.Size, sc.Shape, sc.Flavour, sc.Notes)
if err != nil {
return err
}
id, err := res.LastInsertId()
if err != nil {
return err
}
if err := s.saveSpecialCakeTags(tx, int(id), tagIDs(sc.Tags)); err != nil {
return err
}
}
return nil
}