This should be a nice test! Hopefully other users cannot delete my recipes. Though they're setup to soft delete.
172 lines
5.1 KiB
Go
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
|
|
}
|