Add GET /api/v1/dinners/{id} dinner detail
CI / ci (push) Successful in 6m25s
CI / ci (pull_request) Successful in 5m12s

Returns a dinner with its recipe for the recipe detail screen and
Kitchen reading mode: photo URLs at both cached sizes (400/1200) or
null, ingredients and steps in recipe position order, the source page
for a fetched recipe, grounding status and error, and why_picked, the
reason of the suggestion that created the dinner (null when none).
Unknown and archived dinners are 404. Read in one transaction.

Adds the GetDinnerSuggestionReason query (sqlc regenerated). The
dinners test env now serves photos from the grounder's own store and
data directory so photo URLs can be fetched in tests.

Maestro task 099e9952-7f98-4700-8369-241c589a1e9d.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-08 18:50:18 -04:00
co-authored by Claude Opus 5.5
parent cb451baed4
commit 2217f4e5ad
10 changed files with 441 additions and 4 deletions
+16
View File
@@ -187,6 +187,22 @@ func (q *Queries) GetActiveSuggestionBatch(ctx context.Context) (SuggestionBatch
return i, err
}
const getDinnerSuggestionReason = `-- name: GetDinnerSuggestionReason :one
SELECT reason FROM suggestions
WHERE dinner_id = ?
ORDER BY created_at, id
LIMIT 1
`
// The reason of the suggestion that created dinner_id, its earliest.
// Returns sql.ErrNoRows for a dinner no suggestion created.
func (q *Queries) GetDinnerSuggestionReason(ctx context.Context, dinnerID string) (string, error) {
row := q.db.QueryRowContext(ctx, getDinnerSuggestionReason, dinnerID)
var reason string
err := row.Scan(&reason)
return reason, err
}
const getLatestSuggestionBatch = `-- name: GetLatestSuggestionBatch :one
SELECT id, "trigger", status, ai_run_id, created_at, updated_at FROM suggestion_batches
ORDER BY id DESC