133 lines
3.7 KiB
Go
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
|
|
}
|