feat(07-01): add QuickAddItem migration, model, and query functions

- Create 003_quick_add_library.sql with quick_add_items table and user index
- Add QuickAddItem struct to models.go following Category pattern
- Add ListQuickAddItems, CreateQuickAddItem, UpdateQuickAddItem, DeleteQuickAddItem to queries.go
This commit is contained in:
2026-03-12 13:33:53 +01:00
parent cccac351cf
commit 84d5b76a8a
3 changed files with 82 additions and 0 deletions

View File

@@ -525,6 +525,67 @@ func (q *Queries) ReorderTemplateItems(ctx context.Context, userID uuid.UUID, it
return tx.Commit(ctx)
}
// Quick Add Items
func (q *Queries) ListQuickAddItems(ctx context.Context, userID uuid.UUID) ([]models.QuickAddItem, error) {
rows, err := q.pool.Query(ctx,
`SELECT id, user_id, name, icon, sort_order, created_at, updated_at
FROM quick_add_items WHERE user_id = $1 ORDER BY sort_order, name`, userID,
)
if err != nil {
return nil, fmt.Errorf("listing quick add items: %w", err)
}
defer rows.Close()
items := []models.QuickAddItem{}
for rows.Next() {
var i models.QuickAddItem
if err := rows.Scan(&i.ID, &i.UserID, &i.Name, &i.Icon, &i.SortOrder, &i.CreatedAt, &i.UpdatedAt); err != nil {
return nil, fmt.Errorf("scanning quick add item: %w", err)
}
items = append(items, i)
}
return items, nil
}
func (q *Queries) CreateQuickAddItem(ctx context.Context, userID uuid.UUID, name, icon string) (*models.QuickAddItem, error) {
i := &models.QuickAddItem{}
err := q.pool.QueryRow(ctx,
`INSERT INTO quick_add_items (user_id, name, icon, sort_order)
VALUES ($1, $2, $3, (SELECT COALESCE(MAX(sort_order), 0) + 1 FROM quick_add_items WHERE user_id = $1))
RETURNING id, user_id, name, icon, sort_order, created_at, updated_at`,
userID, name, icon,
).Scan(&i.ID, &i.UserID, &i.Name, &i.Icon, &i.SortOrder, &i.CreatedAt, &i.UpdatedAt)
if err != nil {
return nil, fmt.Errorf("creating quick add item: %w", err)
}
return i, nil
}
func (q *Queries) UpdateQuickAddItem(ctx context.Context, id, userID uuid.UUID, name, icon string, sortOrder int) (*models.QuickAddItem, error) {
i := &models.QuickAddItem{}
err := q.pool.QueryRow(ctx,
`UPDATE quick_add_items SET name = $3, icon = $4, sort_order = $5, updated_at = now()
WHERE id = $1 AND user_id = $2
RETURNING id, user_id, name, icon, sort_order, created_at, updated_at`,
id, userID, name, icon, sortOrder,
).Scan(&i.ID, &i.UserID, &i.Name, &i.Icon, &i.SortOrder, &i.CreatedAt, &i.UpdatedAt)
if err != nil {
if err == pgx.ErrNoRows {
return nil, fmt.Errorf("quick add item not found")
}
return nil, fmt.Errorf("updating quick add item: %w", err)
}
return i, nil
}
func (q *Queries) DeleteQuickAddItem(ctx context.Context, id, userID uuid.UUID) error {
_, err := q.pool.Exec(ctx,
`DELETE FROM quick_add_items WHERE id = $1 AND user_id = $2`, id, userID,
)
return err
}
var monthNamesEN = map[time.Month]string{
time.January: "January",
time.February: "February",