Задача: SitePack Importer
Цель
Импортировать данные из распакованного пакета SitePack в целевую систему.
Входные данные
Путь к распакованному пакету (каталогу).
Требования
- Прочитать
sitepack.manifest.jsonиsitepack.catalog.json. - Определить profile(s) из
manifest.profiles. - Обработать артефакты из каталога:
- для известных
mediaTypeвыполнить импорт; - неизвестные
mediaTypeMUST пропускаться и логироваться.
- для известных
- Неизвестный
entity.typeMUST NOT приводить к падению; MAY импортироваться как opaque. - Учитывать
applyPolicyдля config, напримерneverне применяется автоматически. - Если существует поддерживаемый
Transform Plan, MAY применить шаги по порядку. - Обеспечить безопасность путей: без traversal, absolute paths и null bytes.
- Если передан дескриптор
sitepack.volumes.json, проверить его, проверитьsha256/sizeкаждого тома и собрать тома во временный каталог перед импортом. - Если запись тома использует
encryption.scheme = "age", импортер MUST использовать указанный envelope header, чтобы найти зашифрованный payload и расшифровать его перед сборкой, либо завершиться понятной ошибкой, если это не поддерживается.
Chunked assets
- Записи asset index могут быть single-blob (
path) или chunked (chunks[]). - Для chunked assets восстановить asset конкатенацией чанков по возрастанию
index. - Импортеры MUST проверять
sha256/sizeкаждого чанка и общийsha256/sizeasset.
Relations
- Импортеры SHOULD использовать двухпроходную стратегию:
- создать сущности или placeholders и построить mapping
sitepackEntityId -> targetSystemId; - разрешить и применить связи через этот mapping.
- создать сущности или placeholders и построить mapping
- Если Link не удалось разрешить, это MUST быть записано как warning и MUST NOT быть fatal.
Выходные данные
Создать reports/import.json минимум со структурой:
{
"packageId": "...",
"profiles": ["..."],
"imported": {
"entities": 0,
"assets": 0,
"config": 0,
"recordsets": 0
},
"skipped": {
"unknownMediaTypes": 0,
"unknownEntityTypes": 0
},
"warnings": [],
"errors": []
}