132 lines
2.9 KiB
Go
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)
|
|
}
|