# Спецификация 04: ImportService и режим --mode import Источники: Ф-8.3, requirements 2.3 (коды возврата), tech-req 4.2 (`Import.Dir`/`Import.ArchiveDir` — создание при старте, недоступность фатальна), решение гейта 1.3 (атрибуция по подпапке). ## 1. Сигнатура ```csharp public (int Processed, int Failed) Run(string importDir, string archiveDir); ``` ## 2. Алгоритм 1. Каталоги: `importDir` не существует → 0/0 (нет новых файлов — успех); `archiveDir` создаётся при старте (недоступность — исключение → код 1). 2. Обход — только подпапки `importDir` (атрибуция атлету: имя папки == `athlete.name`, 🛡1; athlete не найден → все файлы папки — сбой с логом «атлет не найден»). Файлы в корне `importDir` — пропуск с логом (решение гейта 1.3). 3. Файл → маршрутизация по расширению: - `.fit` → `FitParser` + `WorkoutImporter.Import`; - `.tcx`, `.gpx` → `TcxGpxParser` + тот же импорт; - `program-import.json` → `ProgramPackageImporter.Import`; - прочие → пропуск с логом (не файл пакета — не считается сбоем). 4. Успех → перемещение в `archiveDir\<имя атлета>\`; конфликт имён — суффикс `-HHmmss`. Сбой (любое исключение файла) → файл остаётся, лог с текстом исключения, `Failed++` (🛡4 — пакет продолжается). 5. Возврат (Processed, Failed). ## 3. CLI (--mode import в Program.cs Web) - `--mode import` → `ServerConfig.Load` + проверка конфигурации: `Db.ConnectionString` обязателен, `Import.Dir` создаётся при старте (недоступность → код 1); `Import.ArchiveDir` создаётся всегда; - вызов `ImportService.Run` → вывод в stdout (файлы/итог), код: `Failed == 0` → 0, иначе 2 (requirements 2.3); - `serve`-валидация (Api.Key и пр.) в режиме import не выполняется — import работает по своей конфигурации. ## 4. Конфиг (ServerConfig) | Параметр | Умолчание | Семантика | |---|---|---| | `Import.Dir` | `data\import` (относительно exe) | папка импорта (подпапки-атлеты) | | `Import.ArchiveDir` | `data\import_done` | папка обработанных | ## 5. Инварианты 🛡 - сбой одного файла не останавливает пакет; - без ключей/паролей в логах (З-2, З-6); - изоляция: файлы папки обрабатываются только на атлета папки.