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.
97 lines
2.5 KiB
Go
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
|
|
}
|