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:
@@ -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",
|
||||
|
||||
@@ -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"`
|
||||
}
|
||||
|
||||
11
backend/migrations/003_quick_add_library.sql
Normal file
11
backend/migrations/003_quick_add_library.sql
Normal file
@@ -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);
|
||||
Reference in New Issue
Block a user