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.
quartermaster/internal/postgres/nutrition.go

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
}