Hayden Hargreaves b8c9fc469e (FEAT): Deletion is implemented!
This should be a nice test! Hopefully other users cannot delete my
recipes. Though they're setup to soft delete.
2026-01-30 23:44:21 -07:00

172 lines
5.1 KiB
Go

package domain
import "time"
// RecipeDuration is the duration to prepare recipe. It has JSON tags which allows it to be
// marshaled into a JSON object and stored in the database (JSONB).
type RecipeDuration struct {
Total int `json:"Total"`
Prep int `json:"Prep"`
Cook int `json:"Cook"`
}
// RecipeMeal is the database enum E_MEAL which defines the meal type of a recipe. Postgres enums
// are case sensitive so these must match the values in the database exactly.
type RecipeMeal string
const (
MealBreakfast RecipeMeal = "breakfast"
MealLunch RecipeMeal = "lunch"
MealDinner RecipeMeal = "dinner"
MealDesert RecipeMeal = "dessert"
MealSnack RecipeMeal = "snack"
MealSide RecipeMeal = "side"
MealOther RecipeMeal = "other"
)
// ParseMeal converts an integer value into a meal type (string). Values are 0-indexed.
func ParseMeal(meal int) RecipeMeal {
switch meal {
case 0:
return MealBreakfast
case 1:
return MealLunch
case 2:
return MealDinner
case 3:
return MealDesert
case 4:
return MealSnack
case 5:
return MealSide
case 6:
return MealOther
default:
return MealOther
}
}
// TODO: Comment
type RecipeIngredientUnit string
const (
Blank RecipeIngredientUnit = ""
Tsp RecipeIngredientUnit = "tsp"
Tbsp RecipeIngredientUnit = "tbsp"
FlOz RecipeIngredientUnit = "fl oz"
Cup RecipeIngredientUnit = "cup"
Ml RecipeIngredientUnit = "ml"
Litre RecipeIngredientUnit = "l"
Pint RecipeIngredientUnit = "pt"
Quart RecipeIngredientUnit = "qt"
Gallon RecipeIngredientUnit = "gal"
Gram RecipeIngredientUnit = "g"
Kilogram RecipeIngredientUnit = "kg"
Ounce RecipeIngredientUnit = "oz"
Pound RecipeIngredientUnit = "lb"
Piece RecipeIngredientUnit = "piece"
Clove RecipeIngredientUnit = "clove"
Slice RecipeIngredientUnit = "slice"
Stick RecipeIngredientUnit = "stick"
Bunch RecipeIngredientUnit = "bunch"
Pinch RecipeIngredientUnit = "pinch"
Dash RecipeIngredientUnit = "dash"
Splash RecipeIngredientUnit = "splash"
ToTaste RecipeIngredientUnit = "to taste"
)
// RecipeIngredient is a single ingredients in a recipe. These have JSON tags which allow them
// to be marshaled into a JSON array and stored in the database (JSONB).
type RecipeIngredient struct {
Id string `json:"Id"`
SectionId string `json:"SectionId"`
Name string `json:"Name"`
Amount float64 `json:"Amount"`
Unit RecipeIngredientUnit `json:"Unit"`
}
// TODO: Comment
type RecipeInstruction struct {
Id string `json:"Id"`
Content string `json:"Content"`
}
// TODO: Comment
type RecipeIngredientSection struct {
Id string `json:"Id"`
Name string `json:"Name"`
}
// RecipeIngredientStore is the struct stored in the database Ingredients column. It is simply a
// combindation of the sections and the ingredients so they can be stored together.
type RecipeIngredientStore struct {
Sections []RecipeIngredientSection `json:"Sections"`
Ingredients []RecipeIngredient `json:"Ingredients"`
}
// Recipe is the database model of a recipe. There is no need to map to a different model so
// this will remain in the domain. The Tags field should be loaded from the external Tags table,
// but is still attached to this domain object. The Favorite field should also be loaded from
// the external favorites table, these are user specific.
type Recipe struct {
Id int
Title string
Description string
Instructions []RecipeInstruction
Serves int
Difficulty int
Duration RecipeDuration
Category RecipeMeal
Ingredients []RecipeIngredient
Sections []RecipeIngredientSection
UserId int
Modified *time.Time // Pointer to allow null
Created time.Time
Tags []Tag
Favorite bool // Per requesting user
Deleted bool
}
// SearchFilters is a model which represents the required filters to complete a recipe search.
// The integer values should be provided as bits and used to parse out individual flags. More
// details can be found in the SearchRecipes service function.
type SearchFilters struct {
Search string `json:"Search"`
MealType int `json:"MealType"`
Time int `json:"Time"`
Difficulty int `json:"Difficulty"`
ServingSize int `json:"ServingSize"`
Favorites bool `json:"Favorites"`
}
// Tag is a model which represents a single tag in the Tags table. A tag is mapped to a recipe
// using the RecipeTag data model and can be accessed via their ID from the DB.
type Tag struct {
Id int
Name string
Created time.Time
}
// RecipeTag is a model which represents a single mapping in the RecipeTags table. This model
// is a many-to-many mapping for tags to recipes.
type RecipeTag struct {
Id int
RecipeId int
TagId int
Created time.Time
}
// TODO: Comment
type CreateRecipeRequest struct {
Title string
Description string
Instructions []RecipeInstruction
Serves int
Difficulty int
Duration RecipeDuration
Category RecipeMeal
Ingredients []RecipeIngredient
Sections []RecipeIngredientSection
Tags []string
}