No description
Find a file
2025-11-02 18:55:55 +11:00
api autoformat 2025-11-02 18:55:55 +11:00
households Meal validation improvements 2025-11-02 17:45:12 +11:00
ingredients Disallow empty ingredients 2025-11-02 18:14:03 +11:00
meals Seed Users from legacy Persons for tests; remove Person fallback in meals; fix migration memberships; add indices; remove cookie helpers; spec updated 2025-11-01 21:37:35 +11:00
products Tighten api endpoints 2025-10-26 15:14:05 +11:00
recipes autoformat 2025-11-02 17:51:10 +11:00
scripts db.create() initializes all v2 tables, including users and households, and tenant tables already include household_id columns and indices by default. No separate migration script is required for fresh databases used by tests. 2025-11-02 00:19:45 +11:00
shopping autoformat 2025-11-02 17:51:10 +11:00
tests autoformat 2025-11-02 18:55:55 +11:00
users Remove cookie auth helpers, clean Person-based recipe function; add indices and test seeding helper; spec updated 2025-11-01 21:28:50 +11:00
.editorconfig Added ruff, black and mypy 2025-10-18 14:26:42 +11:00
.env.example Squashed commit of the following: 2025-10-20 00:12:16 +11:00
.gitignore Squashed commit of the following: 2025-10-19 20:24:23 +11:00
.pre-commit-config.yaml persons removed 2025-11-01 22:35:10 +11:00
backend-spec.md Meal validation improvements 2025-11-02 17:45:12 +11:00
common.py Avoid optional arrays 2025-11-01 12:21:12 +11:00
CONTRIBUTING.md Squashed commit of the following: 2025-10-20 00:12:16 +11:00
db.py persons removed 2025-11-01 22:35:10 +11:00
dev-requirements.txt Squashed commit of the following: 2025-10-20 00:12:16 +11:00
main.py autoformat 2025-11-02 17:51:10 +11:00
Makefile Squashed commit of the following: 2025-10-20 00:12:16 +11:00
openapi.json Meal validation improvements 2025-11-02 17:45:12 +11:00
plan.md Significant refactor 2024-01-13 12:54:04 +11:00
pyproject.toml Avoid optional arrays 2025-11-01 12:21:12 +11:00
README.md Squashed commit of the following: 2025-10-20 00:12:16 +11:00
requirements.txt feat(meals+auth): remove Person from meals v2 DTOs (MemberRef) and adopt Argon2 hashing 2025-11-01 17:00:36 +11:00
security.py format 2025-11-01 15:34:01 +11:00
settings.py feat(auth v2): implement JWT access + refresh cookie; update deps and tests 2025-11-01 14:14:58 +11:00
tighten-api-spec.md db.create() initializes all v2 tables, including users and households, and tenant tables already include household_id columns and indices by default. No separate migration script is required for fresh databases used by tests. 2025-11-02 00:19:45 +11:00
transform.sql Squashed commit of the following: 2024-10-13 19:19:57 +11:00
units.py Added ruff, black and mypy 2025-10-18 14:26:42 +11:00

Meal planner backend

Quickstart

First time setup:

make install

Run the development server:

make dev

Run tests:

make test

Run all quality checks (lint, typecheck, test, format check, OpenAPI export):

make all-checks

Structure

  • main.py: FastAPI app with all HTTP endpoints.
  • db.py: aiosqlite connection + schema bootstrap across subpackages (calls each feature's repository.create).
  • Domain packages with models and persistence:
    • products/ (models.py, repository.py, scrapers for Woolworths/Coles)
    • ingredients/ (models.py, repository.py)
    • recipes/ (models.py, repository.py, scraping.py)
    • meals/ (models.py, repository.py, service.py)
    • persons/ (models.py, repository.py)
    • shopping/ (models.py, repository.py)
  • tests/: unit and API tests with sample HTTP fixtures.

Getting started

Manual setup (alternative to make install)

Create and activate virtual environment:

python3 -m venv .venv
source .venv/bin/activate  # On Windows: .venv\Scripts\activate

Install packages:

pip install -r ./requirements.txt
pip install -r ./dev-requirements.txt

Install pre-commit hooks:

pip install pre-commit
pre-commit install

Running the application

Run API (dev):

make dev
# or: uvicorn main:app --reload

Run tests:

make test
# or: pytest -q

Available Make targets

  • make install - Create venv and install all dependencies
  • make dev - Run development server
  • make test - Run tests
  • make format - Format code with ruff
  • make lint - Lint code with ruff
  • make typecheck - Type check with mypy
  • make openapi - Export OpenAPI schema
  • make all-checks - Run all quality checks
  • make clean - Remove venv and caches

Tooling

This repo includes baseline configs in pyproject.toml:

  • ruff (format and lint)
  • mypy (type check)

Pre-commit hooks are configured to run:

  • ruff (lint + format)
  • mypy
  • trailing whitespace fixer
  • end-of-file fixer

Quality checks (run locally):

make format      # Format code
make lint        # Lint code
make typecheck   # Type check
make all-checks  # Run all checks

Environment variables

Copy .env.example to .env and customize as needed:

  • DOOF_DB: Path to sqlite database (default: ./data/doof.sqlite)
  • DOOF_PROD: Set to true in production (default: false)
  • FRONTEND_DEV_URL: Frontend dev server URL for reverse proxy (default: http://localhost:8080/)
  • DOOF_PORT: Port the server listens on when containerized; align Dockerfile EXPOSE accordingly.

OpenAPI schema

  • Generate the schema artifact used by the frontend and CI checks:
python scripts/export_openapi.py

This writes openapi.json to the repo root. Versioned endpoints live under /api/v1, legacy under /api (deprecated with Deprecation header).

Schema lint/diff (manual)

Optionally, lint and compare schemas locally using Node tools:

npx -y @stoplight/spectral-cli lint openapi.json
npx -y openapi-diff --fail-on-changed --fail-on-incompatible path/to/baseline.json openapi.json

Keep a baseline.json on release branches to detect breaking changes.