mirror of
https://github.com/mealie-recipes/mealie.git
synced 2025-07-24 07:39:41 +02:00
feat: Filter Recipes By Household (and a ton of bug fixes) (#4207)
Co-authored-by: Kuchenpirat <24235032+Kuchenpirat@users.noreply.github.com>
This commit is contained in:
parent
2a6922a85c
commit
7c274de778
65 changed files with 896 additions and 590 deletions
13
frontend/lib/api/admin/admin-households.ts
Normal file
13
frontend/lib/api/admin/admin-households.ts
Normal file
|
@ -0,0 +1,13 @@
|
|||
import { BaseCRUDAPI } from "../base/base-clients";
|
||||
import { HouseholdCreate, HouseholdInDB, UpdateHouseholdAdmin } from "~/lib/api/types/household";
|
||||
const prefix = "/api";
|
||||
|
||||
const routes = {
|
||||
adminHouseholds: `${prefix}/admin/households`,
|
||||
adminHouseholdsId: (id: string) => `${prefix}/admin/households/${id}`,
|
||||
};
|
||||
|
||||
export class AdminHouseholdsApi extends BaseCRUDAPI<HouseholdCreate, HouseholdInDB, UpdateHouseholdAdmin> {
|
||||
baseRoute: string = routes.adminHouseholds;
|
||||
itemRoute = routes.adminHouseholdsId;
|
||||
}
|
|
@ -1,5 +1,6 @@
|
|||
import { AdminAboutAPI } from "./admin/admin-about";
|
||||
import { AdminUsersApi } from "./admin/admin-users";
|
||||
import { AdminHouseholdsApi } from "./admin/admin-households";
|
||||
import { AdminGroupsApi } from "./admin/admin-groups";
|
||||
import { AdminBackupsApi } from "./admin/admin-backups";
|
||||
import { AdminMaintenanceApi } from "./admin/admin-maintenance";
|
||||
|
@ -9,6 +10,7 @@ import { ApiRequestInstance } from "~/lib/api/types/non-generated";
|
|||
export class AdminAPI {
|
||||
public about: AdminAboutAPI;
|
||||
public users: AdminUsersApi;
|
||||
public households: AdminHouseholdsApi;
|
||||
public groups: AdminGroupsApi;
|
||||
public backups: AdminBackupsApi;
|
||||
public maintenance: AdminMaintenanceApi;
|
||||
|
@ -17,6 +19,7 @@ export class AdminAPI {
|
|||
constructor(requests: ApiRequestInstance) {
|
||||
this.about = new AdminAboutAPI(requests);
|
||||
this.users = new AdminUsersApi(requests);
|
||||
this.households = new AdminHouseholdsApi(requests);
|
||||
this.groups = new AdminGroupsApi(requests);
|
||||
this.backups = new AdminBackupsApi(requests);
|
||||
this.maintenance = new AdminMaintenanceApi(requests);
|
||||
|
|
|
@ -4,6 +4,7 @@ import { PublicRecipeApi } from "./explore/recipes";
|
|||
import { PublicFoodsApi } from "./explore/foods";
|
||||
import { PublicCategoriesApi, PublicTagsApi, PublicToolsApi } from "./explore/organizers";
|
||||
import { PublicCookbooksApi } from "./explore/cookbooks";
|
||||
import { PublicHouseholdApi } from "./explore/households";
|
||||
|
||||
export class ExploreApi extends BaseAPI {
|
||||
public recipes: PublicRecipeApi;
|
||||
|
@ -12,6 +13,7 @@ export class ExploreApi extends BaseAPI {
|
|||
public categories: PublicCategoriesApi;
|
||||
public tags: PublicTagsApi;
|
||||
public tools: PublicToolsApi;
|
||||
public households: PublicHouseholdApi
|
||||
|
||||
constructor(requests: ApiRequestInstance, groupSlug: string) {
|
||||
super(requests);
|
||||
|
@ -21,5 +23,6 @@ export class ExploreApi extends BaseAPI {
|
|||
this.categories = new PublicCategoriesApi(requests, groupSlug);
|
||||
this.tags = new PublicTagsApi(requests, groupSlug);
|
||||
this.tools = new PublicToolsApi(requests, groupSlug);
|
||||
this.households = new PublicHouseholdApi(requests, groupSlug);
|
||||
}
|
||||
}
|
||||
|
|
20
frontend/lib/api/public/explore/households.ts
Normal file
20
frontend/lib/api/public/explore/households.ts
Normal file
|
@ -0,0 +1,20 @@
|
|||
import { BaseCRUDAPIReadOnly } from "~/lib/api/base/base-clients";
|
||||
import { HouseholdSummary } from "~/lib/api/types/household";
|
||||
import { ApiRequestInstance, PaginationData } from "~/lib/api/types/non-generated";
|
||||
|
||||
const prefix = "/api";
|
||||
const exploreGroupSlug = (groupSlug: string | number) => `${prefix}/explore/groups/${groupSlug}`
|
||||
|
||||
const routes = {
|
||||
householdsGroupSlug: (groupSlug: string | number) => `${exploreGroupSlug(groupSlug)}/households`,
|
||||
householdsGroupSlugHouseholdSlug: (groupSlug: string | number, householdSlug: string | number) => `${exploreGroupSlug(groupSlug)}/households/${householdSlug}`,
|
||||
};
|
||||
|
||||
export class PublicHouseholdApi extends BaseCRUDAPIReadOnly<HouseholdSummary> {
|
||||
baseRoute = routes.householdsGroupSlug(this.groupSlug);
|
||||
itemRoute = (itemId: string | number) => routes.householdsGroupSlugHouseholdSlug(this.groupSlug, itemId);
|
||||
|
||||
constructor(requests: ApiRequestInstance, private readonly groupSlug: string) {
|
||||
super(requests);
|
||||
}
|
||||
}
|
|
@ -1,6 +1,5 @@
|
|||
import { BaseCRUDAPI } from "../base/base-clients";
|
||||
import { GroupBase, GroupInDB, GroupSummary, UserSummary } from "~/lib/api/types/user";
|
||||
import { HouseholdSummary } from "~/lib/api/types/household";
|
||||
import {
|
||||
GroupAdminUpdate,
|
||||
GroupStorage,
|
||||
|
@ -15,8 +14,6 @@ const routes = {
|
|||
groupsSelf: `${prefix}/groups/self`,
|
||||
preferences: `${prefix}/groups/preferences`,
|
||||
storage: `${prefix}/groups/storage`,
|
||||
households: `${prefix}/groups/households`,
|
||||
householdsId: (id: string | number) => `${prefix}/groups/households/${id}`,
|
||||
membersHouseholdId: (householdId: string | number | null) => {
|
||||
return householdId ?
|
||||
`${prefix}/households/members?householdId=${householdId}` :
|
||||
|
@ -47,14 +44,6 @@ export class GroupAPI extends BaseCRUDAPI<GroupBase, GroupInDB, GroupAdminUpdate
|
|||
return await this.requests.get<UserSummary[]>(routes.membersHouseholdId(householdId));
|
||||
}
|
||||
|
||||
async fetchHouseholds() {
|
||||
return await this.requests.get<HouseholdSummary[]>(routes.households);
|
||||
}
|
||||
|
||||
async fetchHousehold(householdId: string | number) {
|
||||
return await this.requests.get<HouseholdSummary>(routes.householdsId(householdId));
|
||||
}
|
||||
|
||||
async storage() {
|
||||
return await this.requests.get<GroupStorage>(routes.storage);
|
||||
}
|
||||
|
|
|
@ -1,21 +1,20 @@
|
|||
import { BaseCRUDAPI } from "../base/base-clients";
|
||||
import { BaseCRUDAPIReadOnly } from "../base/base-clients";
|
||||
import { UserOut } from "~/lib/api/types/user";
|
||||
import {
|
||||
HouseholdCreate,
|
||||
HouseholdInDB,
|
||||
UpdateHouseholdAdmin,
|
||||
HouseholdStatistics,
|
||||
ReadHouseholdPreferences,
|
||||
SetPermissions,
|
||||
UpdateHouseholdPreferences,
|
||||
CreateInviteToken,
|
||||
ReadInviteToken,
|
||||
HouseholdSummary,
|
||||
} from "~/lib/api/types/household";
|
||||
|
||||
const prefix = "/api";
|
||||
|
||||
const routes = {
|
||||
households: `${prefix}/admin/households`,
|
||||
households: `${prefix}/groups/households`,
|
||||
householdsSelf: `${prefix}/households/self`,
|
||||
members: `${prefix}/households/members`,
|
||||
permissions: `${prefix}/households/permissions`,
|
||||
|
@ -24,13 +23,13 @@ const routes = {
|
|||
statistics: `${prefix}/households/statistics`,
|
||||
invitation: `${prefix}/households/invitations`,
|
||||
|
||||
householdsId: (id: string | number) => `${prefix}/admin/households/${id}`,
|
||||
householdsId: (id: string | number) => `${prefix}/groups/households/${id}`,
|
||||
};
|
||||
|
||||
export class HouseholdAPI extends BaseCRUDAPI<HouseholdCreate, HouseholdInDB, UpdateHouseholdAdmin> {
|
||||
export class HouseholdAPI extends BaseCRUDAPIReadOnly<HouseholdSummary> {
|
||||
baseRoute = routes.households;
|
||||
itemRoute = routes.householdsId;
|
||||
/** Returns the Group Data for the Current User
|
||||
/** Returns the Household Data for the Current User
|
||||
*/
|
||||
async getCurrentUserHousehold() {
|
||||
return await this.requests.get<HouseholdInDB>(routes.householdsSelf);
|
||||
|
|
|
@ -56,13 +56,14 @@ const routes = {
|
|||
};
|
||||
|
||||
export type RecipeSearchQuery = {
|
||||
search: string;
|
||||
search?: string;
|
||||
orderDirection?: "asc" | "desc";
|
||||
groupId?: string;
|
||||
|
||||
queryFilter?: string;
|
||||
|
||||
cookbook?: string;
|
||||
households?: string[];
|
||||
|
||||
categories?: string[];
|
||||
requireAllCategories?: boolean;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue