Meal request requires user
This commit is contained in:
parent
b7a737ddaa
commit
83388b2925
3 changed files with 8 additions and 97 deletions
|
|
@ -167,6 +167,7 @@ async def request_meal_scoped(
|
||||||
r: MealIdWrapper,
|
r: MealIdWrapper,
|
||||||
request: Request,
|
request: Request,
|
||||||
household=Depends(get_household_from_slug),
|
household=Depends(get_household_from_slug),
|
||||||
|
user=Depends(get_current_user),
|
||||||
conn: aiosqlite.Connection = Depends(get_db),
|
conn: aiosqlite.Connection = Depends(get_db),
|
||||||
):
|
):
|
||||||
hid = household["id"]
|
hid = household["id"]
|
||||||
|
|
@ -177,7 +178,7 @@ async def request_meal_scoped(
|
||||||
return error_response(request, 404, "Meal not found")
|
return error_response(request, 404, "Meal not found")
|
||||||
|
|
||||||
try:
|
try:
|
||||||
item = await shopping.request_meal_scoped(conn, meal, hid)
|
item = await shopping.request_meal_scoped(conn, meal, hid, user.id)
|
||||||
except ValueError as e:
|
except ValueError as e:
|
||||||
return error_response(request, 400, str(e))
|
return error_response(request, 400, str(e))
|
||||||
return _to_meal_item(item)
|
return _to_meal_item(item)
|
||||||
|
|
|
||||||
|
|
@ -280,24 +280,25 @@ async def request(
|
||||||
|
|
||||||
|
|
||||||
async def request_meal_scoped(
|
async def request_meal_scoped(
|
||||||
conn, meal: Any, household_id: int, person_id: Optional[int] = None
|
conn, meal: Any, household_id: int, person_id: int
|
||||||
) -> ShoppingListItem:
|
) -> ShoppingListItem:
|
||||||
if meal is None or getattr(meal, "id", -1) < 0:
|
if meal is None or getattr(meal, "id", -1) < 0:
|
||||||
raise ValueError("Meal must have a valid id")
|
raise ValueError("Meal must have a valid id")
|
||||||
if await is_requested_scoped(conn, meal.id, household_id):
|
if await is_requested_scoped(conn, meal.id, household_id):
|
||||||
raise ValueError("Meal is already requested")
|
raise ValueError("Meal is already requested")
|
||||||
|
|
||||||
# Use 0 for outward personId to satisfy schema without binding to v1 persons
|
# Require a valid person id
|
||||||
pid = person_id if person_id is not None else 0
|
if person_id is None or person_id < 0:
|
||||||
|
raise ValueError("Meal request must have a valid person id")
|
||||||
|
|
||||||
item = ShoppingListItem(ingredient_id=None, person_id=pid, meal_id=meal.id)
|
item = ShoppingListItem(ingredient_id=None, person_id=person_id, meal_id=meal.id)
|
||||||
|
|
||||||
async with conn.execute(
|
async with conn.execute(
|
||||||
"""
|
"""
|
||||||
INSERT INTO ShoppingListItem (ingredient_id, person_id, meal_id, created_date, household_id)
|
INSERT INTO ShoppingListItem (ingredient_id, person_id, meal_id, created_date, household_id)
|
||||||
VALUES (?, ?, ?, ?, ?)
|
VALUES (?, ?, ?, ?, ?)
|
||||||
""",
|
""",
|
||||||
(None, pid, meal.id, item.created_date.isoformat(), household_id),
|
(None, person_id, meal.id, item.created_date.isoformat(), household_id),
|
||||||
) as cursor:
|
) as cursor:
|
||||||
item.id = cursor.lastrowid
|
item.id = cursor.lastrowid
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,91 +0,0 @@
|
||||||
import asyncio
|
|
||||||
|
|
||||||
import aiosqlite
|
|
||||||
|
|
||||||
import db
|
|
||||||
from tests.test_data import create_test_data
|
|
||||||
from scripts.migration_to_households import run_migration
|
|
||||||
|
|
||||||
|
|
||||||
async def table_has_column(conn: aiosqlite.Connection, table: str, col: str) -> bool:
|
|
||||||
async with conn.execute(f"PRAGMA table_info({table});") as c:
|
|
||||||
async for row in c:
|
|
||||||
if row[1] == col:
|
|
||||||
return True
|
|
||||||
return False
|
|
||||||
|
|
||||||
|
|
||||||
def test_migration_adds_tables_and_columns_and_ports_data(tmp_path):
|
|
||||||
async def _run():
|
|
||||||
db_path = tmp_path / "test.sqlite"
|
|
||||||
conn = await db.connect(str(db_path))
|
|
||||||
# Bootstrap v1 schema
|
|
||||||
await db.create(conn)
|
|
||||||
await conn.commit()
|
|
||||||
|
|
||||||
# Seed some v1 data (persons, products, recipes, meals)
|
|
||||||
await create_test_data(conn)
|
|
||||||
await conn.commit()
|
|
||||||
|
|
||||||
# Run migration
|
|
||||||
await run_migration(conn)
|
|
||||||
|
|
||||||
# Verify new tables exist
|
|
||||||
for tbl in [
|
|
||||||
"User",
|
|
||||||
"LocalCredentials",
|
|
||||||
"OAuthCredentials",
|
|
||||||
"Household",
|
|
||||||
"HouseholdMember",
|
|
||||||
"HouseholdInvitation",
|
|
||||||
]:
|
|
||||||
async with conn.execute(
|
|
||||||
"SELECT name FROM sqlite_master WHERE type='table' AND name=?;", (tbl,)
|
|
||||||
) as c:
|
|
||||||
assert await c.fetchone() is not None, f"Missing table {tbl}"
|
|
||||||
|
|
||||||
# Verify household_id column exists on tenant tables
|
|
||||||
tenant_tables = [
|
|
||||||
"Recipe",
|
|
||||||
"Ingredient",
|
|
||||||
"Meal",
|
|
||||||
"MealParticipant",
|
|
||||||
"MealRecipe",
|
|
||||||
"ShoppingList",
|
|
||||||
"ShoppingListItem",
|
|
||||||
]
|
|
||||||
for tbl in tenant_tables:
|
|
||||||
assert await table_has_column(conn, tbl, "household_id"), f"{tbl} lacks household_id"
|
|
||||||
|
|
||||||
# Default household exists
|
|
||||||
async with conn.execute(
|
|
||||||
"SELECT id, slug FROM Household WHERE slug='default' LIMIT 1;"
|
|
||||||
) as c:
|
|
||||||
row = await c.fetchone()
|
|
||||||
assert row is not None
|
|
||||||
|
|
||||||
# Persons were ported to Users and memberships created (if legacy Person table exists)
|
|
||||||
try:
|
|
||||||
async with conn.execute("SELECT COUNT(1) FROM Person;") as c:
|
|
||||||
row = await c.fetchone()
|
|
||||||
assert row is not None
|
|
||||||
person_count = int(row[0])
|
|
||||||
except Exception:
|
|
||||||
person_count = 0
|
|
||||||
async with conn.execute("SELECT COUNT(1) FROM User;") as c:
|
|
||||||
row = await c.fetchone()
|
|
||||||
assert row is not None
|
|
||||||
user_count = int(row[0])
|
|
||||||
if person_count > 0:
|
|
||||||
assert user_count == person_count
|
|
||||||
|
|
||||||
async with conn.execute("SELECT COUNT(1) FROM HouseholdMember;") as c:
|
|
||||||
row = await c.fetchone()
|
|
||||||
assert row is not None
|
|
||||||
member_count = int(row[0])
|
|
||||||
if person_count > 0:
|
|
||||||
assert member_count == person_count
|
|
||||||
|
|
||||||
await conn.close()
|
|
||||||
|
|
||||||
asyncio.run(_run())
|
|
||||||
Loading…
Reference in a new issue