R-01: a Rotation check decided drop now records the dinner's name at the decision in rotation_reviews.name (migration 0014, a table rebuild as 0012 did for suggestions; checks dropped before it take their dinner's name). ListPassedNames and ListRecentPassedNames read that name instead of the mutable dinners.name, so renaming the archived dinner no longer lets the dropped dish back into a Side quest batch. A CHECK keeps a name on drops only. R-02: deciding on a dinner that has never had a Rotation check is now ErrReviewNotFound, 404 not_found; a dinner whose checks are all decided, such as a second decision, stays 409 no_pending_review. Tests: TestLaterBatchNeverResuggestsRenamedDrop (drop, rename, next batch still refuses the original name), TestMigrateRotationReviewName (0013 to 0014 upgrade and constraints), TestPostRotationReviewNeverChecked (404), and TestDecideReview/TestDecideReviewRefused updated. Maestro: a1887d1c-c405-478c-ac7d-8cb8b40d280d Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
95 lines
2.2 KiB
Go
95 lines
2.2 KiB
Go
// Code generated by sqlc. DO NOT EDIT.
|
|
// versions:
|
|
// sqlc v1.31.1
|
|
// source: household_context.sql
|
|
|
|
package db
|
|
|
|
import (
|
|
"context"
|
|
)
|
|
|
|
const listPlannedDinners = `-- name: ListPlannedDinners :many
|
|
SELECT plan_days.date, dinners.name
|
|
FROM plan_days
|
|
JOIN dinners ON dinners.id = plan_days.dinner_id
|
|
WHERE plan_days.date >= ?1 AND plan_days.date < ?2
|
|
ORDER BY plan_days.date, plan_days.id
|
|
`
|
|
|
|
type ListPlannedDinnersParams struct {
|
|
FromDate string
|
|
ToDate string
|
|
}
|
|
|
|
type ListPlannedDinnersRow struct {
|
|
Date string
|
|
Name string
|
|
}
|
|
|
|
// The planned dinners dated from from_date up to but not including
|
|
// to_date, oldest first. Days with no dinner are left out.
|
|
func (q *Queries) ListPlannedDinners(ctx context.Context, arg ListPlannedDinnersParams) ([]ListPlannedDinnersRow, error) {
|
|
rows, err := q.db.QueryContext(ctx, listPlannedDinners, arg.FromDate, arg.ToDate)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer rows.Close()
|
|
var items []ListPlannedDinnersRow
|
|
for rows.Next() {
|
|
var i ListPlannedDinnersRow
|
|
if err := rows.Scan(&i.Date, &i.Name); err != nil {
|
|
return nil, err
|
|
}
|
|
items = append(items, i)
|
|
}
|
|
if err := rows.Close(); err != nil {
|
|
return nil, err
|
|
}
|
|
if err := rows.Err(); err != nil {
|
|
return nil, err
|
|
}
|
|
return items, nil
|
|
}
|
|
|
|
const listRecentPassedNames = `-- name: ListRecentPassedNames :many
|
|
|
|
SELECT name FROM (
|
|
SELECT name, decided_at, id
|
|
FROM suggestions
|
|
WHERE status = 'declined'
|
|
UNION ALL
|
|
SELECT name, decided_at, id
|
|
FROM rotation_reviews
|
|
WHERE decision = 'drop'
|
|
)
|
|
ORDER BY decided_at DESC, id DESC
|
|
LIMIT ?
|
|
`
|
|
|
|
// Reads for the AI household context block (internal/ai/harness).
|
|
// The most recent names the household turned down, newest first, as
|
|
// ListPassedNames has them.
|
|
func (q *Queries) ListRecentPassedNames(ctx context.Context, limit int64) ([]string, error) {
|
|
rows, err := q.db.QueryContext(ctx, listRecentPassedNames, limit)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer rows.Close()
|
|
var items []string
|
|
for rows.Next() {
|
|
var name string
|
|
if err := rows.Scan(&name); err != nil {
|
|
return nil, err
|
|
}
|
|
items = append(items, name)
|
|
}
|
|
if err := rows.Close(); err != nil {
|
|
return nil, err
|
|
}
|
|
if err := rows.Err(); err != nil {
|
|
return nil, err
|
|
}
|
|
return items, nil
|
|
}
|