diff --git a/.env.example b/.env.example index d439535..d558272 100644 --- a/.env.example +++ b/.env.example @@ -103,6 +103,17 @@ X_ACCESS_TOKEN_SECRET= # YouTube YOUTUBE_API_KEY= +## Digital Ocean +DO_TOKEN= + +## Todoist +TODOIST_API_TOKEN= + +## Svix +SVIX_API_KEY= + +## ZBD + # ZBD ZBD_API_KEY= ZBD_BASE_URL=https://sandbox-api.zebedee.io diff --git a/package-lock.json b/package-lock.json index 4bb0195..7b8a30c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27,6 +27,7 @@ "deepl-node": "^1.10.2", "googleapis": "^105.0.0", "jsforce": "^1.11.1", + "node-digitalocean": "^2.1.0", "mailgun.js": "^9.3.0", "oauth-1.0a": "^2.2.6", "octokit": "^3.1.1", @@ -5913,6 +5914,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", @@ -6508,6 +6514,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/no-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", @@ -6515,6 +6539,7 @@ "dependencies": { "lower-case": "^2.0.2", "tslib": "^2.0.3" + } }, "node_modules/node-domexception": { diff --git a/package.json b/package.json index 52bf8ab..5c6366d 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,7 @@ "hubspot": "node -r dotenv/config -r ts-node/register src/hubspot.ts", "stability": "node -r dotenv/config -r ts-node/register src/stability.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", "youtube": "node -r dotenv/config -r ts-node/register src/youtube.ts", "todoist": "node -r dotenv/config -r ts-node/register src/todoist.ts", "hugging-face": "node -r dotenv/config -r ts-node/register src/hugging-face.ts", @@ -58,6 +59,7 @@ "deepl-node": "^1.10.2", "googleapis": "^105.0.0", "jsforce": "^1.11.1", + "node-digitalocean": "^2.1.0", "mailgun.js": "^9.3.0", "oauth-1.0a": "^2.2.6", "octokit": "^3.1.1", 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);