UNPKG

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
"use strict"; 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