📝 Kafka Transfer Request copy/move/sync → validation → availability → execution
operation source destinations strategy
Обязательные поля
  • operation: copy | move | sync
  • source: {type?, id/device, path} (источник всегда конкретный)
  • destinations (опционально): массив назначений {type,id,path}. Если не указано — DFMS выберет назначение по внутренним правилам.
  • Все пути — относительные (без ведущего /)
Опции
  • strategy: max_free_space/max_space | first_available | round_robin | fill_sequentially
  • priority: целое число
  • tags: массив строк (существующие теги будут присвоены)
  • callbackUrl/callback: http(s)://...
  • kafkaTopic/kafka_topic: топик для уведомлений о прогрессе/статусе
Пример сообщения
{
		  "operation": "copy",
		  "source": { "type": "usb", "id": "04-1671", "path": "PROJECT_001" },
		  "destinations": [
		    { "type": "storage", "id": "TS1", "path": "kafka/inbox" }
		  ],
		  "strategy": "first_available",
		  "priority": 100,
		  "tags": ["needs-processing"],
		  "callbackUrl": "https://example.local/dfms/callback",
		  "kafkaTopic": "ops_status_custom"
		}
Пример без destinations (внутренние правила)
{
		  "operation": "copy",
		  "source": { "device": "04-1671", "path": "PROJECT_001" },
		  "priority": 100,
		  "tags": ["needs-processing"],
		  "callback": "https://example.local/dfms/callback",
		  "kafka_topic": "ops_status_custom"
		}
Пример callback/отчёта (что DFMS отправит в callbackUrl / kafkaTopic)
{
		  "event": "transfer_progress",
		  "timestamp": "2026-02-02T10:30:00+03:00",
		  "station_id": "P100",
		  "job_id": 123,
		  "folder": {
		    "id": 6180,
		    "name": "PROJECT_001",
		    "tags": [1, 2],
		    "tags_names": ["needs-processing", "processed"]
		  },
		  "source_path": "/media/konstantin/04-1671/PROJECT_001",
		  "dest_path": "/media/konstantin/disk_3_tb/test_storage_1/kafka/inbox/PROJECT_001",
		  "operation_type": "copy",
		  "target": { "name": "Тестовое Хранилище 1", "type": "storage" },
		  "progress": 42.5,
		  "total_size": 123456789,
		  "transferred_size": 52428800,
		  "files_count": 23,
		  "status": "running",
		  "error_message": "",
		  "kafka": { "message_id": 999, "topic": "DFMS-CONSUMER", "partition": 0, "offset": 123, "key": "dfms-test-1700000000000-abcd" }
		}
🧩 Правила обработки (legacy) нужны только для сообщений НЕ в формате Transfer Request
Если вы отправляете сообщения в формате Transfer Request (operation/source/destinations), эти правила не используются — сообщение само описывает задание. Правила ниже нужны, когда вы читаете “произвольные” сообщения и хотите сопоставить их с TransferRule / тегами / callbacks.