Skip to content

Таб импорта в драйверах

Суть импорта драйвера заключается в том, чтобы загрузить файл .csv, строго оределенного формата для каждого драйвера, распарсить информацию, заключенную в нем, и, на основе этой информации, создать папки и в ней же объекты. Данные объекты, уже на этапе создания привязываются в driverLinks к драйверу в который импортируются. Также действует механизм обновления уже существующих объектов. Обновляться объекты могут, либо id, с обязательным условием, что объект должен находиться в том же ПРОЕКТЕ, либо по name + description, с обязательным условием, что объект находиться в папке с тем же названием что указанно в импортируемом файле. По части создания/обновления объектов, поведение всех видов драйвер-импортов одинаковы. Реализована данная унификация через паттерн стратегий.

Интерфейс стратегии

ts
export interface IImportStrategy {
  readonly objectType: EObjectType;
  [key: string]: any;

  // Фильтрация валидных строк CSV
  filterValidRows(data: any[]): any[];

  // Маппинг CSV в объект для создания/обновления
  mapCSVToObject(params: {
    csv: ICSVObject; // Конкретная строка из таблицы, преобразованная в объект
    parentId?: string; // id ПАПКИ в которой мы создаем/обновляем объекты
    projectId?: string; // id ПРОЕКТА в котором мы создаем объекты
    position?: number; // Позиция в дереве. Если ее не указать при создании - ничего не увидим
    additionalInfo?: Record<string, any>; // Данные которые находяться вне таблицы. Данные которые нужны для всех объектов. Пример: IP, PORT
    currentObject: ConcreteObjectInstance & IHasDriverSettings; // Текущий драйвер
    tags: { name: any; id: any }[]; // Теги прошедшие парс
  }): any | null;

  // Извлечение дополнительной информации из заголовков CSV
  extractAdditionalInfo(lines: string[][]): Record<string, any>;

  // Опциональные методы - каждый драйвер реализует только то, что нужно
  processTags?(data: any[]): Promise<string[]>;
  updateDriverData?(params: {
    selectedFile: any;
    additionalInfo: Record<string, any>;
    currentObject: any;
  }): Promise<Record<string, any>>;
  getMandatoryKeys?(): string[];
}

Mentioned In