| 
									
										
										
										
											2021-11-22 20:10:48 -09:00
										 |  |  | import { CommentsApi } from "./recipe-comments"; | 
					
						
							| 
									
										
										
										
											2021-12-05 11:55:46 -09:00
										 |  |  | import { RecipeShareApi } from "./recipe-share"; | 
					
						
							| 
									
										
										
										
											2021-11-22 20:10:48 -09:00
										 |  |  | import { BaseCRUDAPI } from "~/api/_base"; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-21 21:22:02 +02:00
										 |  |  | import { Recipe, CreateRecipe, RecipeAsset, CreateRecipeByUrlBulk, ParsedIngredient, UpdateImageResponse, RecipeZipTokenResponse } from "~/types/api-types/recipe"; | 
					
						
							| 
									
										
										
										
											2021-11-22 20:10:48 -09:00
										 |  |  | import { ApiRequestInstance } from "~/types/api"; | 
					
						
							| 
									
										
										
										
											2021-08-01 19:24:47 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-21 21:22:02 +02:00
										 |  |  | export type Parser = "nlp" | "brute"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | export interface CreateAsset { | 
					
						
							|  |  |  |   name: string; | 
					
						
							|  |  |  |   icon: string; | 
					
						
							|  |  |  |   extension: string; | 
					
						
							|  |  |  |   file: File; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-01 19:24:47 -08:00
										 |  |  | const prefix = "/api"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const routes = { | 
					
						
							|  |  |  |   recipesCreate: `${prefix}/recipes/create`, | 
					
						
							|  |  |  |   recipesBase: `${prefix}/recipes`, | 
					
						
							|  |  |  |   recipesTestScrapeUrl: `${prefix}/recipes/test-scrape-url`, | 
					
						
							|  |  |  |   recipesCreateUrl: `${prefix}/recipes/create-url`, | 
					
						
							| 
									
										
										
										
											2021-10-28 19:28:33 -08:00
										 |  |  |   recipesCreateUrlBulk: `${prefix}/recipes/create-url/bulk`, | 
					
						
							| 
									
										
										
										
											2021-08-01 19:24:47 -08:00
										 |  |  |   recipesCreateFromZip: `${prefix}/recipes/create-from-zip`, | 
					
						
							| 
									
										
										
										
											2021-08-02 22:15:11 -08:00
										 |  |  |   recipesCategory: `${prefix}/recipes/category`, | 
					
						
							| 
									
										
										
										
											2021-10-09 13:08:23 -08:00
										 |  |  |   recipesParseIngredient: `${prefix}/parser/ingredient`, | 
					
						
							|  |  |  |   recipesParseIngredients: `${prefix}/parser/ingredients`, | 
					
						
							| 
									
										
										
										
											2021-08-02 22:15:11 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-01 19:24:47 -08:00
										 |  |  |   recipesRecipeSlug: (recipe_slug: string) => `${prefix}/recipes/${recipe_slug}`, | 
					
						
							| 
									
										
										
										
											2021-11-04 18:15:23 -08:00
										 |  |  |   recipesRecipeSlugExport: (recipe_slug: string) => `${prefix}/recipes/${recipe_slug}/exports`, | 
					
						
							|  |  |  |   recipesRecipeSlugExportZip: (recipe_slug: string) => `${prefix}/recipes/${recipe_slug}/exports/zip`, | 
					
						
							| 
									
										
										
										
											2021-08-01 19:24:47 -08:00
										 |  |  |   recipesRecipeSlugImage: (recipe_slug: string) => `${prefix}/recipes/${recipe_slug}/image`, | 
					
						
							|  |  |  |   recipesRecipeSlugAssets: (recipe_slug: string) => `${prefix}/recipes/${recipe_slug}/assets`, | 
					
						
							| 
									
										
										
										
											2021-08-08 14:10:32 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   recipesSlugComments: (slug: string) => `${prefix}/recipes/${slug}/comments`, | 
					
						
							|  |  |  |   recipesSlugCommentsId: (slug: string, id: number) => `${prefix}/recipes/${slug}/comments/${id}`, | 
					
						
							| 
									
										
										
										
											2021-12-05 11:55:46 -09:00
										 |  |  | 
 | 
					
						
							|  |  |  |   recipeShareToken: (token: string) => `${prefix}/recipes/shared/${token}`, | 
					
						
							| 
									
										
										
										
											2021-08-01 19:24:47 -08:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-21 21:22:02 +02:00
										 |  |  | export class RecipeAPI extends BaseCRUDAPI<CreateRecipe, Recipe, Recipe> { | 
					
						
							| 
									
										
										
										
											2021-08-06 16:28:12 -08:00
										 |  |  |   baseRoute: string = routes.recipesBase; | 
					
						
							| 
									
										
										
										
											2021-08-03 21:38:45 -08:00
										 |  |  |   itemRoute = routes.recipesRecipeSlug; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-05 11:55:46 -09:00
										 |  |  |   comments: CommentsApi; | 
					
						
							|  |  |  |   share: RecipeShareApi; | 
					
						
							| 
									
										
										
										
											2021-11-22 20:10:48 -09:00
										 |  |  | 
 | 
					
						
							|  |  |  |   constructor(requests: ApiRequestInstance) { | 
					
						
							|  |  |  |     super(requests); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     this.comments = new CommentsApi(requests); | 
					
						
							| 
									
										
										
										
											2021-12-05 11:55:46 -09:00
										 |  |  |     this.share = new RecipeShareApi(requests); | 
					
						
							| 
									
										
										
										
											2021-11-22 20:10:48 -09:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-02 22:15:11 -08:00
										 |  |  |   async getAllByCategory(categories: string[]) { | 
					
						
							|  |  |  |     return await this.requests.get<Recipe[]>(routes.recipesCategory, { | 
					
						
							| 
									
										
										
										
											2021-08-03 21:38:45 -08:00
										 |  |  |       categories, | 
					
						
							| 
									
										
										
										
											2021-08-02 22:15:11 -08:00
										 |  |  |     }); | 
					
						
							| 
									
										
										
										
											2021-08-01 19:24:47 -08:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-22 20:10:48 -09:00
										 |  |  |   async createAsset(recipeSlug: string, payload: CreateAsset) { | 
					
						
							|  |  |  |     const formData = new FormData(); | 
					
						
							|  |  |  |     formData.append("file", payload.file); | 
					
						
							|  |  |  |     formData.append("name", payload.name); | 
					
						
							|  |  |  |     formData.append("extension", payload.extension); | 
					
						
							|  |  |  |     formData.append("icon", payload.icon); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-21 21:22:02 +02:00
										 |  |  |     return await this.requests.post<RecipeAsset>(routes.recipesRecipeSlugAssets(recipeSlug), formData); | 
					
						
							| 
									
										
										
										
											2021-11-22 20:10:48 -09:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-03 21:38:45 -08:00
										 |  |  |   updateImage(slug: string, fileObject: File) { | 
					
						
							|  |  |  |     const formData = new FormData(); | 
					
						
							|  |  |  |     formData.append("image", fileObject); | 
					
						
							| 
									
										
										
										
											2022-01-16 03:38:11 +01:00
										 |  |  |     formData.append("extension", fileObject.name.split(".").pop() ?? ""); | 
					
						
							| 
									
										
										
										
											2021-08-03 21:38:45 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-21 21:22:02 +02:00
										 |  |  |     return this.requests.put<UpdateImageResponse, FormData>(routes.recipesRecipeSlugImage(slug), formData); | 
					
						
							| 
									
										
										
										
											2021-08-03 21:38:45 -08:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   updateImagebyURL(slug: string, url: string) { | 
					
						
							| 
									
										
										
										
											2022-05-21 21:22:02 +02:00
										 |  |  |     return this.requests.post<UpdateImageResponse>(routes.recipesRecipeSlugImage(slug), { url }); | 
					
						
							| 
									
										
										
										
											2021-08-03 21:38:45 -08:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-19 18:45:03 -08:00
										 |  |  |   async testCreateOneUrl(url: string) { | 
					
						
							|  |  |  |     return await this.requests.post<Recipe | null>(routes.recipesTestScrapeUrl, { url }); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-23 12:23:12 -08:00
										 |  |  |   async createOneByUrl(url: string, includeTags: boolean) { | 
					
						
							|  |  |  |     return await this.requests.post<string>(routes.recipesCreateUrl, { url, includeTags }); | 
					
						
							| 
									
										
										
										
											2021-08-02 22:15:11 -08:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2021-08-01 19:24:47 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-21 21:22:02 +02:00
										 |  |  |   async createManyByUrl(payload: CreateRecipeByUrlBulk) { | 
					
						
							|  |  |  |     return await this.requests.post<string>(routes.recipesCreateUrlBulk, payload); | 
					
						
							| 
									
										
										
										
											2021-10-28 19:28:33 -08:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-16 16:06:13 -08:00
										 |  |  |   async parseIngredients(parser: Parser, ingredients: Array<string>) { | 
					
						
							|  |  |  |     parser = parser || "nlp"; | 
					
						
							|  |  |  |     return await this.requests.post<ParsedIngredient[]>(routes.recipesParseIngredients, { parser, ingredients }); | 
					
						
							| 
									
										
										
										
											2021-08-28 14:14:21 -08:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2021-10-09 13:08:23 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-16 16:06:13 -08:00
										 |  |  |   async parseIngredient(parser: Parser, ingredient: string) { | 
					
						
							|  |  |  |     parser = parser || "nlp"; | 
					
						
							|  |  |  |     return await this.requests.post<ParsedIngredient>(routes.recipesParseIngredient, { parser, ingredient }); | 
					
						
							| 
									
										
										
										
											2021-10-09 13:08:23 -08:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2021-11-04 18:15:23 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   async getZipToken(recipeSlug: string) { | 
					
						
							| 
									
										
										
										
											2022-05-21 21:22:02 +02:00
										 |  |  |     return await this.requests.post<RecipeZipTokenResponse>(routes.recipesRecipeSlugExport(recipeSlug), {}); | 
					
						
							| 
									
										
										
										
											2021-11-04 18:15:23 -08:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   getZipRedirectUrl(recipeSlug: string, token: string) { | 
					
						
							|  |  |  |     return `${routes.recipesRecipeSlugExportZip(recipeSlug)}?token=${token}`; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2021-12-05 11:55:46 -09:00
										 |  |  | 
 | 
					
						
							|  |  |  |   async getShared(item_id: string) { | 
					
						
							|  |  |  |     return await this.requests.get<Recipe>(routes.recipeShareToken(item_id)); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2021-08-01 19:24:47 -08:00
										 |  |  | } |