diff --git a/controllers/RecipesApiController.php b/controllers/RecipesApiController.php index 5cfa1ce2..819fad6b 100644 --- a/controllers/RecipesApiController.php +++ b/controllers/RecipesApiController.php @@ -1,43 +1,63 @@ -RecipesService = new RecipesService(); - } - - protected $RecipesService; - - public function AddNotFulfilledProductsToShoppingList(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args) - { - $requestBody = $request->getParsedBody(); - $excludedProductIds = null; - - if ($requestBody !== null && array_key_exists('excludedProductIds', $requestBody)) - { - $excludedProductIds = $requestBody['excludedProductIds']; - } - - $this->RecipesService->AddNotFulfilledProductsToShoppingList($args['recipeId'], $excludedProductIds); - return $this->EmptyApiResponse($response); - } - - public function ConsumeRecipe(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args) - { - try - { - $this->RecipesService->ConsumeRecipe($args['recipeId']); - return $this->EmptyApiResponse($response); - } - catch (\Exception $ex) - { - return $this->GenericErrorResponse($response, $ex->getMessage()); - } - } -} +RecipesService = new RecipesService(); + } + + protected $RecipesService; + + public function AddNotFulfilledProductsToShoppingList(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args) + { + $requestBody = $request->getParsedBody(); + $excludedProductIds = null; + + if ($requestBody !== null && array_key_exists('excludedProductIds', $requestBody)) + { + $excludedProductIds = $requestBody['excludedProductIds']; + } + + $this->RecipesService->AddNotFulfilledProductsToShoppingList($args['recipeId'], $excludedProductIds); + return $this->EmptyApiResponse($response); + } + + public function ConsumeRecipe(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args) + { + try + { + $this->RecipesService->ConsumeRecipe($args['recipeId']); + return $this->EmptyApiResponse($response); + } + catch (\Exception $ex) + { + return $this->GenericErrorResponse($response, $ex->getMessage()); + } + } + + public function GetRecipeRequirements(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args) + { + try { + if(!$args['recipeId']){ + return $this->ApiResponse($this->RecipesService->GetRecipesResolved()); + } + $recipeResolved = FindObjectInArrayByPropertyValue($this->RecipesService->GetRecipesResolved(), 'recipe_id', $args['recipeId']); + if(!$recipeResolved) { + $errorMsg ='Recipe requirments do not exist for recipe_id ' . $args['recipe_id']; + $GenericError = $this->GenericErrorResponse($response, $errorMsg); + return $GenericError; + } + return $this->ApiResponse($recipeResolved); + } + catch (\Exception $ex) + { + return $this->GenericErrorResponse($response, $ex->getMessage()); + } + } +} diff --git a/grocy.openapi.json b/grocy.openapi.json index 196062a0..c886bd34 100644 --- a/grocy.openapi.json +++ b/grocy.openapi.json @@ -1687,6 +1687,84 @@ } } }, + "/recipes/{recipeId}/requirements": { + "get": { + "summary": "Get requirements for recipe", + "tags": [ + "Recipes" + ], + "parameters": [ + { + "in": "path", + "name": "recipeId", + "required": true, + "description": "A valid recipe id", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "A requirements recipe object", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RecipeRequirements" + } + } + } + }, + "400": { + "description": "The operation was not successful", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GenericErrorResponse" + } + } + } + } + } + } + }, + "/recipes/requirements": { + "get": { + "summary": "Get all requirements for recipes", + "tags": [ + "Recipes" + ], + "responses": { + "200": { + "description": "An array of requirements recipe objects", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "oneOf": [ + { + "$ref": "#/components/schemas/RecipeRequirements" + } + ] + } + } + } + } + }, + "400": { + "description": "The operation was not successful", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GenericErrorResponse" + } + } + } + } + } + } + }, "/chores": { "get": { "summary": "Returns all chores incl. the next estimated execution time per chore", @@ -2375,6 +2453,34 @@ "location_id": "4" } }, + "RecipeRequirements": { + "type": "object", + "properties": { + "recipe_id": { + "type": "integer" + }, + "need_fulfilled": { + "type": "boolean" + }, + "need_fulfilled_with_shopping_list": { + "type": "boolean" + }, + "missing_products_count": { + "type": "integer" + }, + "costs": { + "type": "number", + "format": "double" + } + }, + "example": { + "recipe_id": "1", + "need_fulfilled": "0", + "need_fulfilled_with_shopping_list": "0", + "missing_products_count": "2", + "costs": "17.74" + } + }, "ProductDetailsResponse": { "type": "object", "properties": { diff --git a/routes.php b/routes.php index aeb1131a..17fe9d49 100644 --- a/routes.php +++ b/routes.php @@ -173,6 +173,8 @@ $app->group('/api', function() if (GROCY_FEATURE_FLAG_RECIPES) { $this->post('/recipes/{recipeId}/add-not-fulfilled-products-to-shoppinglist', '\Grocy\Controllers\RecipesApiController:AddNotFulfilledProductsToShoppingList'); + $this->get('/recipes/{recipeId}/requirements', '\Grocy\Controllers\RecipesApiController:GetRecipeRequirements'); + $this->get('/recipes/requirements', '\Grocy\Controllers\RecipesApiController:GetRecipeRequirements'); $this->post('/recipes/{recipeId}/consume', '\Grocy\Controllers\RecipesApiController:ConsumeRecipe'); }