mirror of
https://github.com/serty2005/rmser.git
synced 2026-02-04 19:02:33 -06:00
2701-как будто ок днд работает
This commit is contained in:
@@ -91,6 +91,10 @@ type Repository interface {
|
||||
Update(draft *DraftInvoice) error
|
||||
UpdateItem(itemID uuid.UUID, updates map[string]interface{}) error
|
||||
UpdateItemOrder(itemID uuid.UUID, newOrder int) error
|
||||
ReorderItems(draftID uuid.UUID, items []struct {
|
||||
ID uuid.UUID
|
||||
Order int
|
||||
}) error
|
||||
CreateItem(item *DraftInvoiceItem) error
|
||||
DeleteItem(itemID uuid.UUID) error
|
||||
Delete(id uuid.UUID) error
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
package drafts
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"rmser/internal/domain/drafts"
|
||||
|
||||
"github.com/google/uuid"
|
||||
@@ -105,6 +107,35 @@ func (r *pgRepository) UpdateItemOrder(itemID uuid.UUID, newOrder int) error {
|
||||
Update("order", newOrder).Error
|
||||
}
|
||||
|
||||
// ReorderItems обновляет порядок нескольких элементов в одной транзакции
|
||||
func (r *pgRepository) ReorderItems(draftID uuid.UUID, items []struct {
|
||||
ID uuid.UUID
|
||||
Order int
|
||||
}) error {
|
||||
return r.db.Transaction(func(tx *gorm.DB) error {
|
||||
for _, item := range items {
|
||||
// Проверяем, что элемент принадлежит указанному черновику
|
||||
var count int64
|
||||
if err := tx.Model(&drafts.DraftInvoiceItem{}).
|
||||
Where("id = ? AND draft_id = ?", item.ID, draftID).
|
||||
Count(&count).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
if count == 0 {
|
||||
return fmt.Errorf("элемент с id %s не принадлежит черновику %s", item.ID.String(), draftID.String())
|
||||
}
|
||||
|
||||
// Обновляем только колонку order
|
||||
if err := tx.Model(&drafts.DraftInvoiceItem{}).
|
||||
Where("id = ?", item.ID).
|
||||
Update("order", item.Order).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
})
|
||||
}
|
||||
|
||||
func (r *pgRepository) Delete(id uuid.UUID) error {
|
||||
return r.db.Delete(&drafts.DraftInvoice{}, id).Error
|
||||
}
|
||||
|
||||
@@ -921,3 +921,32 @@ func (s *Service) ReorderItem(draftID, itemID uuid.UUID, newOrder int) error {
|
||||
// Обновляем порядок целевого элемента
|
||||
return s.draftRepo.UpdateItemOrder(itemID, newOrder)
|
||||
}
|
||||
|
||||
// ReorderItems обновляет порядок нескольких элементов в черновике
|
||||
func (s *Service) ReorderItems(draftID uuid.UUID, items []struct {
|
||||
ID uuid.UUID
|
||||
Order int
|
||||
}) error {
|
||||
// Проверяем, что черновик существует
|
||||
draft, err := s.draftRepo.GetByID(draftID)
|
||||
if err != nil {
|
||||
return fmt.Errorf("черновик не найден: %w", err)
|
||||
}
|
||||
|
||||
// Проверяем, что все элементы принадлежат указанному черновику
|
||||
for _, item := range items {
|
||||
found := false
|
||||
for _, draftItem := range draft.Items {
|
||||
if draftItem.ID == item.ID {
|
||||
found = true
|
||||
break
|
||||
}
|
||||
}
|
||||
if !found {
|
||||
return fmt.Errorf("элемент с id %s не принадлежит черновику %s", item.ID.String(), draftID.String())
|
||||
}
|
||||
}
|
||||
|
||||
// Вызываем метод репозитория для обновления порядка
|
||||
return s.draftRepo.ReorderItems(draftID, items)
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package handlers
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net/http"
|
||||
"time"
|
||||
|
||||
@@ -73,6 +74,14 @@ type UpdateItemDTO struct {
|
||||
EditedField string `json:"edited_field"` // "quantity", "price", "sum"
|
||||
}
|
||||
|
||||
// ReorderItemsRequest DTO для переупорядочивания нескольких элементов
|
||||
type ReorderItemsRequest struct {
|
||||
Items []struct {
|
||||
ID string `json:"id"`
|
||||
Order int `json:"order"`
|
||||
} `json:"items"`
|
||||
}
|
||||
|
||||
func (h *DraftsHandler) AddDraftItem(c *gin.Context) {
|
||||
draftID, err := uuid.Parse(c.Param("id"))
|
||||
if err != nil {
|
||||
@@ -303,14 +312,9 @@ func (h *DraftsHandler) DeleteDraft(c *gin.Context) {
|
||||
c.JSON(http.StatusOK, gin.H{"status": newStatus, "id": id.String()})
|
||||
}
|
||||
|
||||
// ReorderItems изменяет порядок позиции в черновике
|
||||
// ReorderItems изменяет порядок нескольких позиций в черновике
|
||||
func (h *DraftsHandler) ReorderItems(c *gin.Context) {
|
||||
type ReorderRequest struct {
|
||||
ItemID uuid.UUID `json:"item_id" binding:"required"`
|
||||
NewOrder int `json:"new_order" binding:"required"`
|
||||
}
|
||||
|
||||
var req ReorderRequest
|
||||
var req ReorderItemsRequest
|
||||
if err := c.ShouldBindJSON(&req); err != nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
||||
return
|
||||
@@ -323,7 +327,27 @@ func (h *DraftsHandler) ReorderItems(c *gin.Context) {
|
||||
return
|
||||
}
|
||||
|
||||
if err := h.service.ReorderItem(draftID, req.ItemID, req.NewOrder); err != nil {
|
||||
// Преобразуем элементы в формат для сервиса
|
||||
items := make([]struct {
|
||||
ID uuid.UUID
|
||||
Order int
|
||||
}, len(req.Items))
|
||||
for i, item := range req.Items {
|
||||
id, err := uuid.Parse(item.ID)
|
||||
if err != nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": fmt.Sprintf("invalid item id: %s", item.ID)})
|
||||
return
|
||||
}
|
||||
items[i] = struct {
|
||||
ID uuid.UUID
|
||||
Order int
|
||||
}{
|
||||
ID: id,
|
||||
Order: item.Order,
|
||||
}
|
||||
}
|
||||
|
||||
if err := h.service.ReorderItems(draftID, items); err != nil {
|
||||
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
|
||||
return
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user