mirror of
				https://github.com/mealie-recipes/mealie.git
				synced 2025-10-31 02:03:35 -04:00 
			
		
		
		
	docs: Swagger/OpenAPI Organization (#4446)
This commit is contained in:
		
				
					committed by
					
						 GitHub
						GitHub
					
				
			
			
				
	
			
			
			
						parent
						
							0e25c7485d
						
					
				
				
					commit
					8b6c75877d
				
			
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							| @@ -66,37 +66,6 @@ class GroupMealplanController(BaseCrudController): | |||||||
|         ) |         ) | ||||||
|         return recipes_data.items |         return recipes_data.items | ||||||
|  |  | ||||||
|     @router.get("/today") |  | ||||||
|     def get_todays_meals(self): |  | ||||||
|         return self.repo.get_today() |  | ||||||
|  |  | ||||||
|     @router.post("/random", response_model=ReadPlanEntry) |  | ||||||
|     def create_random_meal(self, data: CreateRandomEntry): |  | ||||||
|         """ |  | ||||||
|         `create_random_meal` is a route that provides the randomized functionality for mealplaners. |  | ||||||
|         It operates by following the rules set out in the household's mealplan settings. If no settings |  | ||||||
|         are set, it will return any random meal. |  | ||||||
|  |  | ||||||
|         Refer to the mealplan settings routes for more information on how rules can be applied |  | ||||||
|         to the random meal selector. |  | ||||||
|         """ |  | ||||||
|         random_recipes = self._get_random_recipes_from_mealplan(data.date, data.entry_type) |  | ||||||
|         if not random_recipes: |  | ||||||
|             raise HTTPException( |  | ||||||
|                 status_code=404, detail=ErrorResponse.respond(message=self.t("mealplan.no-recipes-match-your-rules")) |  | ||||||
|             ) |  | ||||||
|  |  | ||||||
|         recipe = random_recipes[0] |  | ||||||
|         return self.mixins.create_one( |  | ||||||
|             SavePlanEntry( |  | ||||||
|                 date=data.date, |  | ||||||
|                 entry_type=data.entry_type, |  | ||||||
|                 recipe_id=recipe.id, |  | ||||||
|                 group_id=self.group_id, |  | ||||||
|                 user_id=self.user.id, |  | ||||||
|             ) |  | ||||||
|         ) |  | ||||||
|  |  | ||||||
|     @router.get("", response_model=PlanEntryPagination) |     @router.get("", response_model=PlanEntryPagination) | ||||||
|     def get_all( |     def get_all( | ||||||
|         self, |         self, | ||||||
| @@ -144,6 +113,37 @@ class GroupMealplanController(BaseCrudController): | |||||||
|  |  | ||||||
|         return result |         return result | ||||||
|  |  | ||||||
|  |     @router.get("/today") | ||||||
|  |     def get_todays_meals(self): | ||||||
|  |         return self.repo.get_today() | ||||||
|  |  | ||||||
|  |     @router.post("/random", response_model=ReadPlanEntry) | ||||||
|  |     def create_random_meal(self, data: CreateRandomEntry): | ||||||
|  |         """ | ||||||
|  |         `create_random_meal` is a route that provides the randomized functionality for mealplaners. | ||||||
|  |         It operates by following the rules set out in the household's mealplan settings. If no settings | ||||||
|  |         are set, it will return any random meal. | ||||||
|  |  | ||||||
|  |         Refer to the mealplan settings routes for more information on how rules can be applied | ||||||
|  |         to the random meal selector. | ||||||
|  |         """ | ||||||
|  |         random_recipes = self._get_random_recipes_from_mealplan(data.date, data.entry_type) | ||||||
|  |         if not random_recipes: | ||||||
|  |             raise HTTPException( | ||||||
|  |                 status_code=404, detail=ErrorResponse.respond(message=self.t("mealplan.no-recipes-match-your-rules")) | ||||||
|  |             ) | ||||||
|  |  | ||||||
|  |         recipe = random_recipes[0] | ||||||
|  |         return self.mixins.create_one( | ||||||
|  |             SavePlanEntry( | ||||||
|  |                 date=data.date, | ||||||
|  |                 entry_type=data.entry_type, | ||||||
|  |                 recipe_id=recipe.id, | ||||||
|  |                 group_id=self.group_id, | ||||||
|  |                 user_id=self.user.id, | ||||||
|  |             ) | ||||||
|  |         ) | ||||||
|  |  | ||||||
|     @router.get("/{item_id}", response_model=ReadPlanEntry) |     @router.get("/{item_id}", response_model=ReadPlanEntry) | ||||||
|     def get_one(self, item_id: int): |     def get_one(self, item_id: int): | ||||||
|         return self.mixins.get_one(item_id) |         return self.mixins.get_one(item_id) | ||||||
|   | |||||||
| @@ -230,28 +230,6 @@ class ShoppingListController(BaseCrudController): | |||||||
|     # ======================================================================= |     # ======================================================================= | ||||||
|     # Other Operations |     # Other Operations | ||||||
|  |  | ||||||
|     @router.post("/{item_id}/recipe/{recipe_id}", response_model=ShoppingListOut) |  | ||||||
|     def add_recipe_ingredients_to_list( |  | ||||||
|         self, item_id: UUID4, recipe_id: UUID4, data: ShoppingListAddRecipeParams | None = None |  | ||||||
|     ): |  | ||||||
|         shopping_list, items = self.service.add_recipe_ingredients_to_list( |  | ||||||
|             item_id, recipe_id, data.recipe_increment_quantity if data else 1, data.recipe_ingredients if data else None |  | ||||||
|         ) |  | ||||||
|  |  | ||||||
|         publish_list_item_events(self.publish_event, items) |  | ||||||
|         return shopping_list |  | ||||||
|  |  | ||||||
|     @router.post("/{item_id}/recipe/{recipe_id}/delete", response_model=ShoppingListOut) |  | ||||||
|     def remove_recipe_ingredients_from_list( |  | ||||||
|         self, item_id: UUID4, recipe_id: UUID4, data: ShoppingListRemoveRecipeParams | None = None |  | ||||||
|     ): |  | ||||||
|         shopping_list, items = self.service.remove_recipe_ingredients_from_list( |  | ||||||
|             item_id, recipe_id, data.recipe_decrement_quantity if data else 1 |  | ||||||
|         ) |  | ||||||
|  |  | ||||||
|         publish_list_item_events(self.publish_event, items) |  | ||||||
|         return shopping_list |  | ||||||
|  |  | ||||||
|     @router.put("/{item_id}/label-settings", response_model=ShoppingListOut) |     @router.put("/{item_id}/label-settings", response_model=ShoppingListOut) | ||||||
|     def update_label_settings(self, item_id: UUID4, data: list[ShoppingListMultiPurposeLabelUpdate]): |     def update_label_settings(self, item_id: UUID4, data: list[ShoppingListMultiPurposeLabelUpdate]): | ||||||
|         for setting in data: |         for setting in data: | ||||||
| @@ -273,3 +251,25 @@ class ShoppingListController(BaseCrudController): | |||||||
|         ) |         ) | ||||||
|  |  | ||||||
|         return updated_list |         return updated_list | ||||||
|  |  | ||||||
|  |     @router.post("/{item_id}/recipe/{recipe_id}", response_model=ShoppingListOut) | ||||||
|  |     def add_recipe_ingredients_to_list( | ||||||
|  |         self, item_id: UUID4, recipe_id: UUID4, data: ShoppingListAddRecipeParams | None = None | ||||||
|  |     ): | ||||||
|  |         shopping_list, items = self.service.add_recipe_ingredients_to_list( | ||||||
|  |             item_id, recipe_id, data.recipe_increment_quantity if data else 1, data.recipe_ingredients if data else None | ||||||
|  |         ) | ||||||
|  |  | ||||||
|  |         publish_list_item_events(self.publish_event, items) | ||||||
|  |         return shopping_list | ||||||
|  |  | ||||||
|  |     @router.post("/{item_id}/recipe/{recipe_id}/delete", response_model=ShoppingListOut) | ||||||
|  |     def remove_recipe_ingredients_from_list( | ||||||
|  |         self, item_id: UUID4, recipe_id: UUID4, data: ShoppingListRemoveRecipeParams | None = None | ||||||
|  |     ): | ||||||
|  |         shopping_list, items = self.service.remove_recipe_ingredients_from_list( | ||||||
|  |             item_id, recipe_id, data.recipe_decrement_quantity if data else 1 | ||||||
|  |         ) | ||||||
|  |  | ||||||
|  |         publish_list_item_events(self.publish_event, items) | ||||||
|  |         return shopping_list | ||||||
|   | |||||||
| @@ -67,6 +67,11 @@ class RecipeCategoryController(BaseCrudController): | |||||||
|  |  | ||||||
|         return new_category |         return new_category | ||||||
|  |  | ||||||
|  |     @router.get("/empty", response_model=list[CategoryBase]) | ||||||
|  |     def get_all_empty(self): | ||||||
|  |         """Returns a list of categories that do not contain any recipes""" | ||||||
|  |         return self.repos.categories.get_empty() | ||||||
|  |  | ||||||
|     @router.get("/{item_id}", response_model=CategorySummary) |     @router.get("/{item_id}", response_model=CategorySummary) | ||||||
|     def get_one(self, item_id: UUID4): |     def get_one(self, item_id: UUID4): | ||||||
|         """Returns a list of recipes associated with the provided category.""" |         """Returns a list of recipes associated with the provided category.""" | ||||||
| @@ -114,11 +119,6 @@ class RecipeCategoryController(BaseCrudController): | |||||||
|     # ========================================================================= |     # ========================================================================= | ||||||
|     # Read All Operations |     # Read All Operations | ||||||
|  |  | ||||||
|     @router.get("/empty", response_model=list[CategoryBase]) |  | ||||||
|     def get_all_empty(self): |  | ||||||
|         """Returns a list of categories that do not contain any recipes""" |  | ||||||
|         return self.repos.categories.get_empty() |  | ||||||
|  |  | ||||||
|     @router.get("/slug/{category_slug}") |     @router.get("/slug/{category_slug}") | ||||||
|     def get_one_by_slug(self, category_slug: str): |     def get_one_by_slug(self, category_slug: str): | ||||||
|         """Returns a category object with the associated recieps relating to the category""" |         """Returns a category object with the associated recieps relating to the category""" | ||||||
|   | |||||||
| @@ -10,13 +10,13 @@ router = APIRouter(prefix="/parser") | |||||||
|  |  | ||||||
| @controller(router) | @controller(router) | ||||||
| class IngredientParserController(BaseUserController): | class IngredientParserController(BaseUserController): | ||||||
|     @router.post("/ingredients", response_model=list[ParsedIngredient]) |  | ||||||
|     async def parse_ingredients(self, ingredients: IngredientsRequest): |  | ||||||
|         parser = get_parser(ingredients.parser, self.group_id, self.session) |  | ||||||
|         return await parser.parse(ingredients.ingredients) |  | ||||||
|  |  | ||||||
|     @router.post("/ingredient", response_model=ParsedIngredient) |     @router.post("/ingredient", response_model=ParsedIngredient) | ||||||
|     async def parse_ingredient(self, ingredient: IngredientRequest): |     async def parse_ingredient(self, ingredient: IngredientRequest): | ||||||
|         parser = get_parser(ingredient.parser, self.group_id, self.session) |         parser = get_parser(ingredient.parser, self.group_id, self.session) | ||||||
|         response = await parser.parse([ingredient.ingredient]) |         response = await parser.parse([ingredient.ingredient]) | ||||||
|         return response[0] |         return response[0] | ||||||
|  |  | ||||||
|  |     @router.post("/ingredients", response_model=list[ParsedIngredient]) | ||||||
|  |     async def parse_ingredients(self, ingredients: IngredientsRequest): | ||||||
|  |         parser = get_parser(ingredients.parser, self.group_id, self.session) | ||||||
|  |         return await parser.parse(ingredients.ingredients) | ||||||
|   | |||||||
| @@ -203,6 +203,20 @@ class RecipeController(BaseRecipeController): | |||||||
|     # ======================================================================= |     # ======================================================================= | ||||||
|     # URL Scraping Operations |     # URL Scraping Operations | ||||||
|  |  | ||||||
|  |     @router.post("/test-scrape-url") | ||||||
|  |     async def test_parse_recipe_url(self, data: ScrapeRecipeTest): | ||||||
|  |         # Debugger should produce the same result as the scraper sees before cleaning | ||||||
|  |         ScraperClass = RecipeScraperOpenAI if data.use_openai else RecipeScraperPackage | ||||||
|  |         try: | ||||||
|  |             if scraped_data := await ScraperClass(data.url, self.translator).scrape_url(): | ||||||
|  |                 return scraped_data.schema.data | ||||||
|  |         except ForceTimeoutException as e: | ||||||
|  |             raise HTTPException( | ||||||
|  |                 status_code=408, detail=ErrorResponse.respond(message="Recipe Scraping Timed Out") | ||||||
|  |             ) from e | ||||||
|  |  | ||||||
|  |         return "recipe_scrapers was unable to scrape this URL" | ||||||
|  |  | ||||||
|     @router.post("/create/html-or-json", status_code=201) |     @router.post("/create/html-or-json", status_code=201) | ||||||
|     async def create_recipe_from_html_or_json(self, req: ScrapeRecipeData): |     async def create_recipe_from_html_or_json(self, req: ScrapeRecipeData): | ||||||
|         """Takes in raw HTML or a https://schema.org/Recipe object as a JSON string and parses it like a URL""" |         """Takes in raw HTML or a https://schema.org/Recipe object as a JSON string and parses it like a URL""" | ||||||
| @@ -271,20 +285,6 @@ class RecipeController(BaseRecipeController): | |||||||
|  |  | ||||||
|         return {"reportId": report_id} |         return {"reportId": report_id} | ||||||
|  |  | ||||||
|     @router.post("/test-scrape-url") |  | ||||||
|     async def test_parse_recipe_url(self, data: ScrapeRecipeTest): |  | ||||||
|         # Debugger should produce the same result as the scraper sees before cleaning |  | ||||||
|         ScraperClass = RecipeScraperOpenAI if data.use_openai else RecipeScraperPackage |  | ||||||
|         try: |  | ||||||
|             if scraped_data := await ScraperClass(data.url, self.translator).scrape_url(): |  | ||||||
|                 return scraped_data.schema.data |  | ||||||
|         except ForceTimeoutException as e: |  | ||||||
|             raise HTTPException( |  | ||||||
|                 status_code=408, detail=ErrorResponse.respond(message="Recipe Scraping Timed Out") |  | ||||||
|             ) from e |  | ||||||
|  |  | ||||||
|         return "recipe_scrapers was unable to scrape this URL" |  | ||||||
|  |  | ||||||
|     # ================================================================================================================== |     # ================================================================================================================== | ||||||
|     # Other Create Operations |     # Other Create Operations | ||||||
|  |  | ||||||
|   | |||||||
| @@ -35,15 +35,6 @@ class IngredientFoodsController(BaseUserController): | |||||||
|             self.registered_exceptions, |             self.registered_exceptions, | ||||||
|         ) |         ) | ||||||
|  |  | ||||||
|     @router.put("/merge", response_model=SuccessResponse) |  | ||||||
|     def merge_one(self, data: MergeFood): |  | ||||||
|         try: |  | ||||||
|             self.repo.merge(data.from_food, data.to_food) |  | ||||||
|             return SuccessResponse.respond("Successfully merged foods") |  | ||||||
|         except Exception as e: |  | ||||||
|             self.logger.error(e) |  | ||||||
|             raise HTTPException(500, "Failed to merge foods") from e |  | ||||||
|  |  | ||||||
|     @router.get("", response_model=IngredientFoodPagination) |     @router.get("", response_model=IngredientFoodPagination) | ||||||
|     def get_all(self, q: PaginationQuery = Depends(PaginationQuery), search: str | None = None): |     def get_all(self, q: PaginationQuery = Depends(PaginationQuery), search: str | None = None): | ||||||
|         response = self.repo.page_all( |         response = self.repo.page_all( | ||||||
| @@ -60,6 +51,15 @@ class IngredientFoodsController(BaseUserController): | |||||||
|         save_data = mapper.cast(data, SaveIngredientFood, group_id=self.group_id) |         save_data = mapper.cast(data, SaveIngredientFood, group_id=self.group_id) | ||||||
|         return self.mixins.create_one(save_data) |         return self.mixins.create_one(save_data) | ||||||
|  |  | ||||||
|  |     @router.put("/merge", response_model=SuccessResponse) | ||||||
|  |     def merge_one(self, data: MergeFood): | ||||||
|  |         try: | ||||||
|  |             self.repo.merge(data.from_food, data.to_food) | ||||||
|  |             return SuccessResponse.respond("Successfully merged foods") | ||||||
|  |         except Exception as e: | ||||||
|  |             self.logger.error(e) | ||||||
|  |             raise HTTPException(500, "Failed to merge foods") from e | ||||||
|  |  | ||||||
|     @router.get("/{item_id}", response_model=IngredientFood) |     @router.get("/{item_id}", response_model=IngredientFood) | ||||||
|     def get_one(self, item_id: UUID4): |     def get_one(self, item_id: UUID4): | ||||||
|         return self.mixins.get_one(item_id) |         return self.mixins.get_one(item_id) | ||||||
|   | |||||||
| @@ -35,15 +35,6 @@ class IngredientUnitsController(BaseUserController): | |||||||
|             self.registered_exceptions, |             self.registered_exceptions, | ||||||
|         ) |         ) | ||||||
|  |  | ||||||
|     @router.put("/merge", response_model=SuccessResponse) |  | ||||||
|     def merge_one(self, data: MergeUnit): |  | ||||||
|         try: |  | ||||||
|             self.repo.merge(data.from_unit, data.to_unit) |  | ||||||
|             return SuccessResponse.respond("Successfully merged units") |  | ||||||
|         except Exception as e: |  | ||||||
|             self.logger.error(e) |  | ||||||
|             raise HTTPException(500, "Failed to merge units") from e |  | ||||||
|  |  | ||||||
|     @router.get("", response_model=IngredientUnitPagination) |     @router.get("", response_model=IngredientUnitPagination) | ||||||
|     def get_all(self, q: PaginationQuery = Depends(PaginationQuery), search: str | None = None): |     def get_all(self, q: PaginationQuery = Depends(PaginationQuery), search: str | None = None): | ||||||
|         response = self.repo.page_all( |         response = self.repo.page_all( | ||||||
| @@ -60,6 +51,15 @@ class IngredientUnitsController(BaseUserController): | |||||||
|         save_data = mapper.cast(data, SaveIngredientUnit, group_id=self.group_id) |         save_data = mapper.cast(data, SaveIngredientUnit, group_id=self.group_id) | ||||||
|         return self.mixins.create_one(save_data) |         return self.mixins.create_one(save_data) | ||||||
|  |  | ||||||
|  |     @router.put("/merge", response_model=SuccessResponse) | ||||||
|  |     def merge_one(self, data: MergeUnit): | ||||||
|  |         try: | ||||||
|  |             self.repo.merge(data.from_unit, data.to_unit) | ||||||
|  |             return SuccessResponse.respond("Successfully merged units") | ||||||
|  |         except Exception as e: | ||||||
|  |             self.logger.error(e) | ||||||
|  |             raise HTTPException(500, "Failed to merge units") from e | ||||||
|  |  | ||||||
|     @router.get("/{item_id}", response_model=IngredientUnit) |     @router.get("/{item_id}", response_model=IngredientUnit) | ||||||
|     def get_one(self, item_id: UUID4): |     def get_one(self, item_id: UUID4): | ||||||
|         return self.mixins.get_one(item_id) |         return self.mixins.get_one(item_id) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user