ultisuite-backend/internal/api/mail/reorder.go
2026-05-24 00:03:36 +02:00

132 lines
2.9 KiB
Go

package mail
import (
"context"
"strings"
"github.com/jackc/pgx/v5"
)
type reorderLabelItem struct {
ID string `json:"id"`
SortOrder int `json:"sort_order"`
}
type reorderLabelsRequest struct {
Items []reorderLabelItem `json:"items"`
}
type reorderUnifiedFolderItem struct {
ID string `json:"id"`
SortOrder int `json:"sort_order"`
ParentID *string `json:"parent_id"`
}
type reorderUnifiedFoldersRequest struct {
Items []reorderUnifiedFolderItem `json:"items"`
}
func (s *Service) ReorderUserLabels(ctx context.Context, externalID string, req *reorderLabelsRequest) error {
if len(req.Items) == 0 {
return nil
}
userID, err := s.ResolveUserID(ctx, externalID)
if err != nil {
return err
}
tx, err := s.db.Begin(ctx)
if err != nil {
return err
}
defer tx.Rollback(ctx)
for _, item := range req.Items {
id := strings.TrimSpace(item.ID)
if id == "" {
continue
}
tag, err := tx.Exec(ctx, `
UPDATE mail_user_labels SET sort_order = $1
WHERE id = $2 AND user_id = $3
`, item.SortOrder, id, userID)
if err != nil {
return err
}
if tag.RowsAffected() == 0 {
return ErrNotFound
}
}
return tx.Commit(ctx)
}
func (s *Service) ReorderUnifiedFolders(ctx context.Context, externalID string, req *reorderUnifiedFoldersRequest) error {
if len(req.Items) == 0 {
return nil
}
userID, err := s.ResolveUserID(ctx, externalID)
if err != nil {
return err
}
tx, err := s.db.Begin(ctx)
if err != nil {
return err
}
defer tx.Rollback(ctx)
for _, item := range req.Items {
id := strings.TrimSpace(item.ID)
if id == "" {
continue
}
var parentArg any
if item.ParentID != nil {
parentID := strings.TrimSpace(*item.ParentID)
if parentID != "" {
parentArg = parentID
var parentAccountID *string
if err := tx.QueryRow(ctx, `
SELECT account_id FROM mail_unified_folders WHERE id = $1 AND user_id = $2
`, parentID, userID).Scan(&parentAccountID); err != nil {
if err == pgx.ErrNoRows {
return ErrNotFound
}
return err
}
var folderAccountID *string
if err := tx.QueryRow(ctx, `
SELECT account_id FROM mail_unified_folders WHERE id = $1 AND user_id = $2
`, id, userID).Scan(&folderAccountID); err != nil {
if err == pgx.ErrNoRows {
return ErrNotFound
}
return err
}
if (folderAccountID == nil) != (parentAccountID == nil) {
return ErrInvalidFolderScope
}
if folderAccountID != nil && parentAccountID != nil && *folderAccountID != *parentAccountID {
return ErrInvalidFolderScope
}
}
}
tag, err := tx.Exec(ctx, `
UPDATE mail_unified_folders SET
sort_order = $1,
parent_id = $2,
updated_at = NOW()
WHERE id = $3 AND user_id = $4
`, item.SortOrder, parentArg, id, userID)
if err != nil {
return err
}
if tag.RowsAffected() == 0 {
return ErrNotFound
}
}
return tx.Commit(ctx)
}