UNPKG

n8n-nodes-digital-ocean

Version:

n8n community node to work with the Digital Ocean API

425 lines 21.6 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.DigitalOcean = void 0; const n8n_workflow_1 = require("n8n-workflow"); const GenericFunctions_1 = require("./GenericFunctions"); const Descriptions_1 = require("./Descriptions"); class DigitalOcean { constructor() { this.description = { displayName: 'Digital Ocean', name: 'digitalOcean', group: ['transform'], icon: 'file:digitalocean.svg', version: 1, description: 'Digital Ocean', usableAsTool: true, defaults: { name: 'Digital Ocean', }, inputs: ["main"], outputs: ["main"], credentials: [ { name: 'digitalOceanApi', required: true, displayOptions: { show: { authentication: ['accessToken'], }, }, }, { name: 'digitalOceanOAuth2Api', required: true, displayOptions: { show: { authentication: ['oAuth2'], }, }, }, ], properties: [ { displayName: 'Authentication', name: 'authentication', type: 'options', options: [ { name: 'Access Token', value: 'accessToken', }, { name: 'OAuth2', value: 'oAuth2', }, ], default: 'accessToken', }, { displayName: 'Resource', name: 'resource', type: 'options', noDataExpression: true, options: [ { name: 'Account', value: 'account', }, { name: 'Domain', value: 'domain', }, { name: 'Droplet', value: 'droplet', }, { name: 'Event', value: 'event', }, ], default: 'account', }, ...Descriptions_1.accountDescription, ...Descriptions_1.eventDescription, ...Descriptions_1.eventFields, ...Descriptions_1.domainDescription, ...Descriptions_1.domainFields, ...Descriptions_1.dropletDescription, ...Descriptions_1.dropletFields, ], }; this.methods = { loadOptions: { async getSizes() { const returnData = []; const dropletSizes = await GenericFunctions_1.digitalOceanApiRequestAllItems.call(this, 'sizes', 'GET', 'sizes'); for (const dropletSize of dropletSizes) { const dropletSizeName = dropletSize.slug; const dropletSizeId = dropletSize.slug; returnData.push({ name: dropletSizeName, value: dropletSizeId, }); } return returnData; }, async getDistributionImages() { const returnData = []; const dropletImages = await GenericFunctions_1.digitalOceanApiRequestAllItems.call(this, 'images', 'GET', 'images?type=distribution'); for (const dropletImage of dropletImages) { const dropletImageName = dropletImage.name; const dropletImageId = dropletImage.id; returnData.push({ name: dropletImageName, value: dropletImageId, }); } return returnData; }, async getAppImages() { const returnData = []; const dropletImages = await GenericFunctions_1.digitalOceanApiRequestAllItems.call(this, 'images', 'GET', 'images?type=application'); for (const dropletImage of dropletImages) { const dropletImageName = dropletImage.name; const dropletImageId = dropletImage.id; returnData.push({ name: dropletImageName, value: dropletImageId, }); } return returnData; }, async getRegions() { const returnData = []; const regions = await GenericFunctions_1.digitalOceanApiRequestAllItems.call(this, 'regions', 'GET', 'regions'); for (const region of regions) { const regionName = region.name; const regionId = region.slug; returnData.push({ name: regionName, value: regionId, }); } return returnData; }, async getSSHKeys() { const returnData = []; const sshKeys = await GenericFunctions_1.digitalOceanApiRequestAllItems.call(this, 'ssh_keys', 'GET', 'account/keys'); for (const sshKey of sshKeys) { const sshKeyName = sshKey.name; const sshKeyId = sshKey.id; returnData.push({ name: sshKeyName, value: sshKeyId, }); } return returnData; }, async getTags() { const returnData = []; const tags = await GenericFunctions_1.digitalOceanApiRequestAllItems.call(this, 'tags', 'GET', 'tags'); for (const tag of tags) { const tagName = tag.name; const tagId = tag.name; returnData.push({ name: tagName, value: tagId, }); } return returnData; }, async getDroplets() { const returnData = []; const droplets = await GenericFunctions_1.digitalOceanApiRequestAllItems.call(this, 'droplets', 'GET', 'droplets'); for (const droplet of droplets) { const dropletName = droplet.name; const dropletId = droplet.id; returnData.push({ name: dropletName, value: dropletId, }); } return returnData; }, }, }; } async execute() { const items = this.getInputData(); const returnData = []; let responseData; for (let itemIndex = 0; itemIndex < items.length; itemIndex++) { try { const resource = this.getNodeParameter('resource', 0); const operation = this.getNodeParameter('operation', 0); if (resource === 'account') { if (operation === 'get') { responseData = await GenericFunctions_1.digitalOceanApiRequest.call(this, 'GET', 'account'); responseData = responseData.account; } } if (resource === 'event') { if (operation === 'get') { const actionId = this.getNodeParameter('eventId', itemIndex); responseData = await GenericFunctions_1.digitalOceanApiRequest.call(this, 'GET', `actions/${actionId}`); responseData = responseData.action; } if (operation === 'getMany') { const returnAll = this.getNodeParameter('returnAll', itemIndex); const qs = {}; if (returnAll) { responseData = await GenericFunctions_1.digitalOceanApiRequestAllItems.call(this, 'actions', 'GET', 'actions', {}, qs); } else { const limit = this.getNodeParameter('limit', itemIndex); qs.limit = limit; if (limit >= 200) { responseData = await GenericFunctions_1.digitalOceanApiRequestAllItems.call(this, 'actions', 'GET', 'actions', {}, qs); } else { responseData = await GenericFunctions_1.digitalOceanApiRequest.call(this, 'GET', 'actions', {}, qs); responseData = responseData.actions; } } } } if (resource === 'domain') { if (operation === 'get') { const domainName = this.getNodeParameter('domainName', itemIndex); responseData = await GenericFunctions_1.digitalOceanApiRequest.call(this, 'GET', `domains/${domainName}`); responseData = responseData.domain; } if (operation === 'getMany') { const returnAll = this.getNodeParameter('returnAll', itemIndex); const qs = {}; if (returnAll) { responseData = await GenericFunctions_1.digitalOceanApiRequestAllItems.call(this, 'domains', 'GET', 'domains', {}, qs); } else { const limit = this.getNodeParameter('limit', itemIndex); qs.limit = limit; if (limit >= 200) { responseData = await GenericFunctions_1.digitalOceanApiRequestAllItems.call(this, 'domains', 'GET', 'domains', {}, qs); } else { responseData = await GenericFunctions_1.digitalOceanApiRequest.call(this, 'GET', 'domains', {}, qs); responseData = responseData.domains; } } } if (operation === 'delete') { const domainName = this.getNodeParameter('domainName', itemIndex); responseData = await GenericFunctions_1.digitalOceanApiRequest.call(this, 'DELETE', `domains/${domainName}`); responseData = { success: true }; } if (operation === 'create') { const domainName = this.getNodeParameter('domainName', itemIndex); const ipAddress = this.getNodeParameter('ipAddress', itemIndex); const body = { name: domainName, ip_address: ipAddress, }; responseData = await GenericFunctions_1.digitalOceanApiRequest.call(this, 'POST', `domains`, body); responseData = responseData.domain; } } if (resource === 'droplet') { if (operation === 'action') { const dropletId = this.getNodeParameter('dropletId', itemIndex); const action = this.getNodeParameter('action', itemIndex); const body = { type: action, }; if (action === 'snapshot') { const snapshotName = this.getNodeParameter('snapshotName', itemIndex); body.name = snapshotName; } if (action === 'rename') { const name = this.getNodeParameter('dropletName', itemIndex); body.name = name; } responseData = await GenericFunctions_1.digitalOceanApiRequest.call(this, 'POST', `droplets/${dropletId}/actions`, body); responseData = responseData.action; } if (operation === 'get') { const dropletId = this.getNodeParameter('dropletId', itemIndex); responseData = await GenericFunctions_1.digitalOceanApiRequest.call(this, 'GET', 'droplets', {}, { droplet_id: dropletId }); responseData = responseData.droplets; } if (operation === 'getMany') { const returnAll = this.getNodeParameter('returnAll', itemIndex); const additionalFields = this.getNodeParameter('additionalFields', itemIndex); const qs = {}; if (additionalFields.tagName) { qs.tag_name = additionalFields.tagName; } if (additionalFields.name) { qs.name = additionalFields.name; } if (qs.name && qs.tag_name) { throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'The Digital Ocean API does not allow both Tag Name and Name to be used, Please remove one of the options and try again.', { itemIndex, }); } if (returnAll) { responseData = await GenericFunctions_1.digitalOceanApiRequestAllItems.call(this, 'droplets', 'GET', 'droplets', {}, qs); } else { const limit = this.getNodeParameter('limit', itemIndex); qs.limit = limit; if (limit >= 200) { responseData = await GenericFunctions_1.digitalOceanApiRequestAllItems.call(this, 'droplets', 'GET', 'droplets', {}, qs); } else { responseData = await GenericFunctions_1.digitalOceanApiRequest.call(this, 'GET', 'droplets', {}, qs); responseData = responseData.droplets; } } } if (operation === 'getBackups') { const returnAll = this.getNodeParameter('returnAll', itemIndex); const dropletId = this.getNodeParameter('dropletId', itemIndex); const qs = {}; if (returnAll) { responseData = await GenericFunctions_1.digitalOceanApiRequestAllItems.call(this, 'backups', 'GET', `droplets/${dropletId}/backups`, {}, qs); } else { const limit = this.getNodeParameter('limit', itemIndex); qs.limit = limit; if (limit >= 200) { responseData = await GenericFunctions_1.digitalOceanApiRequestAllItems.call(this, 'backups', 'GET', `droplets/${dropletId}/backups`, {}, qs); } else { responseData = await GenericFunctions_1.digitalOceanApiRequest.call(this, 'GET', `droplets/${dropletId}/backups`, {}, qs); responseData = responseData.backups; } } } if (operation === 'getSnapshots') { const returnAll = this.getNodeParameter('returnAll', itemIndex); const dropletId = this.getNodeParameter('dropletId', itemIndex); const qs = {}; if (returnAll) { responseData = await GenericFunctions_1.digitalOceanApiRequestAllItems.call(this, 'snapshots', 'GET', `droplets/${dropletId}/snapshots`, {}, qs); } else { const limit = this.getNodeParameter('limit', itemIndex); qs.limit = limit; if (limit >= 200) { responseData = await GenericFunctions_1.digitalOceanApiRequestAllItems.call(this, 'snapshots', 'GET', `droplets/${dropletId}/snapshots`, {}, qs); } else { responseData = await GenericFunctions_1.digitalOceanApiRequest.call(this, 'GET', `droplets/${dropletId}/snapshots`, {}, qs); responseData = responseData.snapshots; } } } if (operation === 'delete') { const dropletId = this.getNodeParameter('dropletId', itemIndex); responseData = await GenericFunctions_1.digitalOceanApiRequest.call(this, 'DELETE', `droplets/${dropletId}`); responseData = { success: true }; } if (operation === 'create') { const name = this.getNodeParameter('name', itemIndex); const size = this.getNodeParameter('size', itemIndex); const useApplicationImage = this.getNodeParameter('useApplicationImage', itemIndex); const additionalFields = this.getNodeParameter('additionalFields', itemIndex); let image = ''; if (useApplicationImage) { image = this.getNodeParameter('applicationImage', itemIndex); } else { image = this.getNodeParameter('image', itemIndex); } const body = { name, size, image, }; if (additionalFields.region) { body.region = additionalFields.region; } if (additionalFields.sshKeys) { body.ssh_keys = additionalFields.sshKeys; } if (additionalFields.backups) { body.backups = additionalFields.backups; } if (additionalFields.ipv6) { body.ipv6 = additionalFields.ipv6; } if (additionalFields.monitoring) { body.monitoring = additionalFields.monitoring; } if (additionalFields.tags) { body.tags = additionalFields.tags; } responseData = await GenericFunctions_1.digitalOceanApiRequest.call(this, 'POST', 'droplets', body); responseData = responseData.droplet; } } const executionData = this.helpers.constructExecutionMetaData(this.helpers.returnJsonArray(responseData), { itemData: { item: itemIndex } }); returnData.push(...executionData); } catch (error) { if (this.continueOnFail()) { items.push({ json: this.getInputData(itemIndex)[0].json, error, pairedItem: itemIndex }); } else { if (error.context) { error.context.itemIndex = itemIndex; throw error; } throw new n8n_workflow_1.NodeOperationError(this.getNode(), error, { itemIndex, }); } } } return this.prepareOutputData(returnData); } } exports.DigitalOcean = DigitalOcean; //# sourceMappingURL=DigitalOcean.node.js.map