Предметная модель
Это целевая модель. Первое ядро реализует неизменяемый descriptor и Upload с состояниями pending/available/cancelled; таблицы описаны в миграциях infrastructure. Остальные сущности ниже запланированы.
| Объект | Идентичность и назначение |
|---|---|
| Repository | Область доступа, квот и политики хранения |
| PackageVersion | repository + group + name + version, исходный UPack |
| AssetRevision | Неизменяемая ревизия содержимого обычного файла |
| Asset | Логический путь, указывающий на текущую ревизию |
| Blob | Внутренний ID, backend, размер, SHA-256, состояние целостности |
| MetadataSchema | Типы и ограничения расширяемых полей |
| Label | Маркировка, не заменяющая ACL |
| Collection | Логическая подборка объектов без копирования байтов |
| UploadSession | Принятые части, резерв места, срок действия и состояние |
| TransferJob | Намерение передачи, приоритет, очередь, допуск и lease |
| ExternalReference | Защитная ссылка продукта/внешнего потребителя на версию |
Инварианты
- Опубликованный blob неизменяем и доступен только после проверки целостности и фиксации публикации.
- Asset перезаписывается сменой ревизии; активное скачивание закреплено за конкретным blob.
- Group входит в идентичность UPack. Нельзя схлопывать разные группы по одному имени пакета.
- Исходный upack.json и исходные байты сохраняются. Изменение меток каталога не меняет архив.
- Поля approve/promote изменяются по отдельным правам, а не любым загрузившим файл.
- Ссылки, активные передачи и точки восстановления защищают blob от физической очистки.
- Повтор завершения одной загрузки возвращает тот же результат; противоречивый повтор не считается успешной идемпотентностью.
- Квоты и лимиты рассчитываются до приёма данных и учитывают staging/сборку частей.
Метаданные
Разделяем оригинальные поля UPack, редактируемые свойства каталога и управляемые статусы. Схемы имеют ограничения размера, глубины и числа индексов. Поиск и подборки учитывают доступ к каждому объекту.
Нормализация регистра, поддержка версий и коллизии путей фиксируются собственным контрактом каталога до импорта данных. В домене нельзя использовать случайную сортировку строк как SemVer/latest.
Состояния
Предварительный путь загрузки: queued → reserved → uploading → verifying → available; terminal-состояния failed/cancelled/expired. Условия переходов и действия после сбоя уточняются с первым upload use case.
Не моделируйте все поля как необязательные свойства одного объекта. Используйте различимые состояния с обязательными данными для каждого состояния и явными переходами.