Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added sendgrid example app. Also used for Compute Engine snippet. #45

Merged
merged 1 commit into from
Dec 8, 2015
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,7 @@ npm-debug.log
coverage/

test/encrypted/nodejs-docs-samples.json
dump.rdb
dump.rdb
logs/
*.iml
.idea/
5 changes: 5 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ and applications on [Google App Engine](http://cloud.google.com/nodejs).
- Bower - [Source code][bower_1] | [App Engine Tutorial][bower_2] | [Documentation][bower_3]
- Grunt - [Source code][grunt_1] | [App Engine Tutorial][grunt_2] | [Live demo][grunt_3] | [Documentation][grunt_4]
- Mailgun - [Source code][mailgun_1] | [App Engine Tutorial][mailgun_2] | [Documentation][mailgun_3]
- Sendgrid - [Source code][sendgrid_1] | [App Engine Tutorial][sendgrid_2] | [Documentation][sendgrid_3]
- Webpack - [Source code][webpack_1] | [App Engine Tutorial][webpack_2] | [Documentation][webpack_3]

## Google Storage
Expand Down Expand Up @@ -134,6 +135,10 @@ See [LICENSE](https://github.com/GoogleCloudPlatform/nodejs-docs-samples/blob/ma
[mailgun_2]: https://cloud.google.com/nodejs/resources/tools/mailgun
[mailgun_3]: http://www.mailgun.com/

[sendgrid_1]: https://github.com/GoogleCloudPlatform/nodejs-docs-samples/blob/master/appengine/sendgrid
[sendgrid_2]: https://cloud.google.com/nodejs/resources/tools/sendgrid
[sendgrid_3]: http://sendgrid.com/

[webpack_1]: https://github.com/GoogleCloudPlatform/nodejs-docs-samples/blob/master/appengine/webpack
[webpack_2]: https://cloud.google.com/nodejs/resources/tools/webpack
[webpack_3]: https://webpack.github.io/
Expand Down
20 changes: 20 additions & 0 deletions appengine/sendgrid/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
## Express.js + Sendgrid on Google App Engine
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Don't think we really need to specify express for each of the samples that happen to use express. Would the sendgrid specific code be any different if we were using sails or koa?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

no


> [Sendgrid][1]: Delivering your transactional and marketing email through one reliable platform.
>
> – sendgrid.com
This sample application demonstrates how to use [Express.js][2] and
[sendgrid-nodejs][3] to send transactional email on [Google App Engine][4].

Read the [Sendgrid on App Engine Tutorial][5] for how to run and deploy this
sample app.

You can also read the [Sendgrid documentation][6].

[1]: https://sendgrid.com/
[2]: http://expressjs.com
[3]: https://github.com/sendgrid/sendgrid-nodejs
[4]: https://cloud.google.com/appengine
[5]: https://cloud.google.com/nodejs/resources/tools/sendgrid
[6]: https://sendgrid.com/docs
73 changes: 73 additions & 0 deletions appengine/sendgrid/app.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
// Copyright 2015, Google, Inc.
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

'use strict';

var express = require('express');
var path = require('path');
var bodyParser = require('body-parser');

// [START setup]
var Sendgrid = require('sendgrid')(process.env.SENDGRID_API_KEY);
// [END setup]

var app = express();

// Setup view engine
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

// Parse form data
app.use(bodyParser.urlencoded({ extended: false }));

// [START index]
app.get('/', function(req, res) {
res.render('index');
});
// [END index]

// [START hello]
app.post('/hello', function(req, res, next) {
Sendgrid.send({
from: '[email protected]', // From address
to: req.body.email, // To address
subject: 'Hello World!', // Subject
text: 'Sendgrid on Google App Engine with Node.js', // Content
}, function (err) {
if (err) {
return next(err);
}
// Render the index route on success
return res.render('index', {
sent: true
});
});
});
// [END hello]

if (module === require.main) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this just for test purposes?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yep

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I kind of feel like this is modifying the control flow based on if it's a test or not. Generally better to avoid if possible, but I get why it's there.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Conditionally starting the server based on whether the file is being executed directly vs when the file is being require'd is not just for testing. It's very useful to be able to export the express app instance so something else can use it. That's exactly what the express appengine sample does, and in that example the server is actually started by the bin/www.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fair point. Mind changed, carry on.

// [START server]
var server = app.listen(
process.env.PORT || 8080,
'0.0.0.0',
function () {
var address = server.address().address;
var port = server.address().port;
console.log('App listening at http://%s:%s', address, port);
console.log('Press Ctrl+C to quit.');
}
);
// [END server]
}

module.exports = app;
21 changes: 21 additions & 0 deletions appengine/sendgrid/app.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# Copyright 2015, Google, Inc.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# [START app_yaml]
runtime: nodejs
vm: true
env_variables:
SENDGRID_API_KEY: <your-sendgrid-api-key>
# [END app_yaml]
skip_files:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@dlorenc when can we start removing these?

- ^(.*/)?.*/node_modules/.*$
20 changes: 20 additions & 0 deletions appengine/sendgrid/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
{
"name": "appengine-sendgrid",
"description": "An example of using Sendgrid in Node.js on Google App Engine.",
"version": "0.0.1",
"private": true,
"license": "Apache Version 2.0",
"engines": {
"node": "~4.2"
},
"scripts": {
"start": "node app.js",
"deploy": "gcloud preview app deploy app.yaml"
},
"dependencies": {
"body-parser": "^1.14.1",
"express": "^4.13.3",
"jade": "^1.11.0",
"sendgrid": "^2.0.0"
}
}
27 changes: 27 additions & 0 deletions appengine/sendgrid/views/index.jade
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
// Copyright 2015, Google, Inc.
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
doctype html
html
head
title= title
body
h1 Hello World!
p Express.js + Sendgrid on Google App Engine.
hr
if sent
p Email sent!
else
form(name="hello", action="/hello", method="post")
input(type="email", placeholder="Enter your email to send yourself a Hello World message", name="email", style="width: 50%; margin-right: 15px;")
input(type="submit", value="Send")
13 changes: 13 additions & 0 deletions computeengine/sendgrid/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
{
"name": "computeengine-sendgrid",
"description": "An example of sending an email with Sendgrid in Node.js on Google Compute Engine.",
"version": "0.0.1",
"private": true,
"license": "Apache Version 2.0",
"engines": {
"node": "~4.2"
},
"dependencies": {
"sendgrid": "^2.0.0"
}
}
33 changes: 33 additions & 0 deletions computeengine/sendgrid/sendmail.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
// Copyright 2015, Google, Inc.
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

'use strict';

// [START send]
var Sendgrid = require('sendgrid')(
process.env.SENDGRID_API_KEY || '<your-sendgrid-api-key>'
);

Sendgrid.send({
from: 'ANOTHER_EMAIL@ANOTHER_EXAMPLE.COM', // From address
to: '[email protected]', // To address
subject: 'test email from Node.js on Google Cloud Platform', // Subject
text: 'Hello!\n\nThis a test email from Node.js.' // Content
}, function (err, json) {
if (err) {
console.log(err);
} else {
console.log(json);
}
});
// [END send]
4 changes: 3 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,10 @@
"deps_datastore": "cd datastore && npm i && cd ../..",
"deps_storage": "cd storage && npm i && cd ../..",
"deps_express": "cd appengine/express && npm i && cd ../..",
"deps_sendgrid": "cd appengine/sendgrid && npm i && cd ../.. && cd computeengine/sendgrid && npm i && cd ../..",
"deps_memcached": "cd appengine/express-memcached-session && npm i && cd ../..",
"pretest_geddy": "cd appengine/geddy && npm i geddy; GEDDY_SECRET=config/secrets.json; [[ -f $GEDDY_SECRET ]] || echo '{}' > $GEDDY_SECRET && node node_modules/.bin/geddy gen secret; cd ../..;",
"pretest": "npm run deps_datastore && npm run deps_storage && npm run deps_memcached && npm run deps_express && npm run pretest_geddy",
"pretest": "npm run deps_datastore && npm run deps_storage && npm run deps_memcached && npm run deps_express && npm run deps_sendgrid && npm run pretest_geddy",
"test": "npm run jshint && npm run cover"
},
"devDependencies": {
Expand All @@ -39,6 +40,7 @@
"istanbul": "^0.4.0",
"jshint": "~2.8.0",
"mocha": "^2.2.5",
"proxyquire": "^1.7.3",
"request": "^2.65.0",
"supertest": "^1.1.0"
}
Expand Down
6 changes: 6 additions & 0 deletions test/appengine/all.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,12 @@ var sampleTests = [
args: ['server.js'],
msg: 'Hello World! Restify.js on Google App Engine.'
},
{
dir: 'sendgrid',
cmd: 'node',
args: ['app.js'],
msg: 'Express.js + Sendgrid on Google App Engine.'
},
{
dir: 'webpack',
cmd: 'node',
Expand Down
36 changes: 36 additions & 0 deletions test/appengine/sendgrid.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
// Copyright 2015, Google, Inc.
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

'use strict';

var assert = require('assert');
var request = require('supertest');
var app = require('../../appengine/sendgrid/app.js');

describe('sendgrid', function () {
it('should return 200 and a "Hello World" message', function (done) {
var message = 'Express.js + Sendgrid on Google App Engine';

request(app)
.get('/')
.expect(200)
.expect(function (res) {
assert(
res.text.indexOf(message) !== -1,
'Response should contain a "Hello World" message.\n' +
'Found: ' + res.text
);
})
.end(done);
});
});
39 changes: 39 additions & 0 deletions test/computeengine/sendgrid.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
// Copyright 2015, Google, Inc.
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

'use strict';

var assert = require('assert');
var proxyquire = require('proxyquire').noPreserveCache();
process.env.SENDGRID_API_KEY = 'foo';

describe('sendgrid', function () {
it('should send an email', function (done) {
proxyquire('../../computeengine/sendgrid/sendmail.js', {
sendgrid: function (key) {
assert.equal(key, 'foo');
return {
send: function (payload) {
assert.deepEqual(payload, {
from: 'ANOTHER_EMAIL@ANOTHER_EXAMPLE.COM',
to: '[email protected]',
subject: 'test email from Node.js on Google Cloud Platform',
text: 'Hello!\n\nThis a test email from Node.js.'
});
done();
}
};
}
});
});
});