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)
|
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{
|
var monthNamesEN = map[time.Month]string{
|
||||||
time.January: "January",
|
time.January: "January",
|
||||||
time.February: "February",
|
time.February: "February",
|
||||||
|
|||||||
@@ -122,3 +122,13 @@ type TemplateDetail struct {
|
|||||||
Template
|
Template
|
||||||
Items []TemplateItem `json:"items"`
|
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