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 }