UNPKG

n8n-nodes-netbox

Version:

n8n community node for NetBox API integration with comprehensive DCIM, IPAM, and data center management operations

81 lines (80 loc) 3.24 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.lookupResourceByName = lookupResourceByName; exports.resolveTenantId = resolveTenantId; const apiRequest_1 = require("./apiRequest"); /** * Look up a resource by name or slug when ID is not provided */ async function lookupResourceByName(resourceType, identifier, domain = 'ipam') { // Skip lookup if it's already a number (ID) if (!isNaN(Number(identifier))) { return Number(identifier); } // Determine which field to query (name or slug) let lookupField = 'name'; // For some resources, we might want to try slug first if (['roles', 'vlan-groups'].includes(resourceType)) { lookupField = 'slug'; } // Construct endpoint const endpoint = `/api/${domain}/${resourceType}/`; // Try exact match first const query = {}; query[lookupField] = identifier; try { const response = await apiRequest_1.apiRequest.call(this, 'GET', endpoint, {}, query); if (response.results && response.results.length > 0) { return response.results[0].id; } // If not found by exact match, try a contains search if (lookupField === 'name') { query[`${lookupField}__ic`] = identifier; delete query[lookupField]; const containsResponse = await apiRequest_1.apiRequest.call(this, 'GET', endpoint, {}, query); if (containsResponse.results && containsResponse.results.length > 0) { return containsResponse.results[0].id; } } // If not found by name, try slug if lookupField was name if (lookupField === 'name') { const slugQuery = { slug: identifier }; const slugResponse = await apiRequest_1.apiRequest.call(this, 'GET', endpoint, {}, slugQuery); if (slugResponse.results && slugResponse.results.length > 0) { return slugResponse.results[0].id; } } throw new Error(`Could not find ${resourceType} with ${lookupField} "${identifier}"`); } catch (error) { throw new Error(`Error looking up ${resourceType}: ${error.message}`); } } /** * Resolve tenant name/slug to tenant ID */ async function resolveTenantId(tenantInput) { if (!tenantInput) { return null; } // If it's already a number, return it if (typeof tenantInput === 'number') { return tenantInput; } // If it's a string that can be parsed as a number, treat it as ID const possibleId = parseInt(tenantInput.toString(), 10); if (!isNaN(possibleId) && possibleId.toString() === tenantInput.toString().trim()) { return possibleId; } // Use the existing lookupResourceByName function for tenants try { console.log(`Looking up tenant: ${tenantInput}`); const tenantId = await lookupResourceByName.call(this, 'tenants', tenantInput.toString(), 'tenancy'); console.log(`Found tenant ID: ${tenantId}`); return tenantId; } catch (error) { console.log(`Error resolving tenant: ${error.message}`); throw new Error(`Failed to resolve tenant "${tenantInput}": ${error.message}`); } }