- Add bulk reorder API endpoint (PUT /api/collections/{id}/reorder) with atomic transactions
- Replace individual position updates with efficient bulk operations in frontend
- Implement unified ID generation and proper data-item-id injection during enhancement
- Fix collection item position persistence through content edit cycles
- Add optimistic UI with rollback capability for better user experience
- Update sqlc queries to include last_edited_by fields in position updates
- Remove obsolete data-content-type attributes and unify naming conventions
60 lines
2.8 KiB
SQL
60 lines
2.8 KiB
SQL
-- Collection items table queries
|
|
|
|
-- name: GetCollectionItem :one
|
|
SELECT item_id, collection_id, site_id, template_id, html_content, position, created_at, updated_at, last_edited_by
|
|
FROM collection_items
|
|
WHERE item_id = sqlc.arg(item_id) AND collection_id = sqlc.arg(collection_id) AND site_id = sqlc.arg(site_id);
|
|
|
|
-- name: GetCollectionItems :many
|
|
SELECT item_id, collection_id, site_id, template_id, html_content, position, created_at, updated_at, last_edited_by
|
|
FROM collection_items
|
|
WHERE collection_id = sqlc.arg(collection_id) AND site_id = sqlc.arg(site_id)
|
|
ORDER BY position ASC;
|
|
|
|
-- name: GetCollectionItemsWithTemplate :many
|
|
SELECT
|
|
ci.item_id, ci.collection_id, ci.site_id, ci.template_id, ci.html_content, ci.position, ci.created_at, ci.updated_at, ci.last_edited_by,
|
|
ct.name as template_name, ct.html_template, ct.is_default
|
|
FROM collection_items ci
|
|
JOIN collection_templates ct ON ci.template_id = ct.template_id
|
|
WHERE ci.collection_id = sqlc.arg(collection_id) AND ci.site_id = sqlc.arg(site_id)
|
|
ORDER BY ci.position ASC;
|
|
|
|
-- name: GetMaxPosition :one
|
|
SELECT COALESCE(MAX(position), 0) as max_position
|
|
FROM collection_items
|
|
WHERE collection_id = sqlc.arg(collection_id) AND site_id = sqlc.arg(site_id);
|
|
|
|
-- name: CreateCollectionItem :one
|
|
INSERT INTO collection_items (item_id, collection_id, site_id, template_id, html_content, position, last_edited_by)
|
|
VALUES (sqlc.arg(item_id), sqlc.arg(collection_id), sqlc.arg(site_id), sqlc.arg(template_id), sqlc.arg(html_content), sqlc.arg(position), sqlc.arg(last_edited_by))
|
|
RETURNING item_id, collection_id, site_id, template_id, html_content, position, created_at, updated_at, last_edited_by;
|
|
|
|
-- name: UpdateCollectionItem :one
|
|
UPDATE collection_items
|
|
SET html_content = sqlc.arg(html_content), last_edited_by = sqlc.arg(last_edited_by)
|
|
WHERE item_id = sqlc.arg(item_id) AND collection_id = sqlc.arg(collection_id) AND site_id = sqlc.arg(site_id)
|
|
RETURNING item_id, collection_id, site_id, template_id, html_content, position, created_at, updated_at, last_edited_by;
|
|
|
|
-- name: UpdateCollectionItemPosition :exec
|
|
UPDATE collection_items
|
|
SET position = sqlc.arg(position), updated_at = CURRENT_TIMESTAMP, last_edited_by = sqlc.arg(last_edited_by)
|
|
WHERE item_id = sqlc.arg(item_id) AND collection_id = sqlc.arg(collection_id) AND site_id = sqlc.arg(site_id);
|
|
|
|
-- name: ReorderCollectionItems :exec
|
|
UPDATE collection_items
|
|
SET position = position + sqlc.arg(position_delta)
|
|
WHERE collection_id = sqlc.arg(collection_id) AND site_id = sqlc.arg(site_id)
|
|
AND position >= sqlc.arg(start_position);
|
|
|
|
|
|
|
|
-- name: DeleteCollectionItem :exec
|
|
DELETE FROM collection_items
|
|
WHERE item_id = sqlc.arg(item_id) AND collection_id = sqlc.arg(collection_id) AND site_id = sqlc.arg(site_id);
|
|
|
|
-- name: DeleteCollectionItems :exec
|
|
DELETE FROM collection_items
|
|
WHERE collection_id = sqlc.arg(collection_id) AND site_id = sqlc.arg(site_id);
|
|
|