From b6ccb9fbdbf0acb87aedf8b191cd839a79080679 Mon Sep 17 00:00:00 2001 From: Michael Genson <71845777+michael-genson@users.noreply.github.com> Date: Fri, 15 Mar 2024 19:41:26 +0000 Subject: [PATCH 1/4] add shared group self to composable --- frontend/composables/use-groups.ts | 31 +++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/frontend/composables/use-groups.ts b/frontend/composables/use-groups.ts index 8b2e8b682af8..f9b91283469b 100644 --- a/frontend/composables/use-groups.ts +++ b/frontend/composables/use-groups.ts @@ -1,30 +1,39 @@ import { useAsync, ref } from "@nuxtjs/composition-api"; -import { useAsyncKey } from "./use-utils"; import { useUserApi } from "~/composables/api"; -import { GroupBase } from "~/lib/api/types/user"; +import { GroupBase, GroupInDB } from "~/lib/api/types/user"; + +const groupSelfRef = ref(null); +const loading = ref(false); export const useGroupSelf = function () { const api = useUserApi(); + async function refreshGroupSelf() { + loading.value = true; + const { data } = await api.groups.getCurrentUserGroup(); + groupSelfRef.value = data; + loading.value = false; + } const actions = { get() { - const group = useAsync(async () => { - const { data } = await api.groups.getCurrentUserGroup(); + if (!(groupSelfRef.value || loading.value)) { + refreshGroupSelf(); + } - return data; - }, useAsyncKey()); - - return group; + return groupSelfRef; }, async updatePreferences() { - if (!group.value?.preferences) { + if (!groupSelfRef.value) { + await refreshGroupSelf(); + } + if (!groupSelfRef.value?.preferences) { return; } - const { data } = await api.groups.setPreferences(group.value.preferences); + const { data } = await api.groups.setPreferences(groupSelfRef.value.preferences); if (data) { - group.value.preferences = data; + groupSelfRef.value.preferences = data; } }, }; From 52c6fe34b24d599ea3174535192e085f91d40e43 Mon Sep 17 00:00:00 2001 From: Michael Genson <71845777+michael-genson@users.noreply.github.com> Date: Fri, 15 Mar 2024 19:50:39 +0000 Subject: [PATCH 2/4] remove potentially sensitive fields from group self --- frontend/composables/use-groups.ts | 4 ++-- frontend/lib/api/types/user.ts | 7 +++++++ frontend/lib/api/user/groups.ts | 4 ++-- .../groups/controller_group_self_service.py | 6 +++--- mealie/schema/user/user.py | 15 +++++++++++++++ 5 files changed, 29 insertions(+), 7 deletions(-) diff --git a/frontend/composables/use-groups.ts b/frontend/composables/use-groups.ts index f9b91283469b..01c164f4a577 100644 --- a/frontend/composables/use-groups.ts +++ b/frontend/composables/use-groups.ts @@ -1,8 +1,8 @@ import { useAsync, ref } from "@nuxtjs/composition-api"; import { useUserApi } from "~/composables/api"; -import { GroupBase, GroupInDB } from "~/lib/api/types/user"; +import { GroupBase, GroupSummary } from "~/lib/api/types/user"; -const groupSelfRef = ref(null); +const groupSelfRef = ref(null); const loading = ref(false); export const useGroupSelf = function () { diff --git a/frontend/lib/api/types/user.ts b/frontend/lib/api/types/user.ts index 681dc5291afa..35ae18f132b6 100644 --- a/frontend/lib/api/types/user.ts +++ b/frontend/lib/api/types/user.ts @@ -48,6 +48,13 @@ export interface GroupInDB { users?: UserOut[]; preferences?: ReadGroupPreferences; } +export interface GroupSummary { + name: string; + id: string; + slug: string; + preferences?: ReadGroupPreferences; + +} export interface CategoryBase { name: string; id: string; diff --git a/frontend/lib/api/user/groups.ts b/frontend/lib/api/user/groups.ts index 090f4fabc590..19f5cff9152b 100644 --- a/frontend/lib/api/user/groups.ts +++ b/frontend/lib/api/user/groups.ts @@ -1,5 +1,5 @@ import { BaseCRUDAPI } from "../base/base-clients"; -import { CategoryBase, GroupBase, GroupInDB, UserOut } from "~/lib/api/types/user"; +import { CategoryBase, GroupBase, GroupInDB, GroupSummary, UserOut } from "~/lib/api/types/user"; import { CreateInviteToken, GroupAdminUpdate, @@ -35,7 +35,7 @@ export class GroupAPI extends BaseCRUDAPI(routes.groupsSelf); + return await this.requests.get(routes.groupsSelf); } async getCategories() { diff --git a/mealie/routes/groups/controller_group_self_service.py b/mealie/routes/groups/controller_group_self_service.py index 92fc53a13a60..3fa018bdfb8f 100644 --- a/mealie/routes/groups/controller_group_self_service.py +++ b/mealie/routes/groups/controller_group_self_service.py @@ -8,7 +8,7 @@ from mealie.routes._base.routers import UserAPIRouter from mealie.schema.group.group_permissions import SetPermissions from mealie.schema.group.group_preferences import ReadGroupPreferences, UpdateGroupPreferences from mealie.schema.group.group_statistics import GroupStatistics, GroupStorage -from mealie.schema.user.user import GroupInDB, UserOut +from mealie.schema.user.user import GroupInDB, GroupSummary, UserOut from mealie.services.group_services.group_service import GroupService router = UserAPIRouter(prefix="/groups", tags=["Groups: Self Service"]) @@ -20,10 +20,10 @@ class GroupSelfServiceController(BaseUserController): def service(self) -> GroupService: return GroupService(self.group_id, self.repos) - @router.get("/self", response_model=GroupInDB) + @router.get("/self", response_model=GroupSummary) def get_logged_in_user_group(self): """Returns the Group Data for the Current User""" - return self.group + return self.group.cast(GroupSummary) @router.get("/members", response_model=list[UserOut]) def get_group_members(self): diff --git a/mealie/schema/user/user.py b/mealie/schema/user/user.py index 864ff6bd5ed7..dceb32acc18c 100644 --- a/mealie/schema/user/user.py +++ b/mealie/schema/user/user.py @@ -249,6 +249,21 @@ class GroupInDB(UpdateGroup): ] +class GroupSummary(MealieModel): + id: UUID4 + name: str + slug: str + preferences: ReadGroupPreferences | None = None + + model_config = ConfigDict(from_attributes=True) + + @classmethod + def loader_options(cls) -> list[LoaderOption]: + return [ + joinedload(Group.preferences), + ] + + class GroupPagination(PaginationBase): items: list[GroupInDB] From ad0ea09be986d9a26a20e1fc0d2dd8797f34f18e Mon Sep 17 00:00:00 2001 From: Michael Genson <71845777+michael-genson@users.noreply.github.com> Date: Fri, 15 Mar 2024 19:57:57 +0000 Subject: [PATCH 3/4] better model inheritance --- mealie/schema/user/user.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/mealie/schema/user/user.py b/mealie/schema/user/user.py index dceb32acc18c..a478866a5239 100644 --- a/mealie/schema/user/user.py +++ b/mealie/schema/user/user.py @@ -249,14 +249,12 @@ class GroupInDB(UpdateGroup): ] -class GroupSummary(MealieModel): +class GroupSummary(GroupBase): id: UUID4 name: str slug: str preferences: ReadGroupPreferences | None = None - model_config = ConfigDict(from_attributes=True) - @classmethod def loader_options(cls) -> list[LoaderOption]: return [ From 6da50b576f4d76ce722b78297e56ec1604748e57 Mon Sep 17 00:00:00 2001 From: Michael Genson <71845777+michael-genson@users.noreply.github.com> Date: Fri, 15 Mar 2024 20:21:43 +0000 Subject: [PATCH 4/4] remove unused import --- mealie/routes/groups/controller_group_self_service.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mealie/routes/groups/controller_group_self_service.py b/mealie/routes/groups/controller_group_self_service.py index 3fa018bdfb8f..ac63a5d02fc8 100644 --- a/mealie/routes/groups/controller_group_self_service.py +++ b/mealie/routes/groups/controller_group_self_service.py @@ -8,7 +8,7 @@ from mealie.routes._base.routers import UserAPIRouter from mealie.schema.group.group_permissions import SetPermissions from mealie.schema.group.group_preferences import ReadGroupPreferences, UpdateGroupPreferences from mealie.schema.group.group_statistics import GroupStatistics, GroupStorage -from mealie.schema.user.user import GroupInDB, GroupSummary, UserOut +from mealie.schema.user.user import GroupSummary, UserOut from mealie.services.group_services.group_service import GroupService router = UserAPIRouter(prefix="/groups", tags=["Groups: Self Service"])