n8n-nodes-nextcloud-tables
Version:
Production-Ready n8n Node für Nextcloud Tables - Vollständige API-Abdeckung mit erweiterten Filtern, Multi-Column-Sorting, CSV-Import und professioneller Datenvalidierung
176 lines • 6.78 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.ImportHandler = void 0;
const api_helper_1 = require("../helpers/api.helper");
class ImportHandler {
static async execute(context, operation, itemIndex) {
switch (operation) {
case 'importCsv':
return this.importCsv(context, itemIndex);
case 'getImportStatus':
return this.getImportStatus(context, itemIndex);
default:
throw new Error(`Unbekannte Operation: ${operation}`);
}
}
/**
* CSV-Datei in eine Tabelle importieren
*/
static async importCsv(context, itemIndex) {
const tableId = api_helper_1.ApiHelper.getResourceId(context.getNodeParameter('tableId', itemIndex));
const csvFile = context.getNodeParameter('csvFile', itemIndex);
const importOptions = context.getNodeParameter('importOptions', itemIndex, {});
const columnMapping = context.getNodeParameter('columnMapping.mapping', itemIndex, []);
// CSV-Datei validieren
if (!csvFile || csvFile.trim().length === 0) {
throw new Error('CSV-Datei darf nicht leer sein');
}
// Import-Body aufbauen
const body = {
file: csvFile.trim(),
};
// Import-Optionen hinzufügen
if (importOptions) {
// Header-Zeile
if (typeof importOptions.hasHeader === 'boolean') {
body.hasHeader = importOptions.hasHeader;
}
// Trennzeichen
if (importOptions.delimiter) {
if (importOptions.delimiter === 'custom' && importOptions.customDelimiter) {
body.delimiter = importOptions.customDelimiter;
}
else if (importOptions.delimiter !== 'custom') {
body.delimiter = importOptions.delimiter;
}
}
// Textqualifizierer
if (importOptions.textQualifier) {
body.textQualifier = importOptions.textQualifier;
}
// Zusätzliche Optionen
if (typeof importOptions.skipEmptyRows === 'boolean') {
body.skipEmptyRows = importOptions.skipEmptyRows;
}
if (typeof importOptions.skipInvalidRows === 'boolean') {
body.skipInvalidRows = importOptions.skipInvalidRows;
}
}
// Spalten-Mapping hinzufügen
if (columnMapping && columnMapping.length > 0) {
body.columnMapping = this.buildColumnMapping(columnMapping);
}
try {
const result = await api_helper_1.ApiHelper.makeApiRequest(context, 'POST', `/tables/${tableId}/import`, body);
return result;
}
catch (error) {
const apiError = error;
throw new Error(`Fehler beim CSV-Import: ${apiError.message}`);
}
}
/**
* Status eines Imports abrufen
*/
static async getImportStatus(context, itemIndex) {
const importId = context.getNodeParameter('importId', itemIndex);
// Import-ID validieren
if (!importId || importId.trim().length === 0) {
throw new Error('Import-ID darf nicht leer sein');
}
try {
return await api_helper_1.ApiHelper.makeApiRequest(context, 'GET', `/import/${importId.trim()}`);
}
catch (error) {
const apiError = error;
throw new Error(`Fehler beim Abrufen des Import-Status: ${apiError.message}`);
}
}
/**
* Hilfsfunktion: Spalten-Mapping aufbauen
*/
static buildColumnMapping(mappings) {
const columnMapping = {};
for (const mapping of mappings) {
if (mapping.csvColumn && mapping.tableColumn) {
const csvCol = mapping.csvColumn.trim();
const tableCol = mapping.tableColumn.trim();
if (csvCol && tableCol) {
columnMapping[csvCol] = {
targetColumn: tableCol,
dataType: mapping.dataType || 'auto',
};
}
}
}
return columnMapping;
}
/**
* Hilfsfunktion: CSV-Inhalt validieren
*/
static validateCsvContent(csvContent) {
if (!csvContent || csvContent.trim().length === 0) {
return false;
}
// Grundlegende CSV-Validierung
const lines = csvContent.trim().split('\n');
if (lines.length < 1) {
return false;
}
// Prüfen ob mindestens eine Zeile Inhalt hat
return lines.some(line => line.trim().length > 0);
}
/**
* Hilfsfunktion: Trennzeichen validieren
*/
static validateDelimiter(delimiter) {
if (!delimiter) {
return false;
}
// Erlaubte Trennzeichen
const allowedDelimiters = [',', ';', '\t', '|'];
return allowedDelimiters.includes(delimiter) || delimiter.length === 1;
}
/**
* Hilfsfunktion: Import-Optionen validieren
*/
static validateImportOptions(options) {
const errors = [];
if (options.delimiter === 'custom' && !options.customDelimiter) {
errors.push('Benutzerdefiniertes Trennzeichen muss angegeben werden');
}
if (options.customDelimiter && !this.validateDelimiter(options.customDelimiter)) {
errors.push('Ungültiges benutzerdefiniertes Trennzeichen');
}
return errors;
}
/**
* Hilfsfunktion: Spalten-Mapping validieren
*/
static validateColumnMapping(mappings) {
const errors = [];
const usedCsvColumns = new Set();
const usedTableColumns = new Set();
for (const mapping of mappings) {
if (!mapping.csvColumn || !mapping.tableColumn) {
errors.push('Alle Spalten-Zuordnungen müssen sowohl CSV- als auch Tabellen-Spalte enthalten');
continue;
}
const csvCol = mapping.csvColumn.trim();
const tableCol = mapping.tableColumn.trim();
// Prüfen auf doppelte CSV-Spalten
if (usedCsvColumns.has(csvCol)) {
errors.push(`CSV-Spalte "${csvCol}" wird mehrfach verwendet`);
}
usedCsvColumns.add(csvCol);
// Prüfen auf doppelte Tabellen-Spalten
if (usedTableColumns.has(tableCol)) {
errors.push(`Tabellen-Spalte "${tableCol}" wird mehrfach verwendet`);
}
usedTableColumns.add(tableCol);
}
return errors;
}
}
exports.ImportHandler = ImportHandler;
//# sourceMappingURL=import.handler.js.map