From a9f2b6f5a82b04fcd3cbbc40568d63fa524e373f Mon Sep 17 00:00:00 2001 From: jableader Date: Sat, 1 Nov 2025 20:16:54 +1100 Subject: [PATCH] feat!: remove Person entity usage, adopt MemberRef across meals; update SDK and UI --- src/api/sdk.ts | 24 +---------- src/components/LoginPage.vue | 2 +- src/components/meals/EditMealPage.vue | 30 +++++++------- .../meals/{PersonList.vue => MemberList.vue} | 41 +++++++++---------- src/domain/types.ts | 3 +- tests/persons.api.errors.test.js | 12 ------ tests/persons.api.test.js | 30 -------------- 7 files changed, 39 insertions(+), 103 deletions(-) rename src/components/meals/{PersonList.vue => MemberList.vue} (79%) delete mode 100644 tests/persons.api.errors.test.js delete mode 100644 tests/persons.api.test.js diff --git a/src/api/sdk.ts b/src/api/sdk.ts index d1954de..32aa04b 100644 --- a/src/api/sdk.ts +++ b/src/api/sdk.ts @@ -224,29 +224,7 @@ export async function parseProduct( return (await res.json()) ?? null } -// Persons -async function listPersons(params?: { q?: string | null; cursor?: string | null; limit?: number }): Promise> { - const query: Record = {} - if (params) { - if (params.q !== undefined) query.q = params.q - if (params.cursor !== undefined) query.cursor = params.cursor - if (typeof params.limit === 'number') query.limit = params.limit - } - const url = '/api/v1/persons' + (Object.keys(query).length ? ('?' + new URLSearchParams(query as Record)) : '') - const res = await fetchApi(url, { method: 'GET' }) - if (!res.ok) throw httpError(res, null) - const data = await res.json() - const normalized = Array.isArray(data) ? { items: data } : (data ?? null) - return fromOpenApiPage(normalized, (p) => p) -} - -export async function getPersonsInHome(): Promise> { - return listPersons() -} - -export async function searchPersons(name: string): Promise> { - return listPersons({ q: name }) -} +// Person-related functions are removed as the entity is no longer in use. // Meals export async function getUpcomingMeals(from: Date, to: Date): Promise { diff --git a/src/components/LoginPage.vue b/src/components/LoginPage.vue index e8abab9..6118b86 100644 --- a/src/components/LoginPage.vue +++ b/src/components/LoginPage.vue @@ -58,7 +58,7 @@ const router = useRouter() const route = useRoute() const email = ref('') const password = ref('') -const isMultitenant = computed(() => typeof process !== 'undefined' && process.env?.VUE_APP_MULTITENANT_ENABLED === 'true') +const isMultitenant = computed(() => true) const { user } = useAuth() onMounted(async () => {}) diff --git a/src/components/meals/EditMealPage.vue b/src/components/meals/EditMealPage.vue index be62efd..1dc814f 100644 --- a/src/components/meals/EditMealPage.vue +++ b/src/components/meals/EditMealPage.vue @@ -7,21 +7,21 @@ />
Cooked by - for - , with - on cleanup.
@@ -131,11 +131,13 @@ import RecipeSearchBox from '@/components/recipes/RecipeSearchBox.vue' import RecipeCard from '@/components/recipes/RecipeCard.vue' import DatePicker from './DatePicker.vue' import EditableIngredientsPanel from '../ingredients/EditableIngredientsPanel.vue' -import PersonList from './PersonList.vue' +import MemberList from './MemberList.vue' import CompactParsedIngredient from '../ingredients/CompactParsedIngredient.vue' const showIngredientsIcon = new URL('@/assets/show-ingredients.svg', import.meta.url).toString() const trash = new URL('@/assets/trash.svg', import.meta.url).toString() +import type { MemberRef } from '@/domain/types' + function addPersonIfNotExists(list: T[], person: T | null | undefined) { if (!person) return if (!list.find((p) => p.id === person.id)) { @@ -203,14 +205,12 @@ function updateIngredient(ingredient: Ingredient, newIngredient: Ingredient) { meal.extraIngredients = meal.extraIngredients.map((i) => (i === ingredient ? newIngredient : i)) } -function removePerson(list: PeopleKey, person: { id: number }) { +function removePerson(list: PeopleKey, person: MemberRef) { meal[list] = meal[list].filter((p) => p.id !== person.id) } -function addPerson(list: PeopleKey, person: { id: number; name?: string; displayName?: string }) { - // Normalize person into MemberRef shape - const normalized = { id: person.id, displayName: (person as any).displayName ?? (person as any).name ?? '' } - addPersonIfNotExists(meal[list], normalized) +function addPerson(list: PeopleKey, person: MemberRef) { + addPersonIfNotExists(meal[list], person) } async function selectRecipe(recipe: { id: number | string }) { diff --git a/src/components/meals/PersonList.vue b/src/components/meals/MemberList.vue similarity index 79% rename from src/components/meals/PersonList.vue rename to src/components/meals/MemberList.vue index 544b427..3d3d8c4 100644 --- a/src/components/meals/PersonList.vue +++ b/src/components/meals/MemberList.vue @@ -8,7 +8,7 @@ class="person-circle remove-person" @click="removePerson(person)" > - {{ person.displayName || person.name || '' }} + {{ person.displayName || '' }} @@ -40,7 +40,7 @@ class="person-circle add-person" @mousedown="addPerson(person)" > - {{ person.displayName || person.name || '' }} + {{ person.displayName || '' }} @@ -50,36 +50,35 @@