Skip to content
This repository has been archived by the owner on Mar 16, 2020. It is now read-only.

Commit

Permalink
Merge aa6b059 into 6c9ee2d
Browse files Browse the repository at this point in the history
  • Loading branch information
jseppi committed Feb 6, 2017
2 parents 6c9ee2d + aa6b059 commit ccb66df
Show file tree
Hide file tree
Showing 10 changed files with 138 additions and 27 deletions.
5 changes: 3 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
node_modules/*
api/.DS_Store
manifest*
npm-debug.log
.DS_Store
cf-ssh.yml
coverage/*
public/bower_components/*
public/bower_components/*
credentials*.json
docker-compose.override.yml
14 changes: 3 additions & 11 deletions api/api.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,10 @@ var bodyParser = require('body-parser');
var MongoClient = require('mongodb').MongoClient;
var fs = require('fs');

var github = require('./github.js').github;
var env = require('../lib/env').load();
var github = require('./github').github;

var url;
var router = express.Router(); // eslint-disable-line new-cap
var vcapServices;
var items;
var checklists;
var users;
Expand Down Expand Up @@ -41,14 +40,7 @@ var setEarliestDueDate = function (username, callback) {
});
};

if (process.env.VCAP_SERVICES) {
vcapServices = JSON.parse(process.env.VCAP_SERVICES);
url = vcapServices['mongodb26-swarm'][0].credentials.uri;
} else {
url = process.env.MONGODB_URI || 'mongodb://localhost:27017/checklistomania';
}

MongoClient.connect(url, function (connectErr, db) {
MongoClient.connect(env.MONGODB_URI, function (connectErr, db) {
items = db.collection('items');
checklists = db.collection('checklists');
users = db.collection('users');
Expand Down
5 changes: 3 additions & 2 deletions api/github.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
var env = require('../lib/env').load();
var GitHubApi = require('github');

var github = new GitHubApi({
Expand All @@ -12,8 +13,8 @@ var github = new GitHubApi({

github.authenticate({
type: 'oauth',
key: process.env.GITHUB_CLIENT_ID,
secret: process.env.GITHUB_CLIENT_SECRET
key: env.GITHUB_CLIENT_ID,
secret: env.GITHUB_CLIENT_SECRET
});

module.exports = { github: github };
17 changes: 9 additions & 8 deletions app.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,22 +7,23 @@ var methodOverride = require('method-override');
var passport = require('passport');
var GitHubStrategy = require('passport-github2').Strategy;

var api = require('./api/api.js');
var middleware = require('./lib/middleware.js');
var api = require('./api/api');
var env = require('./lib/env').load();
var middleware = require('./lib/middleware');
var ensureAuthenticated = middleware.ensureAuthenticated;
var ensureGithubOrg = middleware.ensureGithubOrg;
var addToUsers = middleware.addToUsers;
var includeBranding = middleware.includeBranding;

var server;
var app = express();
var port = process.env.PORT || 3000;
var port = env.PORT || 3000;

var requiredEnv = ['GITHUB_CLIENT_ID', 'GITHUB_CLIENT_SECRET',
'GITHUB_ORG', 'SESSION_SECRET'];

requiredEnv.forEach(function (name) {
if (!process.env[name]) {
if (!env[name]) {
throw new Error('Missing required environment variable: ' + name);
}
});
Expand All @@ -37,9 +38,9 @@ passport.deserializeUser(function (obj, done) {
});

passport.use(new GitHubStrategy({
clientID: process.env.GITHUB_CLIENT_ID,
clientSecret: process.env.GITHUB_CLIENT_SECRET,
callbackURL: process.env.GITHUB_CALLBACK_URL || 'http://localhost:' + port + '/auth/callback'
clientID: env.GITHUB_CLIENT_ID,
clientSecret: env.GITHUB_CLIENT_SECRET,
callbackURL: env.GITHUB_CALLBACK_URL || 'http://localhost:' + port + '/auth/callback'
}, function (accessToken, refreshToken, profile, done) {
process.nextTick(function () {
return done(null, profile);
Expand All @@ -51,7 +52,7 @@ app.set('views', process.cwd() + '/views');

app.use(methodOverride());
app.use(session({
secret: process.env.SESSION_SECRET,
secret: env.SESSION_SECRET,
resave: true,
saveUninitialized: true
}));
Expand Down
3 changes: 0 additions & 3 deletions docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,5 @@ app:
- "3000:3000"
mongo:
image: mongo:3.2
environment:
- POSTGRES_DB=calc
- POSTGRES_USER=calc_user
ports:
- "27017:27017"
39 changes: 39 additions & 0 deletions lib/env.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
var _defaults = require('lodash.defaults');
var _get = require('lodash.get');

var defaults = {
GITHUB_CLIENT_ID: null,
GITHUB_CLIENT_SECRET: null,
GITHUB_ORG: null,
SESSION_SECRET: null,
MONGODB_URI: 'mongodb://localhost:27017/checklistomania'
};

function load(_fromEnv) {
var env = {};
var credentials;
var vcapServices;
var fromEnv = _fromEnv;

if (!fromEnv) {
fromEnv = process.env;
}

if (fromEnv.VCAP_SERVICES) {
vcapServices = JSON.parse(fromEnv.VCAP_SERVICES);

credentials = _get(vcapServices, 'user-provided[0].credentials');

if (credentials) {
_defaults(env,
credentials,
{ MONGODB_URI: _get(vcapServices, 'mongodb26-swarm[0].credentials.uri') });
}
} else {
_defaults(env, fromEnv, defaults);
}

return env;
}

module.exports = { load: load };
11 changes: 11 additions & 0 deletions manifests/manifest-dev.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
applications:
- name: checklistomania-dev
instances: 1
memory: 512M
disk_quota: 1024M
routes:
- route: checklistomania-dev.app.cloud.gov
services:
- checklistomania-mongodb
- checklistomania-env
stack: cflinuxfs2
2 changes: 2 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@
"express": "^4.13.4",
"express-session": "^1.11.3",
"github": "^0.2.4",
"lodash.defaults": "^4.2.0",
"lodash.get": "^4.4.2",
"method-override": "^2.3.5",
"mongodb": "^2.1.2",
"passport": "^0.3.2",
Expand Down
2 changes: 1 addition & 1 deletion spec/backend/apiSpec.js
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ function getExampleChecklist() {
return checklist;
}

mockery.registerMock('./github.js', {
mockery.registerMock('./github', {
github: {
user: {
getFrom: function (obj, callback) {
Expand Down
67 changes: 67 additions & 0 deletions spec/backend/envSpec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
/* global describe it expect */
var env = require('../../lib/env');

function makeVcapServicesEnv(vcapServices) {
return {
VCAP_SERVICES: JSON.stringify(vcapServices)
};
}

describe('env properly loads config values', function () {
it('has default MONGODB_URI', function (done) {
var e = env.load({});
expect(e.MONGODB_URI).toBe('mongodb://localhost:27017/checklistomania');
done();
});

it('defaults other required values to null', function (done) {
var e = env.load({});
expect(e.GITHUB_CLIENT_ID).toBeNull();
expect(e.GITHUB_CLIENT_SECRET).toBeNull();
expect(e.GITHUB_ORG).toBeNull();
expect(e.SESSION_SECRET).toBeNull();
done();
});

it('loads from the specified env', function (done) {
var e = env.load({
SOME_ENV_VAR: 'whatever'
});
expect(e.SOME_ENV_VAR).toBe('whatever');
done();
});

it('loads from process.env by default', function (done) {
var e;
process.env = {
ENV_VAR_IN_PROCESS_ENV: 'whatever'
};
e = env.load();
expect(e.ENV_VAR_IN_PROCESS_ENV).toBe('whatever');
done();
});

it('loads from VCAP_SERVICES', function (done) {
var e = env.load(makeVcapServicesEnv({
'user-provided': [{
credentials: {
GITHUB_CLIENT_ID: 'clientId',
GITHUB_CLIENT_SECRET: 'clientSecret',
GITHUB_ORG: 'org',
SESSION_SECRET: 'sessionSecret'
}
}],
'mongodb26-swarm': [{
credentials: {
uri: 'mongodb://whatever'
}
}]
}));
expect(e.GITHUB_CLIENT_ID).toBe('clientId');
expect(e.GITHUB_CLIENT_SECRET).toBe('clientSecret');
expect(e.GITHUB_ORG).toBe('org');
expect(e.SESSION_SECRET).toBe('sessionSecret');
expect(e.MONGODB_URI).toBe('mongodb://whatever');
done();
});
});

0 comments on commit ccb66df

Please sign in to comment.