Merge branch 'api-v3' into api-v3-i18n

This commit is contained in:
Matteo Pagliazzi
2015-11-12 16:36:19 +01:00
15 changed files with 183 additions and 17 deletions

View File

@@ -2,7 +2,7 @@ import 'coffee-script';
import mongoose from 'mongoose';
import autoinc from 'mongoose-id-autoinc';
import logging from '../website/src/libs/logging';
import logging from '../website/src/libs/api-v2/logging';
import nconf from 'nconf';
import utils from '../website/src/libs/utils';
import repl from 'repl';

View File

@@ -0,0 +1,136 @@
import request from 'request';
import { sendTaskWebhook } from '../../../../../website/src/libs/api-v3/webhook';
describe('webhooks', () => {
beforeEach(() => {
sandbox.stub(request, 'post');
});
afterEach(() => {
sandbox.restore();
});
describe('sendTaskWebhook', () => {
let task = {
details: { _id: 'task-id' },
delta: 1.4,
direction: 'up'
};
let data = {
task: task,
user: { _id: 'user-id' }
};
it('does not send if no webhook endpoints exist', () => {
let webhooks = { };
sendTaskWebhook(webhooks, data);
expect(request.post).to.not.be.called;
});
it('does not send if no webhooks are enabled', () => {
let webhooks = {
'some-id': {
sort: 0,
id: 'some-id',
enabled: false,
url: 'http://example.org/endpoint'
}
};
sendTaskWebhook(webhooks, data);
expect(request.post).to.not.be.called;
});
it('does not send if webhook url is not valid', () => {
let webhooks = {
'some-id': {
sort: 0,
id: 'some-id',
enabled: true,
url: 'http://malformedurl/endpoint'
}
};
sendTaskWebhook(webhooks, data);
expect(request.post).to.not.be.called;
});
it('sends task direction, task, task delta, and abridged user data', () => {
let webhooks = {
'some-id': {
sort: 0,
id: 'some-id',
enabled: true,
url: 'http://example.org/endpoint'
}
};
sendTaskWebhook(webhooks, data);
expect(request.post).to.be.calledOnce;
expect(request.post).to.be.calledWith({
url: 'http://example.org/endpoint',
body: {
direction: 'up',
task: { _id: 'task-id' },
delta: 1.4,
user: {
_id: 'user-id'
}
},
json: true
});
});
it('sends a post request for each webhook endpoint', () => {
let webhooks = {
'some-id': {
sort: 0,
id: 'some-id',
enabled: true,
url: 'http://example.org/endpoint'
},
'second-webhook': {
sort: 1,
id: 'second-webhook',
enabled: true,
url: 'http://example.com/2/endpoint'
}
};
sendTaskWebhook(webhooks, data);
expect(request.post).to.be.calledTwice;
expect(request.post).to.be.calledWith({
url: 'http://example.org/endpoint',
body: {
direction: 'up',
task: { _id: 'task-id' },
delta: 1.4,
user: {
_id: 'user-id'
}
},
json: true
});
expect(request.post).to.be.calledWith({
url: 'http://example.com/2/endpoint',
body: {
direction: 'up',
task: { _id: 'task-id' },
delta: 1.4,
user: {
_id: 'user-id'
}
},
json: true
});
});
});
});

View File

@@ -30,7 +30,7 @@ describe('analytics', function() {
});
describe('init', function() {
var analytics = rewire('../../website/src/libs/analytics');
var analytics = rewire('../../website/src/libs/api-v2/analytics');
it('throws an error if no options are passed in', function() {
expect(analytics).to.throw('No options provided');
@@ -62,7 +62,7 @@ describe('analytics', function() {
describe('track', function() {
var analyticsData, event_type;
var analytics = rewire('../../website/src/libs/analytics');
var analytics = rewire('../../website/src/libs/api-v2/analytics');
var initializedAnalytics;
beforeEach(function() {
@@ -370,7 +370,7 @@ describe('analytics', function() {
var purchaseData;
var analytics = rewire('../../website/src/libs/analytics');
var analytics = rewire('../../website/src/libs/api-v2/analytics');
var initializedAnalytics;
beforeEach(function() {

View File

@@ -7,7 +7,7 @@ var shared = require('../../../../common');
var User = require('./../../models/user').model;
var Group = require('./../../models/group').model;
var Challenge = require('./../../models/challenge').model;
var logging = require('./../../libs/logging');
var logging = require('./../../libs/api-v2/logging');
var csv = require('express-csv');
var utils = require('../../libs/utils');
var api = module.exports;

View File

@@ -12,11 +12,11 @@ var analytics = utils.analytics;
var Group = require('./../../models/group').model;
var Challenge = require('./../../models/challenge').model;
var moment = require('moment');
var logging = require('./../../libs/logging');
var logging = require('./../../libs/api-v2/logging');
var acceptablePUTPaths;
var api = module.exports;
var firebase = require('../../libs/firebase');
var webhook = require('../../libs/webhook');
var webhook = require('../../libs/api-v2/webhook');
// api.purchase // Shared.ops

View File

@@ -5,7 +5,7 @@ var _ = require('lodash');
var url = require('url');
var User = require('mongoose').model('User');
var payments = require('./index');
var logger = require('../../libs/logging');
var logger = require('../../libs/api-v2/logging');
var ipn = require('paypal-ipn');
var paypal = require('paypal-rest-sdk');
var shared = require('../../../../common');

View File

@@ -2,12 +2,12 @@
require('babel/register');
// TODO remove this once we've fully converted over
require('coffee-script');
require('coffee-script');
// Only do the minimal amount of work before forking just in case of a dyno restart
var cluster = require('cluster');
var nconf = require('nconf');
var logging = require('./libs/logging');
var logging = require('./libs/api-v2/logging');
// Initialize configuration
var setupNconf = require('./libs/api-v3/setupNconf');
@@ -33,4 +33,4 @@ if (cores !== 0 && cluster.isMaster && (IS_DEV || IS_PROD)) {
});
} else {
module.exports = require('./server.js');
}
}

View File

@@ -0,0 +1,30 @@
import { each } from 'lodash';
import { post } from 'request';
import { isURL } from 'validator';
let _sendWebhook = (url, body) => {
post({
url,
body,
json: true,
});
};
let _isInvalidWebhook = (hook) => {
return !hook.enabled || !isURL(hook.url);
};
export function sendTaskWebhook (webhooks, data) {
each(webhooks, (hook) => {
if (_isInvalidWebhook(hook)) return;
let body = {
direction: data.task.direction,
task: data.task.details,
delta: data.task.delta,
user: data.user,
};
_sendWebhook(hook.url, body);
});
}

View File

@@ -16,7 +16,7 @@ module.exports.sendEmail = function(mailData) {
}
});
smtpTransport.sendMail(mailData, function(error, response){
var logging = require('./logging');
var logging = require('./api-v2/logging');
if(error) logging.error(error);
else logging.info("Message sent: " + response.message);
smtpTransport.close(); // shut down the connection pool, no more messages
@@ -172,7 +172,7 @@ module.exports.setupConfig = function(){
//if (nconf.get('IS_PROD'))
//require('newrelic');
var analytics = IS_PROD && require('./analytics');
var analytics = IS_PROD && require('./api-v2/analytics');
var analyticsTokens = {
amplitudeToken: nconf.get('AMPLITUDE_KEY'),
googleAnalytics: nconf.get('GA_ID')

View File

@@ -1,4 +1,4 @@
var logging = require('../libs/logging');
var logging = require('../libs/api-v2/logging');
module.exports = function(err, req, res, next) {
//res.locals.domain.emit('error', err);

View File

@@ -4,7 +4,7 @@ var User = require('./user').model;
var shared = require('../../../common');
var _ = require('lodash');
var async = require('async');
var logging = require('../libs/logging');
var logging = require('../libs/api-v2/logging');
var Challenge = require('./../models/challenge').model;
var firebase = require('../libs/firebase');

View File

@@ -1,7 +1,7 @@
// TODO cleanup all comments when finished API v3
import nconf from 'nconf';
import logging from './libs/logging';
import logging from './libs/api-v2/logging';
import utils from './libs/utils';
import express from 'express';
import http from 'http';
@@ -161,4 +161,4 @@ server.listen(app.get('port'), () => {
return logging.info(`Express server listening on port ${app.get('port')}`);
});
export default server;
export default server;