diff --git a/config/angular/blogs/audience.json b/config/angular/blogs/audience.json new file mode 100644 index 000000000..f1692588a --- /dev/null +++ b/config/angular/blogs/audience.json @@ -0,0 +1,15 @@ +{ + "expertise": "BEGINNER", + "version": 1, + "source": "medium", + "authorIds": [ + "garima_mehra" + ], + "author": "garima mehra", + "title": "Test", + "link": "https://medium.com/@garima_mehra/audience", + "tags": [ + "nlp", + "performance" + ] +} diff --git a/config/angular/blogs/how-to-become-a-react-developer.json b/config/angular/blogs/how-to-become-a-react-developer.json new file mode 100644 index 000000000..94ddb6011 --- /dev/null +++ b/config/angular/blogs/how-to-become-a-react-developer.json @@ -0,0 +1,12 @@ +{ + "expertise": "INTERMEDIATE", + "version": 1, + "source": "other", + "authorIds": [], + "author": "S Swathi Dharshna", + "title": "How to become a REACT developer", + "link": "https://devdigest.hashnode.dev/how-to-become-a-react-developer", + "tags": [ + "performance" + ] +} diff --git a/config/angular/blogs/test.json b/config/angular/blogs/test.json new file mode 100644 index 000000000..cb01d0399 --- /dev/null +++ b/config/angular/blogs/test.json @@ -0,0 +1,12 @@ +{ + "expertise": "BEGINNER", + "version": 1, + "source": "other", + "authorIds": [], + "author": "Garima Mehra", + "title": "Google Dev Library | What will you build?", + "link": "https://devlibrary.withgoogle.com/test", + "tags": [ + "performance" + ] +} diff --git a/config/authors/garima_mehra.json b/config/authors/garima_mehra.json new file mode 100644 index 000000000..aaed3e263 --- /dev/null +++ b/config/authors/garima_mehra.json @@ -0,0 +1,6 @@ +{ + "name": "Garima Mehra", + "bio": "", + "photoURL": "https://miro.medium.com/max/512/1*_JRKHW74BAXM0709iUIN0g.jpeg", + "mediumURL": "https://medium.com/@garima_mehra" +} diff --git a/config/cloud/blogs/@DEVELOPERDIGEST.json b/config/cloud/blogs/@DEVELOPERDIGEST.json new file mode 100644 index 000000000..fd21207e2 --- /dev/null +++ b/config/cloud/blogs/@DEVELOPERDIGEST.json @@ -0,0 +1,13 @@ +{ + "expertise": "BEGINNER", + "version": 1, + "source": "other", + "authorIds": [], + "author": "Swathi Dharshna", + "title": "Developer Digest — Hashnode", + "link": "https://hashnode.com/@DEVELOPERDIGEST", + "tags": [ + "containers", + "data-analytics" + ] +} diff --git a/config/cloud/blogs/how-to-build-a-developer-resume-in-english.json b/config/cloud/blogs/how-to-build-a-developer-resume-in-english.json new file mode 100644 index 000000000..208729154 --- /dev/null +++ b/config/cloud/blogs/how-to-build-a-developer-resume-in-english.json @@ -0,0 +1,12 @@ +{ + "expertise": "INTERMEDIATE", + "version": 1, + "source": "other", + "authorIds": [], + "author": "S Swathi Dharshna", + "title": "How to Build a Developer Resume (in English)", + "link": "https://devdigest.hashnode.dev/how-to-build-a-developer-resume-in-english", + "tags": [ + "databases" + ] +} diff --git a/config/ml/blogs/2022-12-dev-library-letters-16th-issue.json b/config/ml/blogs/2022-12-dev-library-letters-16th-issue.json new file mode 100644 index 000000000..2f3094b09 --- /dev/null +++ b/config/ml/blogs/2022-12-dev-library-letters-16th-issue.json @@ -0,0 +1,14 @@ +{ + "expertise": "BEGINNER", + "version": 1, + "source": "other", + "authorIds": [], + "author": "Swathi Dharshna", + "title": "Dev Library Letters: 16th Issue", + "link": "https://developers.googleblog.com/2022/12/dev-library-letters-16th-issue.html", + "tags": [ + "web", + "face", + "segmentation" + ] +} diff --git a/shared/.gitignore b/shared/.gitignore index 1521c8b76..53c37a166 100644 --- a/shared/.gitignore +++ b/shared/.gitignore @@ -1 +1 @@ -dist +dist \ No newline at end of file diff --git a/shared/package-lock.json b/shared/package-lock.json index 9f816ab6c..d8486020c 100644 --- a/shared/package-lock.json +++ b/shared/package-lock.json @@ -10,6 +10,7 @@ "license": "Apache-2.0", "devDependencies": { "@google-cloud/pubsub": "^2.8.0", + "@sendgrid/mail": "^7.7.0", "@types/node": "^16.3.1", "@types/node-fetch": "^2.5.11", "@types/open-graph-scraper": "^4.8.1", @@ -421,6 +422,41 @@ "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=", "dev": true }, + "node_modules/@sendgrid/client": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@sendgrid/client/-/client-7.7.0.tgz", + "integrity": "sha512-SxH+y8jeAQSnDavrTD0uGDXYIIkFylCo+eDofVmZLQ0f862nnqbC3Vd1ej6b7Le7lboyzQF6F7Fodv02rYspuA==", + "dependencies": { + "@sendgrid/helpers": "^7.7.0", + "axios": "^0.26.0" + }, + "engines": { + "node": "6.* || 8.* || >=10.*" + } + }, + "node_modules/@sendgrid/helpers": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@sendgrid/helpers/-/helpers-7.7.0.tgz", + "integrity": "sha512-3AsAxfN3GDBcXoZ/y1mzAAbKzTtUZ5+ZrHOmWQ279AuaFXUNCh9bPnRpN504bgveTqoW+11IzPg3I0WVgDINpw==", + "dependencies": { + "deepmerge": "^4.2.2" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/@sendgrid/mail": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@sendgrid/mail/-/mail-7.7.0.tgz", + "integrity": "sha512-5+nApPE9wINBvHSUxwOxkkQqM/IAAaBYoP9hw7WwgDNQPxraruVqHizeTitVtKGiqWCKm2mnjh4XGN3fvFLqaw==", + "dependencies": { + "@sendgrid/client": "^7.7.0", + "@sendgrid/helpers": "^7.7.0" + }, + "engines": { + "node": "6.* || 8.* || >=10.*" + } + }, "node_modules/@sindresorhus/is": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", @@ -1151,6 +1187,14 @@ "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", "dev": true }, + "node_modules/axios": { + "version": "0.26.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz", + "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==", + "dependencies": { + "follow-redirects": "^1.14.8" + } + }, "node_modules/balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", @@ -2427,6 +2471,14 @@ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, + "node_modules/deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/defaults": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", @@ -3611,6 +3663,25 @@ "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==", "dev": true }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, "node_modules/forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -9010,6 +9081,32 @@ "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=", "dev": true }, + "@sendgrid/client": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@sendgrid/client/-/client-7.7.0.tgz", + "integrity": "sha512-SxH+y8jeAQSnDavrTD0uGDXYIIkFylCo+eDofVmZLQ0f862nnqbC3Vd1ej6b7Le7lboyzQF6F7Fodv02rYspuA==", + "requires": { + "@sendgrid/helpers": "^7.7.0", + "axios": "^0.26.0" + } + }, + "@sendgrid/helpers": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@sendgrid/helpers/-/helpers-7.7.0.tgz", + "integrity": "sha512-3AsAxfN3GDBcXoZ/y1mzAAbKzTtUZ5+ZrHOmWQ279AuaFXUNCh9bPnRpN504bgveTqoW+11IzPg3I0WVgDINpw==", + "requires": { + "deepmerge": "^4.2.2" + } + }, + "@sendgrid/mail": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@sendgrid/mail/-/mail-7.7.0.tgz", + "integrity": "sha512-5+nApPE9wINBvHSUxwOxkkQqM/IAAaBYoP9hw7WwgDNQPxraruVqHizeTitVtKGiqWCKm2mnjh4XGN3fvFLqaw==", + "requires": { + "@sendgrid/client": "^7.7.0", + "@sendgrid/helpers": "^7.7.0" + } + }, "@sindresorhus/is": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", @@ -9602,6 +9699,14 @@ "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", "dev": true }, + "axios": { + "version": "0.26.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz", + "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==", + "requires": { + "follow-redirects": "^1.14.8" + } + }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", @@ -10620,6 +10725,11 @@ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==" + }, "defaults": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", @@ -11636,6 +11746,11 @@ "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==", "dev": true }, + "follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" + }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", diff --git a/shared/package.json b/shared/package.json index e0b6ed67a..667985f9e 100644 --- a/shared/package.json +++ b/shared/package.json @@ -19,6 +19,7 @@ "license": "Apache-2.0", "devDependencies": { "@google-cloud/pubsub": "^2.8.0", + "@sendgrid/mail": "^7.7.0", "@types/node": "^16.3.1", "@types/node-fetch": "^2.5.11", "@types/open-graph-scraper": "^4.8.1", diff --git a/shared/scripts/advocu.ts b/shared/scripts/advocu.ts index ae0d25a9b..a9d7c4cdb 100644 --- a/shared/scripts/advocu.ts +++ b/shared/scripts/advocu.ts @@ -17,6 +17,7 @@ import * as fs from "fs"; import fetch from "node-fetch"; import * as path from "path"; +import sendgrid from "@sendgrid/mail"; import { BlogMetadata } from "../types/BlogMetadata"; import { RepoMetadata } from "../types/RepoMetadata"; @@ -90,6 +91,40 @@ interface Application { tags: string[]; } +const sendAutomatedEmail = (email: string, firstName: string, lastName: string) => { + const sendGridKey = process.env.DEVLIBRARYKEY; + if (!sendGridKey) { + exitWithError("Error: must set 'SENDGRID_API_KEY' environment variable"); + } + sendgrid.setApiKey(sendGridKey || ""); + + const text = "Dear " + firstName + ", Congratulations, your content has been published" + + " on the Google Dev Library platform. You can view it in your Dev Library author profile" + + "https://devlibrary.withgoogle.com/authors/" + firstName + lastName + + " As next steps, you can also: Subscribe to our newsletter to stay updated with the latest" + + "projects added to Dev Library. Join the Dev Library authors' channel Google Developers" + + " Online Discord public server to connect with other Dev Library authors." + + " Share your success on social media using the hashtag #GoogleDevLibrary" + + const html = `

Dear ${firstName},


Congratulations, your content has been publish on the Google Dev Library platform. You can view it in your Dev Library author profile: https://devlibrary.withgoogle.com/authors/${firstName}${lastName}


As next steps, you can also:



Happy contributing!


Regards,

Google Dev Library Team

` + + const finalEmail = { + from: "library-google-dev@google.com", + to: email, + subject: "[Google Dev Library] Congratulations your content is live", + text: text, + html: html + } + + sendgrid.send(finalEmail) + .then((response) => { + console.log('SendGrid Email sent: ' + response) + }) + .catch((error) => { + console.error(error) + }) +} + function assertNonEmpty(arr: T[]): arr is NonEmptyArray { return arr.length > 0; } @@ -184,6 +219,7 @@ export async function main() { console.log(`Adding ${product} repo ${projectUrl}`); await addRepo(product, projectUrl, /* projectId= */ undefined, metadata); + await sendAutomatedEmail(a.email, a.firstName, a.lastName); } if (a.blogPost) { @@ -199,6 +235,7 @@ export async function main() { /* projectId= */ undefined, metadata ); + await sendAutomatedEmail(a.email, a.firstName, a.lastName); } else { await addOtherBlog( product, @@ -206,6 +243,7 @@ export async function main() { /* projectId= */ undefined, metadata ); + await sendAutomatedEmail(a.email, a.firstName, a.lastName); } } catch (e) { console.error(`Problem occurred when adding a project: ${e}`);