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
JavaScript
;
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}`);
}
}