From 19e776a772d07d4aa96386c1ab2c4467070672d0 Mon Sep 17 00:00:00 2001 From: Kuchenpirat <24235032+Kuchenpirat@users.noreply.github.com> Date: Wed, 31 Jan 2024 10:33:05 +0000 Subject: [PATCH 01/47] manage-data pages --- frontend/middleware/admin-only.ts | 4 ++-- frontend/middleware/can-organize-only.ts | 12 ++++++++++++ frontend/pages/group/data/categories.vue | 1 + frontend/pages/group/data/foods.vue | 2 +- frontend/pages/group/data/labels.vue | 1 + frontend/pages/group/data/recipes.vue | 1 + frontend/pages/group/data/tags.vue | 1 + frontend/pages/group/data/tools.vue | 1 + frontend/pages/group/data/units.vue | 1 + frontend/pages/user/profile/index.vue | 22 +++++++++++----------- 10 files changed, 32 insertions(+), 14 deletions(-) create mode 100644 frontend/middleware/can-organize-only.ts diff --git a/frontend/middleware/admin-only.ts b/frontend/middleware/admin-only.ts index 66a4e00f3566..b55f603d5151 100644 --- a/frontend/middleware/admin-only.ts +++ b/frontend/middleware/admin-only.ts @@ -1,8 +1,8 @@ -interface AuthRedirectParams { +interface AdminRedirectParams { $auth: any redirect: (path: string) => void } -export default function ({ $auth, redirect }: AuthRedirectParams) { +export default function ({ $auth, redirect }: AdminRedirectParams) { // If the user is not an admin redirect to the home page if (!$auth.user.admin) { return redirect("/") diff --git a/frontend/middleware/can-organize-only.ts b/frontend/middleware/can-organize-only.ts new file mode 100644 index 000000000000..9bb6b6603d75 --- /dev/null +++ b/frontend/middleware/can-organize-only.ts @@ -0,0 +1,12 @@ +interface CanOrganizeRedirectParams { + $auth: any + redirect: (path: string) => void +} +export default function ({ $auth, redirect }: CanOrganizeRedirectParams) { + console.log($auth.user); + // If the user is not allowed to organize redirect to the home page + if (!$auth.user.canOrganize) { + console.warn("User is not allowed to organize data"); + return redirect("/") + } +} diff --git a/frontend/pages/group/data/categories.vue b/frontend/pages/group/data/categories.vue index 290e4f79e083..038c716c0e43 100644 --- a/frontend/pages/group/data/categories.vue +++ b/frontend/pages/group/data/categories.vue @@ -73,6 +73,7 @@ import { useCategoryStore, useCategoryData } from "~/composables/store"; import { RecipeCategory } from "~/lib/api/types/admin"; export default defineComponent({ + middleware: ["auth", "can-organize-only"], setup() { const { i18n } = useContext(); const tableConfig = { diff --git a/frontend/pages/group/data/foods.vue b/frontend/pages/group/data/foods.vue index 32eda4322b7d..aca6f2074fb5 100644 --- a/frontend/pages/group/data/foods.vue +++ b/frontend/pages/group/data/foods.vue @@ -201,8 +201,8 @@ import { useFoodStore, useLabelStore } from "~/composables/store"; import { VForm } from "~/types/vuetify"; export default defineComponent({ - components: { MultiPurposeLabel, RecipeDataAliasManagerDialog }, + middleware: ["auth", "can-organize-only"], setup() { const userApi = useUserApi(); const { i18n } = useContext(); diff --git a/frontend/pages/group/data/labels.vue b/frontend/pages/group/data/labels.vue index 604135b05873..7d1e45ea85d0 100644 --- a/frontend/pages/group/data/labels.vue +++ b/frontend/pages/group/data/labels.vue @@ -122,6 +122,7 @@ import { useLabelData, useLabelStore } from "~/composables/store"; export default defineComponent({ components: { MultiPurposeLabel }, + middleware: ["auth", "can-organize-only"], setup() { const userApi = useUserApi(); const { i18n } = useContext(); diff --git a/frontend/pages/group/data/recipes.vue b/frontend/pages/group/data/recipes.vue index 0803f285badc..2cd55aad4ea9 100644 --- a/frontend/pages/group/data/recipes.vue +++ b/frontend/pages/group/data/recipes.vue @@ -176,6 +176,7 @@ enum MODES { export default defineComponent({ components: { RecipeDataTable, RecipeOrganizerSelector, GroupExportData, RecipeSettingsSwitches }, + middleware: ["auth", "can-organize-only"], scrollToTop: true, setup() { const { getAllRecipes, refreshRecipes } = useRecipes(true, true); diff --git a/frontend/pages/group/data/tags.vue b/frontend/pages/group/data/tags.vue index 076a23f08b4d..b2440b4e5c0c 100644 --- a/frontend/pages/group/data/tags.vue +++ b/frontend/pages/group/data/tags.vue @@ -73,6 +73,7 @@ import { useTagStore, useTagData } from "~/composables/store"; import { RecipeTag } from "~/lib/api/types/admin"; export default defineComponent({ + middleware: ["auth", "can-organize-only"], setup() { const { i18n } = useContext(); const tableConfig = { diff --git a/frontend/pages/group/data/tools.vue b/frontend/pages/group/data/tools.vue index 4ff3c547819b..49825faf2da1 100644 --- a/frontend/pages/group/data/tools.vue +++ b/frontend/pages/group/data/tools.vue @@ -80,6 +80,7 @@ import { useToolStore, useToolData } from "~/composables/store"; import { RecipeTool } from "~/lib/api/types/admin"; export default defineComponent({ + middleware: ["auth", "can-organize-only"], setup() { const { i18n } = useContext(); const tableConfig = { diff --git a/frontend/pages/group/data/units.vue b/frontend/pages/group/data/units.vue index 9ce5fa991110..f1d42ba464f1 100644 --- a/frontend/pages/group/data/units.vue +++ b/frontend/pages/group/data/units.vue @@ -218,6 +218,7 @@ import { VForm } from "~/types/vuetify"; export default defineComponent({ components: { RecipeDataAliasManagerDialog }, + middleware: ["auth", "can-organize-only"], setup() { const userApi = useUserApi(); const { i18n } = useContext(); diff --git a/frontend/pages/user/profile/index.vue b/frontend/pages/user/profile/index.vue index ddb011550d1a..54a1e1b48708 100644 --- a/frontend/pages/user/profile/index.vue +++ b/frontend/pages/user/profile/index.vue @@ -162,17 +162,16 @@ - - - - - {{ $t('profile.manage-data-description') }} - - - + + + + + {{ $t('profile.manage-data-description') }} + + Date: Wed, 31 Jan 2024 11:56:15 +0000 Subject: [PATCH 02/47] add avanced-only --- frontend/middleware/advanced-only.ts | 11 +++++++++++ frontend/middleware/can-organize-only.ts | 1 - 2 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 frontend/middleware/advanced-only.ts diff --git a/frontend/middleware/advanced-only.ts b/frontend/middleware/advanced-only.ts new file mode 100644 index 000000000000..e9d69a2fd852 --- /dev/null +++ b/frontend/middleware/advanced-only.ts @@ -0,0 +1,11 @@ +interface AdvancedOnlyRedirectParams { + $auth: any + redirect: (path: string) => void +} +export default function ({ $auth, redirect }: AdvancedOnlyRedirectParams) { + // If the user is not allowed to organize redirect to the home page + if (!$auth.user.advanced) { + console.warn("User is not allowed to access advanced features"); + return redirect("/") + } +} diff --git a/frontend/middleware/can-organize-only.ts b/frontend/middleware/can-organize-only.ts index 9bb6b6603d75..93d6c5c5aabf 100644 --- a/frontend/middleware/can-organize-only.ts +++ b/frontend/middleware/can-organize-only.ts @@ -3,7 +3,6 @@ interface CanOrganizeRedirectParams { redirect: (path: string) => void } export default function ({ $auth, redirect }: CanOrganizeRedirectParams) { - console.log($auth.user); // If the user is not allowed to organize redirect to the home page if (!$auth.user.canOrganize) { console.warn("User is not allowed to organize data"); From 7dafa6c7fe2e0d446de4de77b7924b74352ee817 Mon Sep 17 00:00:00 2001 From: Kuchenpirat <24235032+Kuchenpirat@users.noreply.github.com> Date: Wed, 31 Jan 2024 15:25:21 +0000 Subject: [PATCH 03/47] add access controll to user pages --- frontend/pages/user/_id/favorites.vue | 1 + frontend/pages/user/profile/api-tokens.vue | 1 + frontend/pages/user/profile/edit.vue | 1 + frontend/pages/user/profile/index.vue | 2 +- 4 files changed, 4 insertions(+), 1 deletion(-) diff --git a/frontend/pages/user/_id/favorites.vue b/frontend/pages/user/_id/favorites.vue index ec4e5c8fd984..603428d428e7 100644 --- a/frontend/pages/user/_id/favorites.vue +++ b/frontend/pages/user/_id/favorites.vue @@ -14,6 +14,7 @@ import { useAsyncKey } from "~/composables/use-utils"; export default defineComponent({ components: { RecipeCardSection }, + middleware: "auth", setup() { const api = useUserApi(); const route = useRoute(); diff --git a/frontend/pages/user/profile/api-tokens.vue b/frontend/pages/user/profile/api-tokens.vue index 8e41c6216986..8b6d21b361b9 100644 --- a/frontend/pages/user/profile/api-tokens.vue +++ b/frontend/pages/user/profile/api-tokens.vue @@ -69,6 +69,7 @@ import { useUserApi } from "~/composables/api"; import { VForm } from "~/types/vuetify"; export default defineComponent({ + middleware: ["auth", "advanced-only"], setup() { const nuxtContext = useContext(); diff --git a/frontend/pages/user/profile/edit.vue b/frontend/pages/user/profile/edit.vue index 3eadc87ed1c9..2681e9c5df68 100644 --- a/frontend/pages/user/profile/edit.vue +++ b/frontend/pages/user/profile/edit.vue @@ -135,6 +135,7 @@ export default defineComponent({ UserAvatar, UserPasswordStrength, }, + middleware: "auth", setup() { const { $auth } = useContext(); const user = computed(() => $auth.user as unknown as UserOut); diff --git a/frontend/pages/user/profile/index.vue b/frontend/pages/user/profile/index.vue index 54a1e1b48708..37041726747e 100644 --- a/frontend/pages/user/profile/index.vue +++ b/frontend/pages/user/profile/index.vue @@ -207,7 +207,7 @@ export default defineComponent({ UserAvatar, StatsCards, }, - middleware: ["auth"], + middleware: "auth", scrollToTop: true, setup() { const { $auth, i18n } = useContext(); From 890b5d93a70b3072f0f26e177f06346b4816f0d6 Mon Sep 17 00:00:00 2001 From: Kuchenpirat <24235032+Kuchenpirat@users.noreply.github.com> Date: Thu, 1 Feb 2024 07:50:09 +0000 Subject: [PATCH 04/47] access controll coobook index page --- frontend/pages/g/_groupSlug/cookbooks/index.vue | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/frontend/pages/g/_groupSlug/cookbooks/index.vue b/frontend/pages/g/_groupSlug/cookbooks/index.vue index db99713c3bcb..35ad12fa8111 100644 --- a/frontend/pages/g/_groupSlug/cookbooks/index.vue +++ b/frontend/pages/g/_groupSlug/cookbooks/index.vue @@ -90,24 +90,17 @@ diff --git a/frontend/pages/shopping-lists/_id.vue b/frontend/pages/shopping-lists/_id.vue index 9dabc3ae1e42..c5bdd2cc8249 100644 --- a/frontend/pages/shopping-lists/_id.vue +++ b/frontend/pages/shopping-lists/_id.vue @@ -665,6 +665,11 @@ export default defineComponent({ return; } + if (!createListItemData.value.foodId && !createListItemData.value.note) { + // don't create an empty item + return; + } + loadingCounter.value += 1; // make sure it's inserted into the end of the list, which may have been updated @@ -676,7 +681,6 @@ export default defineComponent({ if (data) { createListItemData.value = listItemFactory(createListItemData.value.isFood || false); - createEditorOpen.value = false; refresh(); } } From 2c1185e1d40e29664b154bc9b99b072954c35e0b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 19 Feb 2024 15:37:07 -0600 Subject: [PATCH 47/47] fix(deps): update dependency pydantic-settings to v2.2.1 (#3197) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- poetry.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/poetry.lock b/poetry.lock index 33514ebe8e80..034d05ce6eb9 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1813,13 +1813,13 @@ typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" [[package]] name = "pydantic-settings" -version = "2.2.0" +version = "2.2.1" description = "Settings management using Pydantic" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic_settings-2.2.0-py3-none-any.whl", hash = "sha256:5f7bcaf9ad4419559dc5ac155c0324a9aeb2547c60471ee7c7d026f467a6b515"}, - {file = "pydantic_settings-2.2.0.tar.gz", hash = "sha256:648d0a76673e69c51278979cba2e83cf16a23d57519bfd7e553d1c3f37db5560"}, + {file = "pydantic_settings-2.2.1-py3-none-any.whl", hash = "sha256:0235391d26db4d2190cb9b31051c4b46882d28a51533f97440867f012d4da091"}, + {file = "pydantic_settings-2.2.1.tar.gz", hash = "sha256:00b9f6a5e95553590434c0fa01ead0b216c3e10bc54ae02e37f359948643c5ed"}, ] [package.dependencies] @@ -1827,7 +1827,7 @@ pydantic = ">=2.3.0" python-dotenv = ">=0.21.0" [package.extras] -toml = ["tomlkit (>=0.12)"] +toml = ["tomli (>=2.0.1)"] yaml = ["pyyaml (>=6.0.1)"] [[package]]