UNPKG

n8n-nodes-netbox

Version:

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

228 lines (227 loc) 10.5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.listRouteTargets = listRouteTargets; exports.getRouteTarget = getRouteTarget; exports.createRouteTarget = createRouteTarget; exports.updateRouteTarget = updateRouteTarget; exports.deleteRouteTarget = deleteRouteTarget; const apiRequest_1 = require("../../../helpers/apiRequest"); const responseFormatter_1 = require("../../../helpers/responseFormatter"); const resourceLookup_1 = require("../../../helpers/resourceLookup"); async function listRouteTargets() { const returnAll = this.getNodeParameter('returnAll', 0); const filters = this.getNodeParameter('filters', 0, {}); const qs = {}; Object.assign(qs, filters); if (returnAll) { const response = await apiRequest_1.apiRequestAllItems.call(this, 'GET', '/api/ipam/route-targets/', {}, qs); return responseFormatter_1.formatResponse.call(this, response); } else { const limit = this.getNodeParameter('limit', 0); qs.limit = limit; const response = await apiRequest_1.apiRequest.call(this, 'GET', '/api/ipam/route-targets/', {}, qs); return responseFormatter_1.formatResponse.call(this, response); } } async function getRouteTarget() { const routeTargetIdentifier = this.getNodeParameter('routeTargetId', 0); try { // If numeric, assume it's an ID and fetch directly if (!isNaN(Number(routeTargetIdentifier))) { const endpoint = `/api/ipam/route-targets/${routeTargetIdentifier}/`; const response = await apiRequest_1.apiRequest.call(this, 'GET', endpoint); return responseFormatter_1.formatResponse.call(this, response); } // Try lookup by name let endpoint = '/api/ipam/route-targets/'; let query = { name: routeTargetIdentifier }; let response = await apiRequest_1.apiRequest.call(this, 'GET', endpoint, {}, query); // If no results, try contains search if (!response.results || response.results.length === 0) { query = { name__ic: routeTargetIdentifier }; response = await apiRequest_1.apiRequest.call(this, 'GET', endpoint, {}, query); } // If still no results, throw error if (!response.results || response.results.length === 0) { throw new Error(`Route Target with identifier "${routeTargetIdentifier}" not found`); } // Return the first matching result return responseFormatter_1.formatResponse.call(this, response.results[0]); } catch (error) { throw new Error(`Failed to get Route Target: ${error.message}`); } } async function createRouteTarget() { const name = this.getNodeParameter('routeTargetName', 0); const additionalFields = this.getNodeParameter('additionalFields', 0, {}); const body = { name, }; try { // Process tenant lookup if (additionalFields.tenant && !isNaN(Number(additionalFields.tenant))) { // Already a number, use as-is } else if (additionalFields.tenant) { try { additionalFields.tenant = await resourceLookup_1.lookupResourceByName.call(this, 'tenants', additionalFields.tenant, 'tenancy'); } catch (error) { throw new Error(`Tenant lookup failed: ${error.message}`); } } // Process tags if they're provided as a string if (additionalFields.tags && typeof additionalFields.tags === 'string') { try { const tagIds = []; const tagNames = additionalFields.tags.split(',').map((tag) => tag.trim()); for (const tagName of tagNames) { if (!isNaN(Number(tagName))) { tagIds.push(Number(tagName)); } else { const tagId = await resourceLookup_1.lookupResourceByName.call(this, 'tags', tagName, 'extras'); tagIds.push(tagId); } } additionalFields.tags = tagIds; } catch (error) { throw new Error(`Tag lookup failed: ${error.message}`); } } // Parse custom_fields if it's a string if (additionalFields.custom_fields && typeof additionalFields.custom_fields === 'string') { try { additionalFields.custom_fields = JSON.parse(additionalFields.custom_fields); } catch (e) { throw new Error(`Invalid JSON in custom_fields: ${e.message}`); } } // Transform prefixed field names to API field names if (additionalFields.routeTargetDescription) { additionalFields.description = additionalFields.routeTargetDescription; delete additionalFields.routeTargetDescription; } // Add all additional fields to the request body Object.assign(body, additionalFields); const endpoint = '/api/ipam/route-targets/'; const response = await apiRequest_1.apiRequest.call(this, 'POST', endpoint, body); return responseFormatter_1.formatResponse.call(this, response); } catch (error) { throw new Error(`Failed to create Route Target: ${error.message}`); } } async function updateRouteTarget() { const routeTargetIdentifier = this.getNodeParameter('routeTargetId', 0); const updateFields = this.getNodeParameter('updateFields', 0, {}); try { // Get Route Target ID if name was provided let routeTargetId = routeTargetIdentifier; if (isNaN(Number(routeTargetIdentifier))) { // Try to find route target by name const endpoint = '/api/ipam/route-targets/'; // Try name first let query = { name: routeTargetIdentifier }; let response = await apiRequest_1.apiRequest.call(this, 'GET', endpoint, {}, query); // If no results, try name contains if (!response.results || response.results.length === 0) { query = { name__ic: routeTargetIdentifier }; response = await apiRequest_1.apiRequest.call(this, 'GET', endpoint, {}, query); } if (!response.results || response.results.length === 0) { throw new Error(`Route Target with identifier "${routeTargetIdentifier}" not found`); } routeTargetId = response.results[0].id; } // Process tenant lookup if (updateFields.tenant && !isNaN(Number(updateFields.tenant))) { // Already a number, use as-is } else if (updateFields.tenant) { try { updateFields.tenant = await resourceLookup_1.lookupResourceByName.call(this, 'tenants', updateFields.tenant, 'tenancy'); } catch (error) { throw new Error(`Tenant lookup failed: ${error.message}`); } } // Process tags if they're provided as a string if (updateFields.tags && typeof updateFields.tags === 'string') { try { const tagIds = []; const tagNames = updateFields.tags.split(',').map((tag) => tag.trim()); for (const tagName of tagNames) { if (!isNaN(Number(tagName))) { tagIds.push(Number(tagName)); } else { const tagId = await resourceLookup_1.lookupResourceByName.call(this, 'tags', tagName, 'extras'); tagIds.push(tagId); } } updateFields.tags = tagIds; } catch (error) { throw new Error(`Tag lookup failed: ${error.message}`); } } // Parse custom_fields if it's a string if (updateFields.custom_fields && typeof updateFields.custom_fields === 'string') { try { updateFields.custom_fields = JSON.parse(updateFields.custom_fields); } catch (e) { throw new Error(`Invalid JSON in custom_fields: ${e.message}`); } } // Transform prefixed field names to API field names if (updateFields.routeTargetName) { updateFields.name = updateFields.routeTargetName; delete updateFields.routeTargetName; } if (updateFields.routeTargetDescription) { updateFields.description = updateFields.routeTargetDescription; delete updateFields.routeTargetDescription; } const endpoint = `/api/ipam/route-targets/${routeTargetId}/`; const response = await apiRequest_1.apiRequest.call(this, 'PATCH', endpoint, updateFields); return responseFormatter_1.formatResponse.call(this, response); } catch (error) { throw new Error(`Failed to update Route Target: ${error.message}`); } } async function deleteRouteTarget() { const routeTargetIdentifier = this.getNodeParameter('routeTargetId', 0); try { // Get Route Target ID if name was provided let routeTargetId = routeTargetIdentifier; if (isNaN(Number(routeTargetIdentifier))) { // Try to find route target by name const endpoint = '/api/ipam/route-targets/'; // Try name first let query = { name: routeTargetIdentifier }; let response = await apiRequest_1.apiRequest.call(this, 'GET', endpoint, {}, query); // If no results, try name contains if (!response.results || response.results.length === 0) { query = { name__ic: routeTargetIdentifier }; response = await apiRequest_1.apiRequest.call(this, 'GET', endpoint, {}, query); } if (!response.results || response.results.length === 0) { throw new Error(`Route Target with identifier "${routeTargetIdentifier}" not found`); } routeTargetId = response.results[0].id; } const endpoint = `/api/ipam/route-targets/${routeTargetId}/`; await apiRequest_1.apiRequest.call(this, 'DELETE', endpoint); return [{ json: { success: true } }]; } catch (error) { throw new Error(`Failed to delete Route Target: ${error.message}`); } }