From 777b24c63c5b6c137111c1984f690623552ef35e Mon Sep 17 00:00:00 2001 From: Vishal K Date: Fri, 27 Oct 2023 19:40:12 +0530 Subject: [PATCH] Added Digital Ocean --- .env.example | 3 +++ package-lock.json | 32 ++++++++++++++++++++++++++ package.json | 2 ++ src/digitalOcean.ts | 55 +++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 92 insertions(+) create mode 100644 src/digitalOcean.ts diff --git a/.env.example b/.env.example index dace184..6ff7bfe 100644 --- a/.env.example +++ b/.env.example @@ -47,3 +47,6 @@ ASANA_ACCESS_TOKEN= ## DeepL DEEPL_AUTH_KEY= DEEPL_BASE_URL=https://api-free.deepl.com/v2/ + +## Digital Ocean +DO_TOKEN= \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 7b420ea..f803516 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,6 +18,7 @@ "deepl-node": "^1.10.2", "googleapis": "^105.0.0", "jsforce": "^1.11.1", + "node-digitalocean": "^2.1.0", "oauth-1.0a": "^2.2.6", "octokit": "^3.1.1", "react": "^18.2.0", @@ -5308,6 +5309,11 @@ "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" }, + "node_modules/lodash.isempty": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.isempty/-/lodash.isempty-4.4.0.tgz", + "integrity": "sha512-oKMuF3xEeqDltrGMfDxAPGIVMSSRv8tbRSODbrs4KGsRRLEhrW8N8Rd4DRgB2+621hY8A8XwwrTVhXWpxFvMzg==" + }, "node_modules/lodash.isinteger": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", @@ -5860,6 +5866,24 @@ "hpagent": "^0.1.2" } }, + "node_modules/node-digitalocean": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/node-digitalocean/-/node-digitalocean-2.1.0.tgz", + "integrity": "sha512-B5rtHxc99Xu6mcN6l9aE/D5eDqDyLf4dEs2vVav9VZWU2lqmcXGjqYcTaP+W/L0sOjAFlEhYsDpGMZ+7Al8LRg==", + "dependencies": { + "axios": "^0.24.0", + "got": "^11.8.2", + "lodash.isempty": "^4.4.0" + } + }, + "node_modules/node-digitalocean/node_modules/axios": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.24.0.tgz", + "integrity": "sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA==", + "dependencies": { + "follow-redirects": "^1.14.4" + } + }, "node_modules/node-domexception": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", @@ -9236,6 +9260,14 @@ "node": ">=4.0.0" } }, + "node_modules/xml2js/node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "engines": { + "node": ">=4.0" + } + }, "node_modules/xmlbuilder": { "version": "13.0.2", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-13.0.2.tgz", diff --git a/package.json b/package.json index d7c8c07..b826962 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,7 @@ "gmail": "node -r dotenv/config -r ts-node/register src/gmail.ts", "hubspot": "node -r dotenv/config -r ts-node/register src/hubspot.ts", "x": "node -r dotenv/config -r ts-node/register src/x.ts", + "node-digitalocean": "node -r dotenv/config -r ts-node/register src/digitalOcean.ts", "dev:trigger": "trigger-cli dev --port 8080" }, "dependencies": { @@ -28,6 +29,7 @@ "deepl-node": "^1.10.2", "googleapis": "^105.0.0", "jsforce": "^1.11.1", + "node-digitalocean": "^2.1.0", "oauth-1.0a": "^2.2.6", "octokit": "^3.1.1", "react": "^18.2.0", diff --git a/src/digitalOcean.ts b/src/digitalOcean.ts new file mode 100644 index 0000000..e0ae861 --- /dev/null +++ b/src/digitalOcean.ts @@ -0,0 +1,55 @@ +// digitalOcean.ts +import { TriggerClient, eventTrigger } from '@trigger.dev/sdk'; +import { z } from 'zod'; +import DigitalOcean from "node-digitalocean"; + +const client = new TriggerClient({ id: "api-reference" }); + +// Initialize DigitalOcean client +const digitalOceanClient = new DigitalOcean(process.env.DO_TOKEN?? ""); + +client.defineJob({ + id: "digitalOcean-deployDroplet", + name: "Deploy Droplet from a Master Snapshot", + version: "1.0.0", + trigger: eventTrigger({ + name: "digitalOcean.deployDroplet", + schema: z.object({ + snapshotId: z.string(), + dropletName: z.string(), + region: z.string(), + size: z.string(), + }), + }), + +run: async (payload, io, ctx) => { + // Wrap any SDK call in io.runTask so it's resumable and displays in logs + return io.runTask( + "Deploy Droplet", + async () => { + const droplet = await digitalOceanClient.droplets.create({ + name: payload.dropletName, + region: payload.region, + size: payload.size, + image: payload.snapshotId, + ssh_keys: [], // add any additional properties here + backups: false, + ipv6: false, + user_data: null, + private_networking: false, + volumes: [], + monitoring: false, + tags: [], + }); + + return droplet; + }, + // You can add metadata to the task to improve the display in the logs + { name: "DigitalOcean Deploy Droplet", icon: "digitalOcean" } + ); +}, +}); + +// These lines can be removed if you don't want to use express +import { createExpressServer } from '@trigger.dev/express'; +createExpressServer(client);