cake-order-tracker/store/special_cake.go
bronkuu 9aafbb94ec tags and special cakes: models, migrations, store layer
Add Tag, SpecialCake, Cake.Tags, Order.SpecialCakes types.
Add migrations for tag, cake_tag, special_cake, special_cake_tag tables.
Add store methods: GetTags, GetCakeTags, SaveCakeTags, CreateTag,
GetSpecialCakes, GetSpecialCakeTags, SaveSpecialCakes, saveSpecialCakeTags.
Load tags in GetCake/GetCakes, cascade tag saves in SaveCake.
Remove debug log calls from ParsePrice.
2026-06-15 18:49:21 +02:00

97 lines
2.5 KiB
Go

package store
import (
"database/sql"
"log"
"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) 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
}
tagIDs := make([]int, len(sc.Tags))
for i, t := range sc.Tags {
tagIDs[i] = t.ID
}
if err := s.saveSpecialCakeTags(tx, int(id), tagIDs); err != nil {
return err
}
}
return nil
}