From 1c23d855ae5d848cd394b36f80d019bfbf0b3a8e Mon Sep 17 00:00:00 2001
From: Michael Genson <71845777+michael-genson@users.noreply.github.com>
Date: Fri, 15 Aug 2025 03:44:45 -0500
Subject: [PATCH] fix: Remove Recipes From Cookbook API (#5899)
---
Taskfile.yml | 1 +
dev/code-generation/gen_ts_types.py | 4 +-
docs/docs/overrides/api.html | 2 +-
.../Domain/Cookbook/CookbookPage.vue | 4 +-
.../composables/store/use-cookbook-store.ts | 8 +-
frontend/lib/api/public/explore/cookbooks.ts | 4 +-
frontend/lib/api/types/admin.ts | 1 +
frontend/lib/api/types/analytics.ts | 1 +
frontend/lib/api/types/cookbook.ts | 62 +------------
frontend/lib/api/types/group.ts | 1 +
frontend/lib/api/types/household.ts | 1 +
frontend/lib/api/types/labels.ts | 1 +
frontend/lib/api/types/meal-plan.ts | 1 +
frontend/lib/api/types/reports.ts | 1 +
frontend/lib/api/types/response.ts | 1 +
frontend/lib/api/types/user.ts | 1 +
frontend/lib/api/user/group-cookbooks.ts | 4 +-
frontend/types/components.d.ts | 2 +-
.../explore/controller_public_cookbooks.py | 17 +---
.../routes/households/controller_cookbooks.py | 8 +-
mealie/schema/_mealie/__init__.py | 6 +-
mealie/schema/admin/__init__.py | 36 ++++----
mealie/schema/cookbook/__init__.py | 3 +-
mealie/schema/cookbook/cookbook.py | 8 --
mealie/schema/group/__init__.py | 6 +-
mealie/schema/household/__init__.py | 86 ++++++++---------
mealie/schema/meal_plan/__init__.py | 6 +-
mealie/schema/recipe/__init__.py | 92 +++++++++----------
mealie/schema/response/__init__.py | 4 +-
mealie/schema/user/__init__.py | 12 +--
.../test_public_cookbooks.py | 22 +++--
31 files changed, 169 insertions(+), 237 deletions(-)
diff --git a/Taskfile.yml b/Taskfile.yml
index c54c075db..5352a3ca3 100644
--- a/Taskfile.yml
+++ b/Taskfile.yml
@@ -71,6 +71,7 @@ tasks:
desc: run code generators
cmds:
- poetry run python dev/code-generation/main.py {{ .CLI_ARGS }}
+ - task: docs:gen
- task: py:format
dev:services:
diff --git a/dev/code-generation/gen_ts_types.py b/dev/code-generation/gen_ts_types.py
index 408262f25..8a8932299 100644
--- a/dev/code-generation/gen_ts_types.py
+++ b/dev/code-generation/gen_ts_types.py
@@ -8,8 +8,8 @@ from utils import log
# ============================================================
template = """// This Code is auto generated by gen_ts_types.py
-{% for name in global %}import {{ name }} from "@/components/global/{{ name }}.vue";
-{% endfor %}{% for name in layout %}import {{ name }} from "@/components/layout/{{ name }}.vue";
+{% for name in global %}import type {{ name }} from "@/components/global/{{ name }}.vue";
+{% endfor %}{% for name in layout %}import type {{ name }} from "@/components/layout/{{ name }}.vue";
{% endfor %}
declare module "vue" {
export interface GlobalComponents {
diff --git a/docs/docs/overrides/api.html b/docs/docs/overrides/api.html
index 64a6e5cf4..0dc543851 100644
--- a/docs/docs/overrides/api.html
+++ b/docs/docs/overrides/api.html
@@ -14,7 +14,7 @@
diff --git a/frontend/components/Domain/Cookbook/CookbookPage.vue b/frontend/components/Domain/Cookbook/CookbookPage.vue
index a8cff6753..2267276cc 100644
--- a/frontend/components/Domain/Cookbook/CookbookPage.vue
+++ b/frontend/components/Domain/Cookbook/CookbookPage.vue
@@ -70,7 +70,7 @@ import RecipeCardSection from "@/components/Domain/Recipe/RecipeCardSection.vue"
import { useCookbookStore } from "~/composables/store/use-cookbook-store";
import { useCookbook } from "~/composables/use-group-cookbooks";
import { useLoggedInState } from "~/composables/use-logged-in-state";
-import type { RecipeCookBook } from "~/lib/api/types/cookbook";
+import type { ReadCookBook } from "~/lib/api/types/cookbook";
import CookbookEditor from "~/components/Domain/Cookbook/CookbookEditor.vue";
const $auth = useMealieAuth();
@@ -100,7 +100,7 @@ const dialogStates = reactive({
edit: false,
});
-const editTarget = ref(null);
+const editTarget = ref(null);
function handleEditCookbook() {
dialogStates.edit = true;
editTarget.value = book.value;
diff --git a/frontend/composables/store/use-cookbook-store.ts b/frontend/composables/store/use-cookbook-store.ts
index e3d4a5a81..131187e9e 100644
--- a/frontend/composables/store/use-cookbook-store.ts
+++ b/frontend/composables/store/use-cookbook-store.ts
@@ -1,18 +1,18 @@
import type { Composer } from "vue-i18n";
import { useReadOnlyStore, useStore } from "../partials/use-store-factory";
-import type { RecipeCookBook } from "~/lib/api/types/cookbook";
+import type { ReadCookBook } from "~/lib/api/types/cookbook";
import { usePublicExploreApi, useUserApi } from "~/composables/api";
-const store: Ref = ref([]);
+const store: Ref = ref([]);
const loading = ref(false);
const publicLoading = ref(false);
export const useCookbookStore = function (i18n?: Composer) {
const api = useUserApi(i18n);
- return useStore(store, loading, api.cookbooks);
+ return useStore(store, loading, api.cookbooks);
};
export const usePublicCookbookStore = function (groupSlug: string, i18n?: Composer) {
const api = usePublicExploreApi(groupSlug, i18n).explore;
- return useReadOnlyStore(store, publicLoading, api.cookbooks);
+ return useReadOnlyStore(store, publicLoading, api.cookbooks);
};
diff --git a/frontend/lib/api/public/explore/cookbooks.ts b/frontend/lib/api/public/explore/cookbooks.ts
index ee7e6230c..3afeb40d4 100644
--- a/frontend/lib/api/public/explore/cookbooks.ts
+++ b/frontend/lib/api/public/explore/cookbooks.ts
@@ -1,5 +1,5 @@
import { BaseCRUDAPIReadOnly } from "~/lib/api/base/base-clients";
-import { RecipeCookBook } from "~/lib/api/types/cookbook";
+import { ReadCookBook } from "~/lib/api/types/cookbook";
import { ApiRequestInstance } from "~/lib/api/types/non-generated";
const prefix = "/api";
@@ -10,7 +10,7 @@ const routes = {
cookbooksGroupSlugCookbookId: (groupSlug: string | number, cookbookId: string | number) => `${exploreGroupSlug(groupSlug)}/cookbooks/${cookbookId}`,
};
-export class PublicCookbooksApi extends BaseCRUDAPIReadOnly {
+export class PublicCookbooksApi extends BaseCRUDAPIReadOnly {
constructor(requests: ApiRequestInstance, groupSlug: string) {
super(
requests,
diff --git a/frontend/lib/api/types/admin.ts b/frontend/lib/api/types/admin.ts
index 6f2022f6e..868cb74e6 100644
--- a/frontend/lib/api/types/admin.ts
+++ b/frontend/lib/api/types/admin.ts
@@ -1,4 +1,5 @@
/* tslint:disable */
+/* eslint-disable */
/**
/* This file was automatically generated from pydantic models by running pydantic2ts.
/* Do not modify it by hand - just update the pydantic models and then re-run the script
diff --git a/frontend/lib/api/types/analytics.ts b/frontend/lib/api/types/analytics.ts
index 5bdc7fbcd..f0eb9d489 100644
--- a/frontend/lib/api/types/analytics.ts
+++ b/frontend/lib/api/types/analytics.ts
@@ -1,4 +1,5 @@
/* tslint:disable */
+/* eslint-disable */
/**
/* This file was automatically generated from pydantic models by running pydantic2ts.
/* Do not modify it by hand - just update the pydantic models and then re-run the script
diff --git a/frontend/lib/api/types/cookbook.ts b/frontend/lib/api/types/cookbook.ts
index a35e5cd5f..753b11c6a 100644
--- a/frontend/lib/api/types/cookbook.ts
+++ b/frontend/lib/api/types/cookbook.ts
@@ -1,4 +1,5 @@
/* tslint:disable */
+/* eslint-disable */
/**
/* This file was automatically generated from pydantic models by running pydantic2ts.
/* Do not modify it by hand - just update the pydantic models and then re-run the script
@@ -38,67 +39,6 @@ export interface QueryFilterJSONPart {
attributeName?: string | null;
relationalOperator?: RelationalKeyword | RelationalOperator | null;
value?: string | string[] | null;
-}
-export interface RecipeCookBook {
- name: string;
- description?: string;
- slug?: string | null;
- position?: number;
- public?: boolean;
- queryFilterString?: string;
- groupId: string;
- householdId: string;
- id: string;
- queryFilter?: QueryFilterJSON;
- recipes: RecipeSummary[];
-}
-export interface RecipeSummary {
- id?: string | null;
- userId?: string;
- householdId?: string;
- groupId?: string;
- name?: string | null;
- slug?: string;
- image?: unknown;
- recipeServings?: number;
- recipeYieldQuantity?: number;
- recipeYield?: string | null;
- totalTime?: string | null;
- prepTime?: string | null;
- cookTime?: string | null;
- performTime?: string | null;
- description?: string | null;
- recipeCategory?: RecipeCategory[] | null;
- tags?: RecipeTag[] | null;
- tools?: RecipeTool[];
- rating?: number | null;
- orgURL?: string | null;
- dateAdded?: string | null;
- dateUpdated?: string | null;
- createdAt?: string | null;
- updatedAt?: string | null;
- lastMade?: string | null;
-}
-export interface RecipeCategory {
- id?: string | null;
- groupId?: string | null;
- name: string;
- slug: string;
- [k: string]: unknown;
-}
-export interface RecipeTag {
- id?: string | null;
- groupId?: string | null;
- name: string;
- slug: string;
- [k: string]: unknown;
-}
-export interface RecipeTool {
- id: string;
- groupId?: string | null;
- name: string;
- slug: string;
- householdsWithTool?: string[];
[k: string]: unknown;
}
export interface SaveCookBook {
diff --git a/frontend/lib/api/types/group.ts b/frontend/lib/api/types/group.ts
index 8ebf2c96c..bc2fbcf62 100644
--- a/frontend/lib/api/types/group.ts
+++ b/frontend/lib/api/types/group.ts
@@ -1,4 +1,5 @@
/* tslint:disable */
+/* eslint-disable */
/**
/* This file was automatically generated from pydantic models by running pydantic2ts.
/* Do not modify it by hand - just update the pydantic models and then re-run the script
diff --git a/frontend/lib/api/types/household.ts b/frontend/lib/api/types/household.ts
index f3400dea4..cfe4ff3f9 100644
--- a/frontend/lib/api/types/household.ts
+++ b/frontend/lib/api/types/household.ts
@@ -1,4 +1,5 @@
/* tslint:disable */
+/* eslint-disable */
/**
/* This file was automatically generated from pydantic models by running pydantic2ts.
/* Do not modify it by hand - just update the pydantic models and then re-run the script
diff --git a/frontend/lib/api/types/labels.ts b/frontend/lib/api/types/labels.ts
index ee9335bb2..a8fc4c046 100644
--- a/frontend/lib/api/types/labels.ts
+++ b/frontend/lib/api/types/labels.ts
@@ -1,4 +1,5 @@
/* tslint:disable */
+/* eslint-disable */
/**
/* This file was automatically generated from pydantic models by running pydantic2ts.
/* Do not modify it by hand - just update the pydantic models and then re-run the script
diff --git a/frontend/lib/api/types/meal-plan.ts b/frontend/lib/api/types/meal-plan.ts
index 85f03de97..b6d1c08e4 100644
--- a/frontend/lib/api/types/meal-plan.ts
+++ b/frontend/lib/api/types/meal-plan.ts
@@ -1,4 +1,5 @@
/* tslint:disable */
+/* eslint-disable */
/**
/* This file was automatically generated from pydantic models by running pydantic2ts.
/* Do not modify it by hand - just update the pydantic models and then re-run the script
diff --git a/frontend/lib/api/types/reports.ts b/frontend/lib/api/types/reports.ts
index 428c39f40..2b763275e 100644
--- a/frontend/lib/api/types/reports.ts
+++ b/frontend/lib/api/types/reports.ts
@@ -1,4 +1,5 @@
/* tslint:disable */
+/* eslint-disable */
/**
/* This file was automatically generated from pydantic models by running pydantic2ts.
/* Do not modify it by hand - just update the pydantic models and then re-run the script
diff --git a/frontend/lib/api/types/response.ts b/frontend/lib/api/types/response.ts
index 9fa568846..dfa8a54f4 100644
--- a/frontend/lib/api/types/response.ts
+++ b/frontend/lib/api/types/response.ts
@@ -1,4 +1,5 @@
/* tslint:disable */
+/* eslint-disable */
/**
/* This file was automatically generated from pydantic models by running pydantic2ts.
/* Do not modify it by hand - just update the pydantic models and then re-run the script
diff --git a/frontend/lib/api/types/user.ts b/frontend/lib/api/types/user.ts
index a5818778b..029e166b6 100644
--- a/frontend/lib/api/types/user.ts
+++ b/frontend/lib/api/types/user.ts
@@ -1,4 +1,5 @@
/* tslint:disable */
+/* eslint-disable */
/**
/* This file was automatically generated from pydantic models by running pydantic2ts.
/* Do not modify it by hand - just update the pydantic models and then re-run the script
diff --git a/frontend/lib/api/user/group-cookbooks.ts b/frontend/lib/api/user/group-cookbooks.ts
index 9d5631558..640a6ef5e 100644
--- a/frontend/lib/api/user/group-cookbooks.ts
+++ b/frontend/lib/api/user/group-cookbooks.ts
@@ -1,5 +1,5 @@
import { BaseCRUDAPI } from "../base/base-clients";
-import type { CreateCookBook, RecipeCookBook, UpdateCookBook } from "~/lib/api/types/cookbook";
+import type { CreateCookBook, ReadCookBook, UpdateCookBook } from "~/lib/api/types/cookbook";
const prefix = "/api";
@@ -8,7 +8,7 @@ const routes = {
cookbooksId: (id: number) => `${prefix}/households/cookbooks/${id}`,
};
-export class CookbookAPI extends BaseCRUDAPI {
+export class CookbookAPI extends BaseCRUDAPI {
baseRoute: string = routes.cookbooks;
itemRoute = routes.cookbooksId;
diff --git a/frontend/types/components.d.ts b/frontend/types/components.d.ts
index 9d0364a59..d074283ee 100644
--- a/frontend/types/components.d.ts
+++ b/frontend/types/components.d.ts
@@ -81,4 +81,4 @@ declare module "vue" {
}
}
-export { };
+export {};
diff --git a/mealie/routes/explore/controller_public_cookbooks.py b/mealie/routes/explore/controller_public_cookbooks.py
index 902b27e12..836f7d953 100644
--- a/mealie/routes/explore/controller_public_cookbooks.py
+++ b/mealie/routes/explore/controller_public_cookbooks.py
@@ -5,7 +5,7 @@ from pydantic import UUID4
from mealie.routes._base import controller
from mealie.routes._base.base_controllers import BasePublicHouseholdExploreController
-from mealie.schema.cookbook.cookbook import ReadCookBook, RecipeCookBook
+from mealie.schema.cookbook.cookbook import ReadCookBook
from mealie.schema.make_dependable import make_dependable
from mealie.schema.response.pagination import PaginationBase, PaginationQuery
@@ -39,8 +39,8 @@ class PublicCookbooksController(BasePublicHouseholdExploreController):
response.set_pagination_guides(self.get_explore_url_path(router.url_path_for("get_all")), q.model_dump())
return response
- @router.get("/{item_id}", response_model=RecipeCookBook)
- def get_one(self, item_id: UUID4 | str) -> RecipeCookBook:
+ @router.get("/{item_id}", response_model=ReadCookBook)
+ def get_one(self, item_id: UUID4 | str) -> ReadCookBook:
NOT_FOUND_EXCEPTION = HTTPException(404, "cookbook not found")
if isinstance(item_id, UUID):
match_attr = "id"
@@ -58,13 +58,4 @@ class PublicCookbooksController(BasePublicHouseholdExploreController):
if not household or household.preferences.private_household:
raise NOT_FOUND_EXCEPTION
- cross_household_recipes = self.cross_household_repos.recipes
- recipes = cross_household_recipes.page_all(
- PaginationQuery(
- page=1,
- per_page=-1,
- query_filter="settings.public = TRUE AND household.preferences.privateHousehold = FALSE",
- ),
- cookbook=cookbook,
- )
- return cookbook.cast(RecipeCookBook, recipes=recipes.items)
+ return cookbook
diff --git a/mealie/routes/households/controller_cookbooks.py b/mealie/routes/households/controller_cookbooks.py
index 99f4c97df..2ed385c64 100644
--- a/mealie/routes/households/controller_cookbooks.py
+++ b/mealie/routes/households/controller_cookbooks.py
@@ -11,7 +11,7 @@ from mealie.routes._base import BaseCrudController, controller
from mealie.routes._base.mixins import HttpRepo
from mealie.routes._base.routers import MealieCrudRoute
from mealie.schema import mapper
-from mealie.schema.cookbook import CreateCookBook, ReadCookBook, RecipeCookBook, SaveCookBook, UpdateCookBook
+from mealie.schema.cookbook import CreateCookBook, ReadCookBook, SaveCookBook, UpdateCookBook
from mealie.schema.cookbook.cookbook import CookBookPagination
from mealie.schema.response.pagination import PaginationQuery
from mealie.services.event_bus_service.event_types import (
@@ -101,7 +101,7 @@ class GroupCookbookController(BaseCrudController):
return all_updated
- @router.get("/{item_id}", response_model=RecipeCookBook)
+ @router.get("/{item_id}", response_model=ReadCookBook)
def get_one(self, item_id: UUID4 | str):
if isinstance(item_id, UUID):
match_attr = "id"
@@ -114,12 +114,10 @@ class GroupCookbookController(BaseCrudController):
# Allow fetching other households' cookbooks
cookbook = self.group_cookbooks.get_one(item_id, match_attr)
-
if cookbook is None:
raise HTTPException(status_code=404)
- recipe_pagination = self.repos.recipes.page_all(PaginationQuery(page=1, per_page=-1, cookbook=cookbook))
- return cookbook.cast(RecipeCookBook, recipes=recipe_pagination.items)
+ return cookbook
@router.put("/{item_id}", response_model=ReadCookBook)
def update_one(self, item_id: str, data: CreateCookBook):
diff --git a/mealie/schema/_mealie/__init__.py b/mealie/schema/_mealie/__init__.py
index 7441e747a..628e17908 100644
--- a/mealie/schema/_mealie/__init__.py
+++ b/mealie/schema/_mealie/__init__.py
@@ -3,11 +3,11 @@ from .datetime_parse import DateError, DateTimeError, DurationError, TimeError
from .mealie_model import HasUUID, MealieModel, SearchType
__all__ = [
- "HasUUID",
- "MealieModel",
- "SearchType",
"DateError",
"DateTimeError",
"DurationError",
"TimeError",
+ "HasUUID",
+ "MealieModel",
+ "SearchType",
]
diff --git a/mealie/schema/admin/__init__.py b/mealie/schema/admin/__init__.py
index 92edafd25..367e94739 100644
--- a/mealie/schema/admin/__init__.py
+++ b/mealie/schema/admin/__init__.py
@@ -18,10 +18,28 @@ from .restore import (
from .settings import CustomPageBase, CustomPageOut
__all__ = [
+ "MaintenanceLogs",
+ "MaintenanceStorageDetails",
+ "MaintenanceSummary",
"ChowdownURL",
"MigrationFile",
"MigrationImport",
"Migrations",
+ "CustomPageBase",
+ "CustomPageOut",
+ "CommentImport",
+ "CustomPageImport",
+ "GroupImport",
+ "ImportBase",
+ "NotificationImport",
+ "RecipeImport",
+ "SettingsImport",
+ "UserImport",
+ "AllBackups",
+ "BackupFile",
+ "BackupOptions",
+ "CreateBackup",
+ "ImportJob",
"AdminAboutInfo",
"AppInfo",
"AppStartupInfo",
@@ -31,23 +49,5 @@ __all__ = [
"EmailReady",
"EmailSuccess",
"EmailTest",
- "CustomPageBase",
- "CustomPageOut",
- "AllBackups",
- "BackupFile",
- "BackupOptions",
- "CreateBackup",
- "ImportJob",
- "MaintenanceLogs",
- "MaintenanceStorageDetails",
- "MaintenanceSummary",
"DebugResponse",
- "CommentImport",
- "CustomPageImport",
- "GroupImport",
- "ImportBase",
- "NotificationImport",
- "RecipeImport",
- "SettingsImport",
- "UserImport",
]
diff --git a/mealie/schema/cookbook/__init__.py b/mealie/schema/cookbook/__init__.py
index 9559f84f5..8a358571a 100644
--- a/mealie/schema/cookbook/__init__.py
+++ b/mealie/schema/cookbook/__init__.py
@@ -1,11 +1,10 @@
# This file is auto-generated by gen_schema_exports.py
-from .cookbook import CookBookPagination, CreateCookBook, ReadCookBook, RecipeCookBook, SaveCookBook, UpdateCookBook
+from .cookbook import CookBookPagination, CreateCookBook, ReadCookBook, SaveCookBook, UpdateCookBook
__all__ = [
"CookBookPagination",
"CreateCookBook",
"ReadCookBook",
- "RecipeCookBook",
"SaveCookBook",
"UpdateCookBook",
]
diff --git a/mealie/schema/cookbook/cookbook.py b/mealie/schema/cookbook/cookbook.py
index 509f3dc05..66ba3b668 100644
--- a/mealie/schema/cookbook/cookbook.py
+++ b/mealie/schema/cookbook/cookbook.py
@@ -7,7 +7,6 @@ from slugify import slugify
from mealie.core.root_logger import get_logger
from mealie.db.models.recipe import RecipeModel
from mealie.schema._mealie import MealieModel
-from mealie.schema.recipe.recipe import RecipeSummary
from mealie.schema.response.pagination import PaginationBase
from mealie.schema.response.query_filter import QueryFilterBuilder, QueryFilterJSON
@@ -84,10 +83,3 @@ class ReadCookBook(UpdateCookBook):
class CookBookPagination(PaginationBase):
items: list[ReadCookBook]
-
-
-class RecipeCookBook(ReadCookBook):
- group_id: UUID4
- household_id: UUID4
- recipes: list[RecipeSummary]
- model_config = ConfigDict(from_attributes=True)
diff --git a/mealie/schema/group/__init__.py b/mealie/schema/group/__init__.py
index 3e0fb46fb..a731b4432 100644
--- a/mealie/schema/group/__init__.py
+++ b/mealie/schema/group/__init__.py
@@ -7,13 +7,13 @@ from .group_seeder import SeederConfig
from .group_statistics import GroupStorage
__all__ = [
- "GroupAdminUpdate",
- "GroupStorage",
"GroupDataExport",
- "SeederConfig",
"CreateGroupPreferences",
"ReadGroupPreferences",
"UpdateGroupPreferences",
+ "GroupStorage",
"DataMigrationCreate",
"SupportedMigrations",
+ "SeederConfig",
+ "GroupAdminUpdate",
]
diff --git a/mealie/schema/household/__init__.py b/mealie/schema/household/__init__.py
index f0e2f88d9..1fcc7bb25 100644
--- a/mealie/schema/household/__init__.py
+++ b/mealie/schema/household/__init__.py
@@ -70,6 +70,49 @@ from .invite_token import CreateInviteToken, EmailInitationResponse, EmailInvita
from .webhook import CreateWebhook, ReadWebhook, SaveWebhook, WebhookPagination, WebhookType
__all__ = [
+ "GroupEventNotifierCreate",
+ "GroupEventNotifierOptions",
+ "GroupEventNotifierOptionsOut",
+ "GroupEventNotifierOptionsSave",
+ "GroupEventNotifierOut",
+ "GroupEventNotifierPrivate",
+ "GroupEventNotifierSave",
+ "GroupEventNotifierUpdate",
+ "GroupEventPagination",
+ "CreateGroupRecipeAction",
+ "GroupRecipeActionOut",
+ "GroupRecipeActionPagination",
+ "GroupRecipeActionPayload",
+ "GroupRecipeActionType",
+ "SaveGroupRecipeAction",
+ "CreateWebhook",
+ "ReadWebhook",
+ "SaveWebhook",
+ "WebhookPagination",
+ "WebhookType",
+ "CreateHouseholdPreferences",
+ "ReadHouseholdPreferences",
+ "SaveHouseholdPreferences",
+ "UpdateHouseholdPreferences",
+ "HouseholdCreate",
+ "HouseholdInDB",
+ "HouseholdPagination",
+ "HouseholdRecipeBase",
+ "HouseholdRecipeCreate",
+ "HouseholdRecipeOut",
+ "HouseholdRecipeSummary",
+ "HouseholdRecipeUpdate",
+ "HouseholdSave",
+ "HouseholdSummary",
+ "HouseholdUserSummary",
+ "UpdateHousehold",
+ "UpdateHouseholdAdmin",
+ "HouseholdStatistics",
+ "CreateInviteToken",
+ "EmailInitationResponse",
+ "EmailInvitation",
+ "ReadInviteToken",
+ "SaveInviteToken",
"ShoppingListAddRecipeParams",
"ShoppingListAddRecipeParamsBulk",
"ShoppingListCreate",
@@ -93,48 +136,5 @@ __all__ = [
"ShoppingListSave",
"ShoppingListSummary",
"ShoppingListUpdate",
- "GroupEventNotifierCreate",
- "GroupEventNotifierOptions",
- "GroupEventNotifierOptionsOut",
- "GroupEventNotifierOptionsSave",
- "GroupEventNotifierOut",
- "GroupEventNotifierPrivate",
- "GroupEventNotifierSave",
- "GroupEventNotifierUpdate",
- "GroupEventPagination",
- "CreateGroupRecipeAction",
- "GroupRecipeActionOut",
- "GroupRecipeActionPagination",
- "GroupRecipeActionPayload",
- "GroupRecipeActionType",
- "SaveGroupRecipeAction",
- "CreateHouseholdPreferences",
- "ReadHouseholdPreferences",
- "SaveHouseholdPreferences",
- "UpdateHouseholdPreferences",
"SetPermissions",
- "CreateInviteToken",
- "EmailInitationResponse",
- "EmailInvitation",
- "ReadInviteToken",
- "SaveInviteToken",
- "HouseholdStatistics",
- "CreateWebhook",
- "ReadWebhook",
- "SaveWebhook",
- "WebhookPagination",
- "WebhookType",
- "HouseholdCreate",
- "HouseholdInDB",
- "HouseholdPagination",
- "HouseholdRecipeBase",
- "HouseholdRecipeCreate",
- "HouseholdRecipeOut",
- "HouseholdRecipeSummary",
- "HouseholdRecipeUpdate",
- "HouseholdSave",
- "HouseholdSummary",
- "HouseholdUserSummary",
- "UpdateHousehold",
- "UpdateHouseholdAdmin",
]
diff --git a/mealie/schema/meal_plan/__init__.py b/mealie/schema/meal_plan/__init__.py
index 5f3b9b033..639c61ee6 100644
--- a/mealie/schema/meal_plan/__init__.py
+++ b/mealie/schema/meal_plan/__init__.py
@@ -12,6 +12,9 @@ from .plan_rules import PlanRulesCreate, PlanRulesDay, PlanRulesOut, PlanRulesPa
from .shopping_list import ListItem, ShoppingListIn, ShoppingListOut
__all__ = [
+ "ListItem",
+ "ShoppingListIn",
+ "ShoppingListOut",
"CreatePlanEntry",
"CreateRandomEntry",
"PlanEntryPagination",
@@ -19,9 +22,6 @@ __all__ = [
"ReadPlanEntry",
"SavePlanEntry",
"UpdatePlanEntry",
- "ListItem",
- "ShoppingListIn",
- "ShoppingListOut",
"PlanRulesCreate",
"PlanRulesDay",
"PlanRulesOut",
diff --git a/mealie/schema/recipe/__init__.py b/mealie/schema/recipe/__init__.py
index d105db300..2304c8a5e 100644
--- a/mealie/schema/recipe/__init__.py
+++ b/mealie/schema/recipe/__init__.py
@@ -89,6 +89,35 @@ from .recipe_tool import RecipeToolCreate, RecipeToolOut, RecipeToolResponse, Re
from .request_helpers import RecipeDuplicate, RecipeSlug, RecipeZipTokenResponse, SlugResponse, UpdateImageResponse
__all__ = [
+ "IngredientReferences",
+ "RecipeStep",
+ "RecipeNote",
+ "CategoryBase",
+ "CategoryIn",
+ "CategoryOut",
+ "CategorySave",
+ "RecipeCategoryResponse",
+ "RecipeTagResponse",
+ "TagBase",
+ "TagIn",
+ "TagOut",
+ "TagSave",
+ "RecipeAsset",
+ "RecipeTimelineEventCreate",
+ "RecipeTimelineEventIn",
+ "RecipeTimelineEventOut",
+ "RecipeTimelineEventPagination",
+ "RecipeTimelineEventUpdate",
+ "TimelineEventImage",
+ "TimelineEventType",
+ "RecipeSuggestionQuery",
+ "RecipeSuggestionResponse",
+ "RecipeSuggestionResponseItem",
+ "Nutrition",
+ "RecipeShareToken",
+ "RecipeShareTokenCreate",
+ "RecipeShareTokenSave",
+ "RecipeShareTokenSummary",
"CreateIngredientFood",
"CreateIngredientFoodAlias",
"CreateIngredientUnit",
@@ -111,27 +140,13 @@ __all__ = [
"SaveIngredientFood",
"SaveIngredientUnit",
"UnitFoodBase",
- "RecipeTimelineEventCreate",
- "RecipeTimelineEventIn",
- "RecipeTimelineEventOut",
- "RecipeTimelineEventPagination",
- "RecipeTimelineEventUpdate",
- "TimelineEventImage",
- "TimelineEventType",
- "Nutrition",
- "AssignCategories",
- "AssignSettings",
- "AssignTags",
- "DeleteRecipes",
- "ExportBase",
- "ExportRecipes",
- "ExportTypes",
"RecipeCommentCreate",
"RecipeCommentOut",
"RecipeCommentPagination",
"RecipeCommentSave",
"RecipeCommentUpdate",
"UserBase",
+ "RecipeSettings",
"CreateRecipe",
"CreateRecipeBulk",
"CreateRecipeByUrlBulk",
@@ -145,40 +160,25 @@ __all__ = [
"RecipeTagPagination",
"RecipeTool",
"RecipeToolPagination",
- "IngredientReferences",
- "RecipeStep",
- "RecipeNote",
- "RecipeSuggestionQuery",
- "RecipeSuggestionResponse",
- "RecipeSuggestionResponseItem",
- "RecipeSettings",
- "RecipeShareToken",
- "RecipeShareTokenCreate",
- "RecipeShareTokenSave",
- "RecipeShareTokenSummary",
- "RecipeAsset",
+ "ScrapeRecipe",
+ "ScrapeRecipeBase",
+ "ScrapeRecipeData",
+ "ScrapeRecipeTest",
+ "AssignCategories",
+ "AssignSettings",
+ "AssignTags",
+ "DeleteRecipes",
+ "ExportBase",
+ "ExportRecipes",
+ "ExportTypes",
+ "RecipeToolCreate",
+ "RecipeToolOut",
+ "RecipeToolResponse",
+ "RecipeToolSave",
+ "RecipeImageTypes",
"RecipeDuplicate",
"RecipeSlug",
"RecipeZipTokenResponse",
"SlugResponse",
"UpdateImageResponse",
- "RecipeToolCreate",
- "RecipeToolOut",
- "RecipeToolResponse",
- "RecipeToolSave",
- "CategoryBase",
- "CategoryIn",
- "CategoryOut",
- "CategorySave",
- "RecipeCategoryResponse",
- "RecipeTagResponse",
- "TagBase",
- "TagIn",
- "TagOut",
- "TagSave",
- "ScrapeRecipe",
- "ScrapeRecipeBase",
- "ScrapeRecipeData",
- "ScrapeRecipeTest",
- "RecipeImageTypes",
]
diff --git a/mealie/schema/response/__init__.py b/mealie/schema/response/__init__.py
index fad4f840f..c513794c5 100644
--- a/mealie/schema/response/__init__.py
+++ b/mealie/schema/response/__init__.py
@@ -28,14 +28,14 @@ __all__ = [
"QueryFilterJSONPart",
"RelationalKeyword",
"RelationalOperator",
- "SearchFilter",
+ "ValidationResponse",
"OrderByNullPosition",
"OrderDirection",
"PaginationBase",
"PaginationQuery",
"RecipeSearchQuery",
"RequestQuery",
- "ValidationResponse",
+ "SearchFilter",
"ErrorResponse",
"FileTokenResponse",
"SuccessResponse",
diff --git a/mealie/schema/user/__init__.py b/mealie/schema/user/__init__.py
index 65e7e00a6..76db2ec95 100644
--- a/mealie/schema/user/__init__.py
+++ b/mealie/schema/user/__init__.py
@@ -38,6 +38,12 @@ from .user_passwords import (
)
__all__ = [
+ "ForgotPassword",
+ "PasswordResetToken",
+ "PrivatePasswordResetToken",
+ "ResetPassword",
+ "SavePasswordResetToken",
+ "ValidateResetToken",
"CredentialsRequest",
"CredentialsRequestForm",
"Token",
@@ -69,10 +75,4 @@ __all__ = [
"UserRatings",
"UserSummary",
"UserSummaryPagination",
- "ForgotPassword",
- "PasswordResetToken",
- "PrivatePasswordResetToken",
- "ResetPassword",
- "SavePasswordResetToken",
- "ValidateResetToken",
]
diff --git a/tests/integration_tests/public_explorer_tests/test_public_cookbooks.py b/tests/integration_tests/public_explorer_tests/test_public_cookbooks.py
index 1385aebf5..c3902a6d4 100644
--- a/tests/integration_tests/public_explorer_tests/test_public_cookbooks.py
+++ b/tests/integration_tests/public_explorer_tests/test_public_cookbooks.py
@@ -217,13 +217,14 @@ def test_get_cookbooks_with_recipes(api_client: TestClient, unique_user: TestUse
)
)
- # Get the cookbook and make sure we only get the public recipes from each household
- response = api_client.get(api_routes.explore_groups_group_slug_cookbooks_item_id(unique_user.group_id, cookbook.id))
+ # Get the cookbook recipes and make sure we only get the public recipes from each household
+ response = api_client.get(
+ api_routes.explore_groups_group_slug_recipes(unique_user.group_id), params={"cookbook": cookbook.slug}
+ )
assert response.status_code == 200
- cookbook_data = response.json()
- assert cookbook_data["id"] == str(cookbook.id)
+ recipe_data = response.json()
- cookbook_recipe_ids: set[str] = {recipe["id"] for recipe in cookbook_data["recipes"]}
+ cookbook_recipe_ids: set[str] = {recipe["id"] for recipe in recipe_data["items"]}
assert len(cookbook_recipe_ids) == 2
assert str(public_recipe.id) in cookbook_recipe_ids
assert str(private_recipe.id) not in cookbook_recipe_ids
@@ -297,13 +298,14 @@ def test_get_cookbooks_private_household(api_client: TestClient, unique_user: Te
)
)
- # Get the cookbook and make sure we only get the public recipes from each household
- response = api_client.get(api_routes.explore_groups_group_slug_cookbooks_item_id(unique_user.group_id, cookbook.id))
+ # Get the cookbook recipes and make sure we only get the public recipes from each household
+ response = api_client.get(
+ api_routes.explore_groups_group_slug_recipes(unique_user.group_id), params={"cookbook": cookbook.slug}
+ )
assert response.status_code == 200
- cookbook_data = response.json()
- assert cookbook_data["id"] == str(cookbook.id)
+ recipe_data = response.json()
- cookbook_recipe_ids: set[str] = {recipe["id"] for recipe in cookbook_data["recipes"]}
+ cookbook_recipe_ids: set[str] = {recipe["id"] for recipe in recipe_data["items"]}
assert len(cookbook_recipe_ids) == 1
assert str(public_recipe.id) in cookbook_recipe_ids
assert str(other_household_private_recipe.id) not in cookbook_recipe_ids