From 84d5b76a8ac27883120b76f13d2758bffe4c3821 Mon Sep 17 00:00:00 2001 From: Jean-Luc Makiola Date: Thu, 12 Mar 2026 13:33:53 +0100 Subject: [PATCH] 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 --- backend/internal/db/queries.go | 61 ++++++++++++++++++++ backend/internal/models/models.go | 10 ++++ backend/migrations/003_quick_add_library.sql | 11 ++++ 3 files changed, 82 insertions(+) create mode 100644 backend/migrations/003_quick_add_library.sql diff --git a/backend/internal/db/queries.go b/backend/internal/db/queries.go index 2ebeaa1..14d5541 100644 --- a/backend/internal/db/queries.go +++ b/backend/internal/db/queries.go @@ -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", diff --git a/backend/internal/models/models.go b/backend/internal/models/models.go index de4c466..56fa335 100644 --- a/backend/internal/models/models.go +++ b/backend/internal/models/models.go @@ -122,3 +122,13 @@ type TemplateDetail struct { Template Items []TemplateItem `json:"items"` } + +type QuickAddItem struct { + ID uuid.UUID `json:"id"` + UserID uuid.UUID `json:"user_id"` + Name string `json:"name"` + Icon string `json:"icon"` + SortOrder int `json:"sort_order"` + CreatedAt time.Time `json:"created_at"` + UpdatedAt time.Time `json:"updated_at"` +} diff --git a/backend/migrations/003_quick_add_library.sql b/backend/migrations/003_quick_add_library.sql new file mode 100644 index 0000000..3be0e77 --- /dev/null +++ b/backend/migrations/003_quick_add_library.sql @@ -0,0 +1,11 @@ +CREATE TABLE quick_add_items ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE, + name VARCHAR(100) NOT NULL, + icon VARCHAR(50) NOT NULL DEFAULT '', + sort_order INT NOT NULL DEFAULT 0, + created_at TIMESTAMPTZ NOT NULL DEFAULT now(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT now() +); + +CREATE INDEX idx_quick_add_items_user ON quick_add_items(user_id);