1
0
Fork 0
mirror of https://github.com/mealie-recipes/mealie.git synced 2025-08-04 13:05:21 +02:00

add expiring share links to url recipe actions

This commit is contained in:
Ian Pösse-Koch 2024-12-03 22:24:59 +01:00
parent d26e29d1c5
commit 928a9184bd

View file

@ -34,7 +34,6 @@ export const useGroupRecipeActions = function (
orderDirection: string | null = "asc", orderDirection: string | null = "asc",
) { ) {
const api = useUserApi(); const api = useUserApi();
async function refreshGroupRecipeActions() { async function refreshGroupRecipeActions() {
loading.value = true; loading.value = true;
const { data } = await api.groupRecipeActions.getAll(1, -1, { orderBy, orderDirection }); const { data } = await api.groupRecipeActions.getAll(1, -1, { orderBy, orderDirection });
@ -46,8 +45,40 @@ export const useGroupRecipeActions = function (
return groupRecipeActions.value; return groupRecipeActions.value;
}); });
function parseRecipeActionUrl(url: string, recipe: Recipe): string { function getTokenLink(token: string, groupSlug: string) {
return `${window.location.origin}/g/${groupSlug}/shared/r/${token}`;
}
async function parseRecipeActionUrl(url: string, recipe: Recipe): Promise<string> {
/* eslint-disable no-template-curly-in-string */ /* eslint-disable no-template-curly-in-string */
const shareLinkRegex = /\$\{share-link-expires-seconds-[0-9]+\}/g;
const group = (await api.groups.getOne(recipe.groupId || "")).data;
const shareLinkStringMatches = url.matchAll(shareLinkRegex);
if (shareLinkStringMatches) {
const shareLinkSet = new Set<string>();
for (const match of shareLinkStringMatches) {
shareLinkSet.add(match[0]);
}
const shareLinkStrings = Array.from(shareLinkSet.values());
for (let i = 0; i < shareLinkStrings.length; i++) {
const shareLinkString = shareLinkStrings[i];
const seconds = parseInt(shareLinkString.split("-")[4]);
const expires = new Date();
expires.setSeconds(expires.getSeconds() + seconds);
const shareLink = await api.recipes.share.createOne({
recipeId: recipe.id || "",
expiresAt: expires.toISOString(),
});
const groupSlug = group?.slug || "";
url = url.replace(shareLinkString, getTokenLink(shareLink.data?.id || "", groupSlug));
}
}
return url return url
.replace("${url}", window.location.href) .replace("${url}", window.location.href)
.replace("${id}", recipe.id || "") .replace("${id}", recipe.id || "")
@ -56,10 +87,11 @@ export const useGroupRecipeActions = function (
}; };
async function execute(action: GroupRecipeActionOut, recipe: Recipe): Promise<void | RequestResponse<unknown>> { async function execute(action: GroupRecipeActionOut, recipe: Recipe): Promise<void | RequestResponse<unknown>> {
const url = parseRecipeActionUrl(action.url, recipe); const url = await parseRecipeActionUrl(action.url, recipe);
switch (action.actionType) { switch (action.actionType) {
case "link": case "link":
window.open(url, "_blank")?.focus(); window.open(url, "_blank")?.focus();
return; return;
case "post": case "post":