diff --git a/docs/docs/overrides/api.html b/docs/docs/overrides/api.html index 9f2cb2547..637c4237b 100644 --- a/docs/docs/overrides/api.html +++ b/docs/docs/overrides/api.html @@ -14,7 +14,7 @@
diff --git a/frontend/components/Domain/Recipe/RecipeContextMenu/RecipeContextMenuContent.vue b/frontend/components/Domain/Recipe/RecipeContextMenu/RecipeContextMenuContent.vue index f78832eef..953c948c9 100644 --- a/frontend/components/Domain/Recipe/RecipeContextMenu/RecipeContextMenuContent.vue +++ b/frontend/components/Domain/Recipe/RecipeContextMenu/RecipeContextMenuContent.vue @@ -377,11 +377,14 @@ async function deleteRecipe() { const download = useDownloader(); async function handleDownloadEvent() { - const { data } = await api.recipes.getZipToken(props.slug); - - if (data) { - download(api.recipes.getZipRedirectUrl(props.slug, data.token), `${props.slug}.zip`); + const { data: shareToken } = await api.recipes.share.createOne({ recipeId: props.recipeId }); + if (!shareToken) { + console.error("No share token received"); + alert.error(i18n.t("events.something-went-wrong")); + return; } + + download(api.recipes.share.getZipRedirectUrl(shareToken.id), `${props.slug}.zip`); } async function addRecipeToPlan() { diff --git a/frontend/composables/api/use-downloader.ts b/frontend/composables/api/use-downloader.ts index 4cecca9d0..1208000cb 100644 --- a/frontend/composables/api/use-downloader.ts +++ b/frontend/composables/api/use-downloader.ts @@ -1,9 +1,19 @@ +import { alert } from "~/composables/use-toast"; +import { useGlobalI18n } from "~/composables/use-global-i18n"; + export function useDownloader() { function download(url: string, filename: string) { useFetch(url, { method: "GET", responseType: "blob", onResponse({ response }) { + if (!response.ok) { + console.error("Download failed", response); + const i18n = useGlobalI18n(); + alert.error(i18n.t("events.something-went-wrong")); + return; + } + const url = window.URL.createObjectURL(new Blob([response._data])); const link = document.createElement("a"); link.href = url; diff --git a/frontend/lib/api/types/recipe.ts b/frontend/lib/api/types/recipe.ts index 7b34ac8a3..51491de3b 100644 --- a/frontend/lib/api/types/recipe.ts +++ b/frontend/lib/api/types/recipe.ts @@ -470,9 +470,6 @@ export interface RecipeToolSave { householdsWithTool?: string[]; groupId: string; } -export interface RecipeZipTokenResponse { - token: string; -} export interface SaveIngredientFood { id?: string | null; name: string; diff --git a/frontend/lib/api/user/recipes/recipe-share.ts b/frontend/lib/api/user/recipes/recipe-share.ts index 306d378f6..c55c0d932 100644 --- a/frontend/lib/api/user/recipes/recipe-share.ts +++ b/frontend/lib/api/user/recipes/recipe-share.ts @@ -6,9 +6,14 @@ const prefix = "/api"; const routes = { shareToken: `${prefix}/shared/recipes`, shareTokenId: (id: string) => `${prefix}/shared/recipes/${id}`, + shareTokenIdZip: (id: string) => `${prefix}/recipes/shared/${id}/zip`, }; export class RecipeShareApi extends BaseCRUDAPI { baseRoute: string = routes.shareToken; itemRoute = routes.shareTokenId; + + getZipRedirectUrl(tokenId: string) { + return routes.shareTokenIdZip(tokenId); + } } diff --git a/frontend/lib/api/user/recipes/recipe.ts b/frontend/lib/api/user/recipes/recipe.ts index 13fdb0a3a..489b30f99 100644 --- a/frontend/lib/api/user/recipes/recipe.ts +++ b/frontend/lib/api/user/recipes/recipe.ts @@ -9,7 +9,6 @@ import type { CreateRecipeByUrlBulk, ParsedIngredient, UpdateImageResponse, - RecipeZipTokenResponse, RecipeLastMade, RecipeSuggestionQuery, RecipeSuggestionResponse, @@ -46,8 +45,6 @@ const routes = { recipesTimelineEvent: `${prefix}/recipes/timeline/events`, recipesRecipeSlug: (recipe_slug: string) => `${prefix}/recipes/${recipe_slug}`, - recipesRecipeSlugExport: (recipe_slug: string) => `${prefix}/recipes/${recipe_slug}/exports`, - recipesRecipeSlugExportZip: (recipe_slug: string) => `${prefix}/recipes/${recipe_slug}/exports/zip`, recipesRecipeSlugImage: (recipe_slug: string) => `${prefix}/recipes/${recipe_slug}/image`, recipesRecipeSlugAssets: (recipe_slug: string) => `${prefix}/recipes/${recipe_slug}/assets`, @@ -182,14 +179,6 @@ export class RecipeAPI extends BaseCRUDAPI { return await this.requests.post(routes.recipesParseIngredient, { parser, ingredient }); } - async getZipToken(recipeSlug: string) { - return await this.requests.post(routes.recipesRecipeSlugExport(recipeSlug), {}); - } - - getZipRedirectUrl(recipeSlug: string, token: string) { - return `${routes.recipesRecipeSlugExportZip(recipeSlug)}?token=${token}`; - } - async updateMany(payload: Recipe[]) { return await this.requests.put(routes.recipesBase, payload); } diff --git a/frontend/pages/g/[groupSlug]/r/create/zip.vue b/frontend/pages/g/[groupSlug]/r/create/zip.vue index 59240e748..768e72d3e 100644 --- a/frontend/pages/g/[groupSlug]/r/create/zip.vue +++ b/frontend/pages/g/[groupSlug]/r/create/zip.vue @@ -37,14 +37,14 @@