Saved recipes: named collections / folder organization (Paid tier) #26

Closed
opened 2026-04-07 21:53:39 -07:00 by pyr0ball · 0 comments
Owner

Summary

Paid-tier extension of #24 (core saved recipes). Lets users organize saved recipes into named collections (e.g. "weeknight meals", "holiday baking").

Depends on: #24 (saved recipes core)

DB Changes

Migration 019:

CREATE TABLE recipe_collections (
    id          INTEGER PRIMARY KEY AUTOINCREMENT,
    name        TEXT    NOT NULL,
    description TEXT,
    created_at  TEXT    NOT NULL DEFAULT (datetime('now')),
    updated_at  TEXT    NOT NULL DEFAULT (datetime('now'))
);

CREATE TABLE recipe_collection_members (
    collection_id   INTEGER NOT NULL REFERENCES recipe_collections(id) ON DELETE CASCADE,
    saved_recipe_id INTEGER NOT NULL REFERENCES saved_recipes(id) ON DELETE CASCADE,
    added_at        TEXT    NOT NULL DEFAULT (datetime('now')),
    PRIMARY KEY (collection_id, saved_recipe_id)
);

Store Methods

  • create_collection(name, description) -> dict
  • delete_collection(collection_id) -> None
  • rename_collection(collection_id, name, description) -> dict
  • get_collections() -> list[dict]
  • add_to_collection(collection_id, saved_recipe_id) -> None
  • remove_from_collection(collection_id, saved_recipe_id) -> None

API Endpoints

  • POST /recipes/collections
  • DELETE /recipes/collections/{id}
  • PATCH /recipes/collections/{id}
  • GET /recipes/collections
  • POST /recipes/collections/{id}/members{saved_recipe_id}
  • DELETE /recipes/collections/{id}/members/{saved_recipe_id}

All endpoints gated with @require_tier("paid").

Frontend

  • Collection selector sidebar or dropdown in SavedRecipesPanel.vue
  • Collection assignment multiselect in SaveRecipeModal.vue
  • Create/rename/delete collection controls

Spec

circuitforge-plans/kiwi/superpowers/specs/2026-04-07-saved-recipes-browser-design.md sections 3.1–3.3

## Summary Paid-tier extension of #24 (core saved recipes). Lets users organize saved recipes into named collections (e.g. "weeknight meals", "holiday baking"). **Depends on:** #24 (saved recipes core) ## DB Changes Migration 019: ```sql CREATE TABLE recipe_collections ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, description TEXT, created_at TEXT NOT NULL DEFAULT (datetime('now')), updated_at TEXT NOT NULL DEFAULT (datetime('now')) ); CREATE TABLE recipe_collection_members ( collection_id INTEGER NOT NULL REFERENCES recipe_collections(id) ON DELETE CASCADE, saved_recipe_id INTEGER NOT NULL REFERENCES saved_recipes(id) ON DELETE CASCADE, added_at TEXT NOT NULL DEFAULT (datetime('now')), PRIMARY KEY (collection_id, saved_recipe_id) ); ``` ## Store Methods - `create_collection(name, description) -> dict` - `delete_collection(collection_id) -> None` - `rename_collection(collection_id, name, description) -> dict` - `get_collections() -> list[dict]` - `add_to_collection(collection_id, saved_recipe_id) -> None` - `remove_from_collection(collection_id, saved_recipe_id) -> None` ## API Endpoints - `POST /recipes/collections` - `DELETE /recipes/collections/{id}` - `PATCH /recipes/collections/{id}` - `GET /recipes/collections` - `POST /recipes/collections/{id}/members` — `{saved_recipe_id}` - `DELETE /recipes/collections/{id}/members/{saved_recipe_id}` All endpoints gated with `@require_tier("paid")`. ## Frontend - Collection selector sidebar or dropdown in `SavedRecipesPanel.vue` - Collection assignment multiselect in `SaveRecipeModal.vue` - Create/rename/delete collection controls ## Spec `circuitforge-plans/kiwi/superpowers/specs/2026-04-07-saved-recipes-browser-design.md` sections 3.1–3.3
pyr0ball added the
enhancement
label 2026-04-07 21:53:39 -07:00
pyr0ball added this to the Beta — Recipe Suggestions milestone 2026-04-07 22:09:32 -07:00
Sign in to join this conversation.
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: Circuit-Forge/kiwi#26
No description provided.