UploadLayoutPanoramaImageCommand
Назначение
Загрузка изображения панорамы (кубмап) для точки съёмки на планировке по заданному пресету. Создаётся или обновляется запись LayoutPanoramaPointFileEntity с идентификаторами файлов граней кубмапа.
Цель
Сохранить привязку загруженных файлов (по граням кубмапа) к точке и пресету для планировки.
Command: UploadLayoutPanoramaImageCommand (Входные данные)
| Поле | Тип | Обязательность | Описание |
|---|---|---|---|
| PointId | Guid | Обязательное | Идентификатор точки съёмки |
| PresetId | Guid | Обязательное | Идентификатор пресета |
| ImageFileIds | CubemapFileIds или аналогичная модель | Обязательное | Идентификаторы файлов граней (PositiveX, NegativeX, PositiveY, NegativeY, PositiveZ, NegativeZ) |
примечание
TenantId берётся из контекста запроса.
Result: UploadLayoutPanoramaImageCommandResult (Выходные данные)
| Поле | Тип | Обязательность | Описание |
|---|---|---|---|
| FileId | Guid | Обязательное | Идентификатор записи файла панорамы (LayoutPanoramaPointFileEntity.Id) |
Валидация
- Точка съёмки с PointId должна существовать в PanoramaShootingPointEntity. Получить по Id из БД; если не найдена — вернуть ошибку.
- Планировка, к которой привязана точка, должна существовать. Проверка через связь Point → PropertyLayoutId.
Ограничения
- Одна комбинация (PointId, PresetId) для планировки может иметь одну запись файла (создание или обновление при повторной загрузке).
Бизнес-логика (Handler)
- Провалидировать зависимости: получить PanoramaShootingPointEntity по PointId. Если не найдена — вернуть ошибку «Точка не найдена».
- Получить PropertyLayoutId из точки. Проверить существование ChessboardProjectPropertyLayoutEntity. Если не найдена — вернуть ошибку.
- Найти существующую запись LayoutPanoramaPointFileEntity по PointId и PresetId (и TenantId). Если найдена — обновить поле Image (грани кубмапа) из ImageFileIds. Если не найдена — создать новую запись LayoutPanoramaPointFileEntity с PointId, PresetId, PropertyLayoutId, Image = данные из ImageFileIds.
- Сохранить в БД.
- Сформировать результат (FileId = Id записи). Вернуть результат клиенту.
События
Могут публиковаться уведомления о загрузке файлов (AfterFileUploaded) для запуска саги обработки файлов. См. AfterFileUploaded, FileUpload Saga.
Связанные сущности
API
PanoramaPointsController.UploadLayoutPanoramaImage — POST points/{pointId}/presets/{presetId}/upload-layout-image