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.
117 lines
3.5 KiB
117 lines
3.5 KiB
package postgres
|
|
|
|
import (
|
|
"database/sql"
|
|
"log"
|
|
|
|
"github.com/dustinpianalto/quartermaster"
|
|
)
|
|
|
|
type nutritionService struct {
|
|
db *sql.DB
|
|
}
|
|
|
|
func (s nutritionService) Nutrition(id int) (*quartermaster.Nutrition, error) {
|
|
var n quartermaster.Nutrition
|
|
queryString := "SELECT id, unit, calories, fat, sodium, protein FROM nutrition WHERE id = $1"
|
|
row := s.db.QueryRow(queryString, id)
|
|
err := row.Scan(&n.ID, &n.Unit, &n.Calories, &n.Fat, &n.Sodium, &n.Protein)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &n, nil
|
|
}
|
|
|
|
func (s nutritionService) AddNutrition(n *quartermaster.Nutrition) (*quartermaster.Nutrition, error) {
|
|
queryString := "INSERT INTO nutrition (unit, calories, fat, sodium, protein) VALUES ($1, $2, $3, $4, $5) RETURNING id"
|
|
err := s.db.QueryRow(queryString, n.Unit, n.Calories, n.Fat, n.Sodium, n.Protein).Scan(&n.ID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
for _, v := range n.Vitamins {
|
|
err := VitaminService.AddVitamin(v, n)
|
|
if err != nil {
|
|
s.DeleteNutrition(n)
|
|
return nil, err
|
|
}
|
|
}
|
|
return n, err
|
|
}
|
|
|
|
func (s nutritionService) UpdateNutrition(n *quartermaster.Nutrition) error {
|
|
queryString := "UPDATE nutrition SET unit = $2, calories = $3, fat = $4, sodium = $5, protein = $6 WHERE id = $1"
|
|
_, err := s.db.Exec(queryString, n.ID, n.Unit, n.Calories, n.Fat, n.Sodium, n.Protein)
|
|
currVitamins, _ := VitaminService.GetNutritionVitamins(n)
|
|
for _, v := range n.Vitamins {
|
|
VitaminService.UpdateVitamin(v, n)
|
|
}
|
|
outloop:
|
|
for _, v := range currVitamins {
|
|
for _, w := range n.Vitamins {
|
|
if v == w {
|
|
continue outloop
|
|
}
|
|
}
|
|
VitaminService.DeleteVitamin(v, n)
|
|
}
|
|
return err
|
|
}
|
|
|
|
func (s nutritionService) DeleteNutrition(n *quartermaster.Nutrition) error {
|
|
queryString := "DELETE FROM nutrition WHERE nutrition_id = $1"
|
|
_, err := s.db.Exec(queryString, n.ID)
|
|
return err
|
|
}
|
|
|
|
type vitaminService struct {
|
|
db *sql.DB
|
|
}
|
|
|
|
func (s vitaminService) Vitamin(vitamin quartermaster.VitaminType, n *quartermaster.Nutrition) (*quartermaster.Vitamin, error) {
|
|
var v quartermaster.Vitamin
|
|
queryString := "SELECT vitamin, amount FROM vitamins WHERE vitamin = $1 AND nutrition_id = $2"
|
|
row := s.db.QueryRow(queryString, vitamin, n.ID)
|
|
err := row.Scan(&v.Vitamin, &v.Amount)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &v, nil
|
|
}
|
|
|
|
func (s vitaminService) AddVitamin(v *quartermaster.Vitamin, n *quartermaster.Nutrition) error {
|
|
queryString := "INSERT INTO vitamins (nutrition_id, vitamin, amount) VALUES ($1, $2, $3)"
|
|
_, err := s.db.Exec(queryString, n.ID, v.Vitamin, v.Amount)
|
|
return err
|
|
}
|
|
|
|
func (s vitaminService) UpdateVitamin(v *quartermaster.Vitamin, n *quartermaster.Nutrition) error {
|
|
queryString := "INSERT INTO vitamins (nutrition_id, vitamin, amount) VALUES ($1, $2, $3) ON DUPLICATE KEY UPDATE amount = $3"
|
|
_, err := s.db.Exec(queryString, n.ID, v.Vitamin, v.Amount)
|
|
return err
|
|
}
|
|
|
|
func (s vitaminService) DeleteVitamin(v *quartermaster.Vitamin, n *quartermaster.Nutrition) error {
|
|
queryString := "DELETE FROM vitamins WHERE vitamin = $1 AND nutrition_id = $2"
|
|
_, err := s.db.Exec(queryString, v.Vitamin, n.ID)
|
|
return err
|
|
}
|
|
|
|
func (s vitaminService) GetNutritionVitamins(n *quartermaster.Nutrition) ([]*quartermaster.Vitamin, error) {
|
|
var vitamins []*quartermaster.Vitamin
|
|
queryString := "SELECT vitamin, amount FROM vitamins WHERE nutrition_id = $1"
|
|
rows, err := s.db.Query(queryString, n.ID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
for rows.Next() {
|
|
var vitamin quartermaster.Vitamin
|
|
err := rows.Scan(&vitamin.Vitamin, &vitamin.Amount)
|
|
if err != nil {
|
|
log.Println(err)
|
|
continue
|
|
}
|
|
vitamins = append(vitamins, &vitamin)
|
|
}
|
|
return vitamins, nil
|
|
}
|