feat(core): add secure recipe APIs, precise scaling and versioned imports
This commit is contained in:
commit
5d71d32e20
31 files changed
+6293
No files matched your search
@@ -0,0 +1,349 @@
|
||||
{
|
||||
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"version": {
|
||||
"type": "number",
|
||||
"const": 1
|
||||
},
|
||||
"recipes": {
|
||||
"minItems": 1,
|
||||
"maxItems": 100,
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"id": {
|
||||
"type": "string",
|
||||
"format": "uuid",
|
||||
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
|
||||
},
|
||||
"title": {
|
||||
"type": "string",
|
||||
"minLength": 2,
|
||||
"maxLength": 180
|
||||
},
|
||||
"subtitle": {
|
||||
"default": "",
|
||||
"type": "string",
|
||||
"maxLength": 200
|
||||
},
|
||||
"description": {
|
||||
"default": "",
|
||||
"type": "string",
|
||||
"maxLength": 4000
|
||||
},
|
||||
"image": {
|
||||
"default": "",
|
||||
"anyOf": [
|
||||
{
|
||||
"type": "string",
|
||||
"pattern": "^\\/(?:media\\/[a-f0-9-]+\\.webp|images\\/[a-z0-9-]+\\.(?:webp|jpg|svg))$"
|
||||
},
|
||||
{
|
||||
"type": "string",
|
||||
"const": ""
|
||||
}
|
||||
]
|
||||
},
|
||||
"images": {
|
||||
"default": [],
|
||||
"maxItems": 20,
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string",
|
||||
"pattern": "^\\/(?:media\\/[a-f0-9-]+\\.webp|images\\/[a-z0-9-]+\\.(?:webp|jpg|svg))$"
|
||||
}
|
||||
},
|
||||
"categories": {
|
||||
"default": [],
|
||||
"maxItems": 20,
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string",
|
||||
"minLength": 1,
|
||||
"maxLength": 60
|
||||
}
|
||||
},
|
||||
"tags": {
|
||||
"default": [],
|
||||
"maxItems": 30,
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string",
|
||||
"minLength": 1,
|
||||
"maxLength": 60
|
||||
}
|
||||
},
|
||||
"cuisine": {
|
||||
"default": "",
|
||||
"type": "string",
|
||||
"maxLength": 80
|
||||
},
|
||||
"difficulty": {
|
||||
"default": "Einfach",
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"Einfach",
|
||||
"Mittel",
|
||||
"Anspruchsvoll"
|
||||
]
|
||||
},
|
||||
"prepMinutes": {
|
||||
"default": 0,
|
||||
"type": "integer",
|
||||
"minimum": 0,
|
||||
"maximum": 10080
|
||||
},
|
||||
"cookMinutes": {
|
||||
"default": 0,
|
||||
"type": "integer",
|
||||
"minimum": 0,
|
||||
"maximum": 10080
|
||||
},
|
||||
"restMinutes": {
|
||||
"default": 0,
|
||||
"type": "integer",
|
||||
"minimum": 0,
|
||||
"maximum": 10080
|
||||
},
|
||||
"servings": {
|
||||
"type": "number",
|
||||
"exclusiveMinimum": 0,
|
||||
"maximum": 10000
|
||||
},
|
||||
"ingredients": {
|
||||
"minItems": 1,
|
||||
"maxItems": 200,
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"id": {
|
||||
"type": "string",
|
||||
"pattern": "^[a-zA-Z0-9_-]{1,80}$"
|
||||
},
|
||||
"name": {
|
||||
"type": "string",
|
||||
"minLength": 1,
|
||||
"maxLength": 160
|
||||
},
|
||||
"amount": {
|
||||
"default": null,
|
||||
"anyOf": [
|
||||
{
|
||||
"type": "number",
|
||||
"exclusiveMinimum": 0,
|
||||
"maximum": 1000000
|
||||
},
|
||||
{
|
||||
"type": "null"
|
||||
}
|
||||
]
|
||||
},
|
||||
"unit": {
|
||||
"default": "",
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"g",
|
||||
"kg",
|
||||
"ml",
|
||||
"l",
|
||||
"Stück",
|
||||
"TL",
|
||||
"EL",
|
||||
"Prise",
|
||||
"Bund",
|
||||
""
|
||||
]
|
||||
},
|
||||
"section": {
|
||||
"default": "",
|
||||
"type": "string",
|
||||
"maxLength": 80
|
||||
},
|
||||
"note": {
|
||||
"default": "",
|
||||
"type": "string",
|
||||
"maxLength": 200
|
||||
},
|
||||
"optional": {
|
||||
"default": false,
|
||||
"type": "boolean"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"id",
|
||||
"name",
|
||||
"amount",
|
||||
"unit",
|
||||
"section",
|
||||
"note",
|
||||
"optional"
|
||||
],
|
||||
"additionalProperties": false
|
||||
}
|
||||
},
|
||||
"steps": {
|
||||
"minItems": 1,
|
||||
"maxItems": 100,
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"id": {
|
||||
"type": "string",
|
||||
"pattern": "^[a-zA-Z0-9_-]{1,80}$"
|
||||
},
|
||||
"title": {
|
||||
"default": "",
|
||||
"type": "string",
|
||||
"maxLength": 160
|
||||
},
|
||||
"text": {
|
||||
"type": "string",
|
||||
"minLength": 1,
|
||||
"maxLength": 6000
|
||||
},
|
||||
"ingredients": {
|
||||
"default": [],
|
||||
"maxItems": 100,
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string",
|
||||
"pattern": "^[a-zA-Z0-9_-]{1,80}$"
|
||||
}
|
||||
},
|
||||
"timers": {
|
||||
"default": [],
|
||||
"maxItems": 10,
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"id": {
|
||||
"type": "string",
|
||||
"pattern": "^[a-zA-Z0-9_-]{1,80}$"
|
||||
},
|
||||
"label": {
|
||||
"type": "string",
|
||||
"minLength": 1,
|
||||
"maxLength": 100
|
||||
},
|
||||
"seconds": {
|
||||
"type": "integer",
|
||||
"minimum": 1,
|
||||
"maximum": 172800
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"id",
|
||||
"label",
|
||||
"seconds"
|
||||
],
|
||||
"additionalProperties": false
|
||||
}
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"id",
|
||||
"title",
|
||||
"text",
|
||||
"ingredients",
|
||||
"timers"
|
||||
],
|
||||
"additionalProperties": false
|
||||
}
|
||||
},
|
||||
"tips": {
|
||||
"default": "",
|
||||
"type": "string",
|
||||
"maxLength": 6000
|
||||
},
|
||||
"storage": {
|
||||
"default": "",
|
||||
"type": "string",
|
||||
"maxLength": 3000
|
||||
},
|
||||
"nutrition": {
|
||||
"default": null,
|
||||
"anyOf": [
|
||||
{
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"kcal": {
|
||||
"type": "number",
|
||||
"minimum": 0
|
||||
},
|
||||
"protein": {
|
||||
"type": "number",
|
||||
"minimum": 0
|
||||
},
|
||||
"carbs": {
|
||||
"type": "number",
|
||||
"minimum": 0
|
||||
},
|
||||
"fat": {
|
||||
"type": "number",
|
||||
"minimum": 0
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"kcal",
|
||||
"protein",
|
||||
"carbs",
|
||||
"fat"
|
||||
],
|
||||
"additionalProperties": false
|
||||
},
|
||||
{
|
||||
"type": "null"
|
||||
}
|
||||
]
|
||||
},
|
||||
"published": {
|
||||
"default": false,
|
||||
"type": "boolean"
|
||||
},
|
||||
"createdAt": {
|
||||
"type": "string",
|
||||
"format": "date-time",
|
||||
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
|
||||
},
|
||||
"updatedAt": {
|
||||
"type": "string",
|
||||
"format": "date-time",
|
||||
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"title",
|
||||
"subtitle",
|
||||
"description",
|
||||
"image",
|
||||
"images",
|
||||
"categories",
|
||||
"tags",
|
||||
"cuisine",
|
||||
"difficulty",
|
||||
"prepMinutes",
|
||||
"cookMinutes",
|
||||
"restMinutes",
|
||||
"servings",
|
||||
"ingredients",
|
||||
"steps",
|
||||
"tips",
|
||||
"storage",
|
||||
"nutrition",
|
||||
"published"
|
||||
],
|
||||
"additionalProperties": false
|
||||
}
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"version",
|
||||
"recipes"
|
||||
],
|
||||
"additionalProperties": false
|
||||
}
|
||||
Reference in new issue
Block a user