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

508 lines 20.5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.NodeListSearch = exports.NodeLoadOptions = void 0; const api_helper_1 = require("./api.helper"); class NodeLoadOptions { /** * Lädt alle verfügbaren Tabellen für Load Options */ static async getTables(context) { try { const tables = await api_helper_1.ApiHelper.makeApiRequest(context, 'GET', '/tables'); return tables.map((table) => ({ name: table.title || `Tabelle ${table.id}`, value: table.id.toString(), description: table.description || undefined, })); } catch (error) { return [ { name: 'Fehler beim Laden der Tabellen', value: '', description: 'Überprüfen Sie die Verbindung zu Nextcloud', }, ]; } } /** * Lädt alle verfügbaren Views einer Tabelle für Load Options */ static async getViews(context) { try { const tableId = context.getCurrentNodeParameter('tableId'); // Verbesserte Extraktion mit Validierung let extractedTableId; if (!tableId) { return [ { name: 'Keine Tabelle ausgewählt', value: '', description: 'Wählen Sie zuerst eine Tabelle aus, um Views zu laden', }, ]; } // Resource Locator Struktur if (typeof tableId === 'object' && tableId !== null) { if (tableId.__rl === true || tableId.mode) { extractedTableId = tableId.value; } else { extractedTableId = tableId; } } else { extractedTableId = tableId; } // Validierung der extrahierten ID if (!extractedTableId || extractedTableId === '' || extractedTableId === 'undefined') { return [ { name: 'Ungültige Tabellen-ID', value: '', description: 'Bitte wählen Sie eine gültige Tabelle aus', }, ]; } // Stelle sicher, dass es eine gültige Zahl ist const numericTableId = parseInt(extractedTableId, 10); if (isNaN(numericTableId) || numericTableId <= 0) { return [ { name: 'Ungültige Tabellen-ID (keine Zahl)', value: '', description: `"${extractedTableId}" ist keine gültige Tabellen-ID`, }, ]; } const views = await api_helper_1.ApiHelper.makeApiRequest(context, 'GET', `/tables/${numericTableId}/views`); return views.map((view) => ({ name: view.title || `View ${view.id}`, value: view.id.toString(), description: view.description || undefined, })); } catch (error) { return [ { name: 'Fehler beim Laden der Views', value: '', description: `Fehler: ${error.message || 'Unbekannter Fehler'}`, }, ]; } } /** * Lädt alle verfügbaren Spalten einer Tabelle für Load Options */ static async getColumns(context) { try { const tableId = context.getCurrentNodeParameter('tableId'); // Verbesserte Extraktion mit Validierung let extractedTableId; if (!tableId) { return [ { name: 'Keine Tabelle ausgewählt', value: '', description: 'Wählen Sie zuerst eine Tabelle aus, um Spalten zu laden', }, ]; } // Resource Locator Struktur if (typeof tableId === 'object' && tableId !== null) { if (tableId.__rl === true || tableId.mode) { extractedTableId = tableId.value; } else { extractedTableId = tableId; } } else { extractedTableId = tableId; } // Validierung der extrahierten ID if (!extractedTableId || extractedTableId === '' || extractedTableId === 'undefined') { return [ { name: 'Ungültige Tabellen-ID', value: '', description: 'Bitte wählen Sie eine gültige Tabelle aus', }, ]; } // Stelle sicher, dass es eine gültige Zahl ist const numericTableId = parseInt(extractedTableId, 10); if (isNaN(numericTableId) || numericTableId <= 0) { return [ { name: 'Ungültige Tabellen-ID (keine Zahl)', value: '', description: `"${extractedTableId}" ist keine gültige Tabellen-ID`, }, ]; } const columns = await api_helper_1.ApiHelper.makeApiRequest(context, 'GET', `/tables/${numericTableId}/columns`); return columns.map((column) => ({ name: column.title || `Spalte ${column.id}`, value: column.id.toString(), description: `Typ: ${column.type}`, })); } catch (error) { return [ { name: 'Fehler beim Laden der Spalten', value: '', description: `Fehler: ${error.message || 'Unbekannter Fehler'}`, }, ]; } } /** * Lädt alle verfügbaren Benutzer für Share-Empfänger */ static async getUsers(context) { try { const credentials = await context.getCredentials('nextcloudTablesApi'); const currentUser = credentials.username; const results = []; // Füge den aktuellen Benutzer immer als ersten Eintrag hinzu const currentUserDisplayName = `${currentUser} (Sie selbst)`; results.push({ name: currentUserDisplayName, value: currentUser }); try { // Verwende den Sharee-Endpunkt, um weitere Benutzer zu suchen const searchTerm = ''; const endpoint = `/sharees?search=${encodeURIComponent(searchTerm)}&itemType=0&perPage=50`; const response = await api_helper_1.ApiHelper.nextcloudShareeApiRequest(context, 'GET', endpoint); const shareeData = response; if (shareeData.users && shareeData.users.length > 0) { // Füge Sharee-Benutzer hinzu (aber nicht den aktuellen Benutzer doppelt) for (const user of shareeData.users) { if (user.value.shareWith !== currentUser) { results.push({ name: user.value.shareWithDisplayName || user.value.shareWith, value: user.value.shareWith, }); } } } } catch (shareeError) { // Fallback: Verwende OCS Users API, wenn Sharee API fehlschlägt try { const usersResponse = await api_helper_1.ApiHelper.nextcloudOcsUsersApiRequest(context, 'GET', '/users'); const usersData = usersResponse; if (usersData.users && usersData.users.length > 0) { // Füge alle Benutzer hinzu (aber nicht den aktuellen Benutzer doppelt) for (const userId of usersData.users) { if (userId !== currentUser) { results.push({ name: userId, value: userId, }); } } } } catch (usersError) { // Stille Fehlerbehandlung - zeige nur aktuellen Benutzer } } // Entferne Duplikate und begrenze auf 50 Ergebnisse const uniqueResults = results.filter((result, index, self) => index === self.findIndex(r => r.value === result.value)).slice(0, 50); return uniqueResults; } catch (error) { return [ { name: 'Fehler beim Laden der Benutzer', value: '', description: 'Überprüfen Sie die Berechtigung zur Benutzerliste', }, ]; } } /** * Lädt alle verfügbaren Gruppen für Share-Empfänger */ static async getGroups(context) { try { const results = []; try { // Verwende den Sharee-Endpunkt, um Gruppen zu suchen const searchTerm = ''; const endpoint = `/sharees?search=${encodeURIComponent(searchTerm)}&itemType=1&perPage=50`; const response = await api_helper_1.ApiHelper.nextcloudShareeApiRequest(context, 'GET', endpoint); const shareeData = response; if (shareeData.groups && shareeData.groups.length > 0) { for (const group of shareeData.groups) { results.push({ name: group.value.shareWithDisplayName || group.value.shareWith, value: group.value.shareWith, }); } } } catch (shareeError) { // Fallback: Verwende OCS Groups API, wenn Sharee API fehlschlägt try { const groupsResponse = await api_helper_1.ApiHelper.nextcloudOcsUsersApiRequest(context, 'GET', '/groups'); const groupsData = groupsResponse; if (groupsData.groups && groupsData.groups.length > 0) { for (const groupId of groupsData.groups) { results.push({ name: groupId, value: groupId, }); } } } catch (groupsError) { // Stille Fehlerbehandlung } } // Entferne Duplikate und begrenze auf 50 Ergebnisse const uniqueResults = results.filter((result, index, self) => index === self.findIndex(r => r.value === result.value)).slice(0, 50); return uniqueResults; } catch (error) { return [ { name: 'Fehler beim Laden der Gruppen', value: '', description: 'Überprüfen Sie die Berechtigung zur Gruppenliste', }, ]; } } /** * Lädt Benutzer und Gruppen kombiniert für Share-Empfänger */ static async getShareReceivers(context) { try { const shareType = context.getCurrentNodeParameter('shareType'); if (shareType === 'user') { return this.getUsers(context); } else if (shareType === 'group') { return this.getGroups(context); } else { // Fallback: Beide laden const [users, groups] = await Promise.all([ this.getUsers(context), this.getGroups(context) ]); return [ ...users.map(user => ({ ...user, description: '👤 ' + (user.description || 'Benutzer') })), ...groups.map(group => ({ ...group, description: '👥 ' + (group.description || 'Gruppe') })) ]; } } catch (error) { return [ { name: 'Fehler beim Laden der Empfänger', value: '', description: 'Überprüfen Sie die Berechtigung', }, ]; } } } exports.NodeLoadOptions = NodeLoadOptions; class NodeListSearch { /** * Durchsucht Tabellen für List Search */ static async getTables(context, filter) { try { const tables = await api_helper_1.ApiHelper.makeApiRequest(context, 'GET', '/tables'); let filteredTables = tables; if (filter) { const filterLower = filter.toLowerCase(); filteredTables = tables.filter((table) => table.title?.toLowerCase().includes(filterLower) || table.description?.toLowerCase().includes(filterLower)); } return { results: filteredTables.map((table) => ({ name: table.title || `Tabelle ${table.id}`, value: table.id.toString(), description: table.description || undefined, })), }; } catch (error) { throw new Error(`Fehler beim Durchsuchen der Tabellen: ${error.message || error}`); } } /** * Durchsucht Views für List Search */ static async getViews(context, filter) { try { const tableId = context.getCurrentNodeParameter('tableId'); // Verbesserte Extraktion mit Validierung let extractedTableId; if (!tableId) { return { results: [ { name: 'Keine Tabelle ausgewählt', value: '', description: 'Wählen Sie zuerst eine Tabelle aus, um Views zu suchen', }, ], }; } // Resource Locator Struktur if (typeof tableId === 'object' && tableId !== null) { if (tableId.__rl === true || tableId.mode) { extractedTableId = tableId.value; } else { extractedTableId = tableId; } } else { extractedTableId = tableId; } // Validierung der extrahierten ID if (!extractedTableId || extractedTableId === '' || extractedTableId === 'undefined') { return { results: [ { name: 'Ungültige Tabellen-ID', value: '', description: 'Bitte wählen Sie eine gültige Tabelle aus', }, ], }; } // Stelle sicher, dass es eine gültige Zahl ist const numericTableId = parseInt(extractedTableId, 10); if (isNaN(numericTableId) || numericTableId <= 0) { return { results: [ { name: 'Ungültige Tabellen-ID (keine Zahl)', value: '', description: `"${extractedTableId}" ist keine gültige Tabellen-ID`, }, ], }; } const views = await api_helper_1.ApiHelper.makeApiRequest(context, 'GET', `/tables/${numericTableId}/views`); let filteredViews = views; if (filter) { const filterLower = filter.toLowerCase(); filteredViews = views.filter((view) => view.title?.toLowerCase().includes(filterLower) || view.description?.toLowerCase().includes(filterLower)); } return { results: filteredViews.map((view) => ({ name: view.title || `View ${view.id}`, value: view.id.toString(), description: view.description || undefined, })), }; } catch (error) { return { results: [ { name: 'Fehler beim Durchsuchen der Views', value: '', description: `Fehler: ${error.message || 'Unbekannter Fehler'}`, }, ], }; } } /** * Durchsucht Spalten für List Search */ static async getColumns(context, filter) { try { const tableId = context.getCurrentNodeParameter('tableId'); // Verbesserte Extraktion mit Validierung let extractedTableId; if (!tableId) { return { results: [ { name: 'Keine Tabelle ausgewählt', value: '', description: 'Wählen Sie zuerst eine Tabelle aus, um Spalten zu suchen', }, ], }; } // Resource Locator Struktur if (typeof tableId === 'object' && tableId !== null) { if (tableId.__rl === true || tableId.mode) { extractedTableId = tableId.value; } else { extractedTableId = tableId; } } else { extractedTableId = tableId; } // Validierung der extrahierten ID if (!extractedTableId || extractedTableId === '' || extractedTableId === 'undefined') { return { results: [ { name: 'Ungültige Tabellen-ID', value: '', description: 'Bitte wählen Sie eine gültige Tabelle aus', }, ], }; } // Stelle sicher, dass es eine gültige Zahl ist const numericTableId = parseInt(extractedTableId, 10); if (isNaN(numericTableId) || numericTableId <= 0) { return { results: [ { name: 'Ungültige Tabellen-ID (keine Zahl)', value: '', description: `"${extractedTableId}" ist keine gültige Tabellen-ID`, }, ], }; } const columns = await api_helper_1.ApiHelper.makeApiRequest(context, 'GET', `/tables/${numericTableId}/columns`); let filteredColumns = columns; if (filter) { const filterLower = filter.toLowerCase(); filteredColumns = columns.filter((column) => column.title?.toLowerCase().includes(filterLower) || column.type?.toLowerCase().includes(filterLower)); } return { results: filteredColumns.map((column) => ({ name: column.title || `Spalte ${column.id}`, value: column.id.toString(), description: `Typ: ${column.type}`, })), }; } catch (error) { return { results: [ { name: 'Fehler beim Durchsuchen der Spalten', value: '', description: `Fehler: ${error.message || 'Unbekannter Fehler'}`, }, ], }; } } } exports.NodeListSearch = NodeListSearch; //# sourceMappingURL=node.methods.js.map