You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
139 lines
4.2 KiB
139 lines
4.2 KiB
package postgres
|
|
|
|
import (
|
|
"database/sql"
|
|
"log"
|
|
|
|
"github.com/dustinpianalto/quartermaster"
|
|
)
|
|
|
|
type itemService struct {
|
|
db *sql.DB
|
|
}
|
|
|
|
func (s itemService) Item(id int) (*quartermaster.Item, error) {
|
|
var i quartermaster.Item
|
|
queryString := "SELECT id, name, description, size, unit, barcode, nutrition_id FROM items WHERE id = $1"
|
|
row := s.db.QueryRow(queryString, id)
|
|
var nutrition_id sql.NullInt32
|
|
err := row.Scan(&i.ID, &i.Name, &i.Description, &i.Size, &i.Unit, &i.Barcode, &nutrition_id)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if nutrition_id.Valid {
|
|
n, err := NutritionService.Nutrition(int(nutrition_id.Int32))
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
i.Nutrition = n
|
|
} else {
|
|
i.Nutrition = nil
|
|
}
|
|
return &i, nil
|
|
}
|
|
|
|
func (s itemService) AddItem(i *quartermaster.Item, l *quartermaster.Location) (*quartermaster.Item, error) {
|
|
var err error
|
|
if i.ID == 0 {
|
|
if i.Nutrition != nil {
|
|
i.Nutrition, err = NutritionService.AddNutrition(i.Nutrition)
|
|
if err != nil {
|
|
log.Println(err)
|
|
}
|
|
}
|
|
queryString := "INSERT INTO items (name, description, size, unit, barcode, nutrition_id) VALUES ($1, $2, $3, $4, $5, $6) RETURNING id"
|
|
err := s.db.QueryRow(queryString, i.Name, i.Description, i.Size, i.Unit, i.Barcode, i.Nutrition.ID).Scan(&i.ID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
}
|
|
queryString := "INSERT INTO x_items_locations (item_id, location_id, count) VALUES ($1, $2, 1) ON DUPLICATE KEY UPDATE count = count + 1"
|
|
_, err = s.db.Exec(queryString, i.ID, l.ID)
|
|
return i, err
|
|
}
|
|
|
|
func (s itemService) AddCategory(i *quartermaster.Item, c *quartermaster.Category) error {
|
|
queryString := "INSERT INTO x_items_categories (item_id, category_id) VALUES ($1, $2) ON DUPLICATE KEY DO NOTHING"
|
|
_, err := s.db.Exec(queryString, i.ID, c.ID)
|
|
return err
|
|
}
|
|
|
|
func (s itemService) AddGroup(i *quartermaster.Item, g *quartermaster.Group) error {
|
|
queryString := "INSERT INTO x_items_groups (item_id, group_id) VALUES ($1, $2) ON DUPLICATE KEY DO NOTHING"
|
|
_, err := s.db.Exec(queryString, i.ID, g.ID)
|
|
return err
|
|
}
|
|
|
|
func (s itemService) RemoveCategory(i *quartermaster.Item, c *quartermaster.Category) error {
|
|
queryString := "DELETE FROM x_items_categories WHERE item_id = $1 AND category_id = $2"
|
|
_, err := s.db.Exec(queryString, i.ID, c.ID)
|
|
return err
|
|
}
|
|
|
|
func (s itemService) RemoveGroup(i *quartermaster.Item, g *quartermaster.Group) error {
|
|
queryString := "DELETE FROM x_items_groups WHERE item_id = $1 AND group_id = $2"
|
|
_, err := s.db.Exec(queryString, i.ID, g.ID)
|
|
return err
|
|
}
|
|
|
|
func (s itemService) DeleteItem(i *quartermaster.Item) error {
|
|
queryString := "DELETE FROM items WHERE id = $1"
|
|
_, err := s.db.Exec(queryString, i.ID)
|
|
return err
|
|
}
|
|
|
|
func (s itemService) GetItemByBarcode(b string) (*quartermaster.Item, error) {
|
|
queryString := "SELECT id FROM items WHERE barcode = $1"
|
|
row := s.db.QueryRow(queryString, b)
|
|
var id int
|
|
err := row.Scan(&id)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return s.Item(id)
|
|
}
|
|
|
|
func (s itemService) RemoveItem(i *quartermaster.Item, l *quartermaster.Location) error {
|
|
queryString := "UPDATE x_items_locations SET count = count - 1 WHERE item_id = $1 AND location_id = $2 RETURNING count"
|
|
var count int
|
|
err := s.db.QueryRow(queryString, i.ID, l.ID).Scan(&count)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if count <= 0 {
|
|
queryString = "DELETE FROM x_items_locations WHERE item_id = $1 AND location_id = $2"
|
|
_, err := s.db.Exec(queryString, i.ID, l.ID)
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (s itemService) MoveItem(i *quartermaster.Item, old, new *quartermaster.Location) error {
|
|
err := s.RemoveItem(i, old)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
_, err = s.AddItem(i, new)
|
|
return err
|
|
}
|
|
|
|
func (s itemService) UpdateItem(i *quartermaster.Item) error {
|
|
var err error
|
|
if i.Nutrition != nil {
|
|
if i.Nutrition.ID == 0 {
|
|
i.Nutrition, err = NutritionService.AddNutrition(i.Nutrition)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
} else {
|
|
err = NutritionService.UpdateNutrition(i.Nutrition)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
}
|
|
queryString := "UPDATE items SET name = $2, description = $3, size = $4, unit = $5, barcode = $6, nutrition_id = $7, WHERE id = $1"
|
|
_, err = s.db.Exec(queryString, i.ID, i.Name, i.Description, i.Size, i.Unit, i.Barcode, i.Nutrition.ID)
|
|
return err
|
|
}
|