Add a Recipe/steps field to brew logging
Test and deploy / test-and-deploy (push) Successful in 1m16s

Free-text recipe (bloom, pours, timings) distinct from tasting notes and
next-time notes: new brews.recipe column (migration 007), form textarea,
shown under the recipe summary in brew history, carried by Brew again,
included in backups and the OpenAPI spec.

Co-Authored-By: Claude Fable 5 <[email protected]>
This commit is contained in:
Shane Maynard
2026-08-09 08:02:06 -04:00
co-authored by Claude Fable 5
parent 16d5af83f7
commit f781930832
7 changed files with 40 additions and 9 deletions
+3
View File
@@ -149,10 +149,12 @@ test("brews: validation, update, filter by bean, method taxonomy", async () => {
grinder: "Comandante",
grindSetting: "22 clicks",
rating: 8,
recipe: "inverted · fill to 230 g · stir 3× · steep 2:00 · press 30 s",
tastingNotes: "sweet, cocoa, round body",
});
assert.equal(created.status, 201);
assert.equal(created.body.brew.rating, 8);
assert.equal(created.body.brew.recipe, "inverted · fill to 230 g · stir 3× · steep 2:00 · press 30 s");
const updated = await agent
.put(`/api/brews/${created.body.brew.id}`)
@@ -162,6 +164,7 @@ test("brews: validation, update, filter by bean, method taxonomy", async () => {
assert.equal(updated.body.brew.rating, 6);
assert.equal(updated.body.brew.method, "aeropress"); // untouched fields survive
assert.equal(updated.body.brew.tastingNotes, "sweet, cocoa, round body");
assert.equal(updated.body.brew.recipe.startsWith("inverted"), true);
const bean = (
await agent.post("/api/beans").set("x-csrf-token", csrf).send({ name: "B" })