Skip to content

Commit c7bfe91

Browse files
committed
Enable CI and CD via travis
Also: fix all eslint errors
1 parent 43ca458 commit c7bfe91

File tree

12 files changed

+158
-75
lines changed

12 files changed

+158
-75
lines changed

.eslintrc

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
{
2+
"rules": {
3+
"no-console": "off",
4+
"indent": [
5+
"error",
6+
4
7+
],
8+
"quotes": [
9+
2,
10+
"single"
11+
],
12+
"linebreak-style": [
13+
2,
14+
"unix"
15+
],
16+
"semi": [
17+
2,
18+
"always"
19+
]
20+
},
21+
"env": {
22+
"es6": true,
23+
"node": true
24+
},
25+
"extends": [
26+
"plugin:require-path-exists/recommended",
27+
"eslint:recommended"
28+
],
29+
"plugins": [
30+
"require-path-exists"
31+
]
32+
}

.travis.yml

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
sudo: required
2+
3+
services:
4+
- docker
5+
6+
language: node_js
7+
8+
node_js:
9+
- "6.9"
10+
11+
cache:
12+
directories:
13+
node_modules
14+
15+
script: travis/ci.sh
16+
17+
before_deploy:
18+
- sudo apt-get update
19+
- sudo apt-get -y -o Dpkg::Options::="--force-confnew" install docker-ce
20+
21+
deploy:
22+
- provider: script
23+
script: travis/cd.sh
24+
on:
25+
repo: CatalystCode/featureService
26+
tags: true

controllers/features.js

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
"use strict"
1+
'use strict';
22

3-
const common = require('service-utils'),
4-
HttpStatus = require('http-status-codes'),
5-
services = require('../services');
3+
const
4+
common = require('service-utils'),
5+
services = require('../services');
66

77
exports.getById = function(req, res) {
88
let query = {
@@ -15,7 +15,7 @@ exports.getById = function(req, res) {
1515
services.features.getById(query, (err, features) => {
1616
if (err) return common.utils.handleError(res, err);
1717

18-
res.send({ "features": features });
18+
res.send({ 'features': features });
1919
});
2020
};
2121

@@ -35,7 +35,7 @@ exports.getByPoint = function(req, res) {
3535
services.features.getByPoint(query, (err, features) => {
3636
if (err) return common.utils.handleError(res, err);
3737

38-
res.send({ "features": features });
38+
res.send({ 'features': features });
3939
});
4040
};
4141

@@ -54,7 +54,7 @@ exports.getByName = function(req, res) {
5454
services.features.getByName(query, (err, features) => {
5555
if (err) return common.utils.handleError(res, err);
5656

57-
res.send({ "features": features });
57+
res.send({ 'features': features });
5858
});
5959
};
6060

controllers/index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
module.exports = {
2-
features: require('./features')
2+
features: require('./features')
33
};

package.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,13 @@
2727
},
2828
"scripts": {
2929
"start": "node server.js",
30+
"lint": "eslint --max-warnings=0 services controllers server.js config.js",
3031
"test": "PORT=3035 FEATURES_CONNECTION_STRING='postgres://frontend:[euro4sure]@127.0.0.1/geofeatures' mocha"
3132
},
3233
"devDependencies": {
3334
"country-language": "^0.1.7",
35+
"eslint": "^4.17.0",
36+
"eslint-plugin-require-path-exists": "^1.1.7",
3437
"geotile": "^0.1.9",
3538
"mocha": "^3.3.0",
3639
"node-uuid": "^1.4.7",

server.js

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,20 @@
11
'use strict';
22

3-
const express = require('express'),
4-
app = express(),
5-
bodyParser = require('body-parser'),
6-
common = require('service-utils'),
7-
cors = require('cors'),
8-
log = common.services.log("featureService/server"),
9-
morgan = require('morgan'),
10-
server = require('http').createServer(app),
11-
config = require('./config'),
12-
services = require('./services'),
13-
controllers = require('./controllers');
3+
const
4+
express = require('express'),
5+
app = express(),
6+
bodyParser = require('body-parser'),
7+
common = require('service-utils'),
8+
cors = require('cors'),
9+
log = common.services.log('featureService/server'),
10+
morgan = require('morgan'),
11+
server = require('http').createServer(app),
12+
config = require('./config'),
13+
services = require('./services'),
14+
controllers = require('./controllers');
1415

1516
app.use(cors());
16-
app.use(morgan("combined", { "stream": log.stream }));
17+
app.use(morgan('combined', { 'stream': log.stream }));
1718
app.use(bodyParser.json({ limit: '50mb' }));
1819

1920
app.get('/features/id/:id', controllers.features.getById);
@@ -23,8 +24,8 @@ app.get('/features/name/:name', controllers.features.getByNa
2324

2425
services.init(function(err) {
2526
if (err) {
26-
return log.error('failed to initialize: ' + err);
27-
process.exit(1);
27+
log.error('failed to initialize: ' + err);
28+
return process.exit(1);
2829
}
2930

3031
server.listen(config.port);

services/features.js

Lines changed: 16 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,26 @@
1-
"use strict"
1+
'use strict';
22

3-
const async = require('async'),
4-
azure = require('azure-storage'),
5-
common = require('service-utils'),
6-
GeoPoint = require('geopoint'),
7-
HttpStatus = require('http-status-codes'),
8-
postgres = require('./postgres'),
9-
ServiceError = common.utils.ServiceError,
10-
turf = require('turf');
3+
const
4+
common = require('service-utils'),
5+
HttpStatus = require('http-status-codes'),
6+
postgres = require('./postgres'),
7+
ServiceError = common.utils.ServiceError;
118

129
let featureDatabasePool;
1310

1411
function executeQuery(query, params, callback) {
1512
featureDatabasePool.connect((err, client, done) => {
1613
if (err) {
1714
console.error(err);
18-
return callback(new ServiceError(HttpStatus.INTERNAL_SERVER_ERROR, "Error connecting to the features DB"));
15+
return callback(new ServiceError(HttpStatus.INTERNAL_SERVER_ERROR, 'Error connecting to the features DB'));
1916
}
2017

2118
client.query(query, params, (err, results) => {
2219
done();
2320

2421
if (err) {
2522
console.error(err);
26-
return callback(new ServiceError(HttpStatus.INTERNAL_SERVER_ERROR, "Error querying the features DB"));
23+
return callback(new ServiceError(HttpStatus.INTERNAL_SERVER_ERROR, 'Error querying the features DB'));
2724
} else {
2825
return callback(null, resultsToFeatures(results));
2926
}
@@ -85,7 +82,7 @@ function parseCentroid(centroid_geo_json) {
8582
return [x, y];
8683
}
8784

88-
function rowToFeature(row, columns) {
85+
function rowToFeature(row) {
8986
if (!row) return;
9087

9188
row['createdAt'] = row['created_at'];
@@ -149,7 +146,7 @@ function addQueryPredicates(sql, query, params) {
149146
if (query.filter_layer) {
150147
sql += ` AND lower(layer) IN (${query.filter_layer.split(',').map(layer => {
151148
params.push(layer);
152-
return `lower($${params.length})`
149+
return `lower($${params.length})`;
153150
}).join(',')})`;
154151
}
155152

@@ -189,7 +186,7 @@ function getByName(query, callback) {
189186
const namesDisjunction = `(${names.map(name => {
190187
nameParams.push(name);
191188
return `lower(name) = lower($${nameParams.length})`;
192-
}).join(" OR ")})`;
189+
}).join(' OR ')})`;
193190

194191
let nameQuery = `SELECT ${buildQueryColumns(query)} FROM features WHERE ${namesDisjunction}`;
195192

@@ -243,12 +240,10 @@ function intersectLocations(locations, callback) {
243240
*/
244241

245242
function upsert(feature, callback) {
246-
let prefix = "";
247-
248-
if (!feature.layer) return callback(new ServiceError(HttpStatus.BAD_REQUEST, "'layer' not provided for feature."));
249-
if (!feature.name) return callback(new ServiceError(HttpStatus.BAD_REQUEST, "'name' not provided for feature."));
250-
if (!feature.hull) return callback(new ServiceError(HttpStatus.BAD_REQUEST, "'hull' not provided for feature."));
251-
if (!feature.properties) return callback(new ServiceError(HttpStatus.BAD_REQUEST, "'properties' not provided for feature."));
243+
if (!feature.layer) return callback(new ServiceError(HttpStatus.BAD_REQUEST, '\'layer\' not provided for feature.'));
244+
if (!feature.name) return callback(new ServiceError(HttpStatus.BAD_REQUEST, '\'name\' not provided for feature.'));
245+
if (!feature.hull) return callback(new ServiceError(HttpStatus.BAD_REQUEST, '\'hull\' not provided for feature.'));
246+
if (!feature.properties) return callback(new ServiceError(HttpStatus.BAD_REQUEST, '\'properties\' not provided for feature.'));
252247

253248
feature.elevation = feature.elevation || 'null';
254249
feature.hierarchy = feature.hierarchy || '{}';
@@ -294,6 +289,6 @@ module.exports = {
294289
getByPoint,
295290
getByName,
296291
init,
297-
/* intersectLocations, */
292+
/* intersectLocations, */
298293
upsert,
299294
};

services/index.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
"use strict"
1+
'use strict';
22

3-
const async = require('async'),
4-
features = require('./features');
3+
const
4+
async = require('async'),
5+
features = require('./features');
56

67
const submodules = [
78
features

services/postgres.js

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
1-
const pg = require('pg'),
2-
process = require('process'),
3-
querystring = require('querystring'),
4-
HttpStatus = require('http-status-codes'),
5-
common = require('service-utils'),
6-
config = require('../config'),
7-
ServiceError = common.utils.ServiceError,
8-
url = require('url');
1+
const
2+
pg = require('pg'),
3+
querystring = require('querystring'),
4+
HttpStatus = require('http-status-codes'),
5+
common = require('service-utils'),
6+
ServiceError = common.utils.ServiceError,
7+
url = require('url');
98

109
function init(callback) {
1110
if (!config.featuresConnectionString) {
12-
return callback(new ServiceError(HttpStatus.INTERNAL_SERVER_ERROR, "Environment not set up to connect to DB"));
11+
return callback(new ServiceError(HttpStatus.INTERNAL_SERVER_ERROR, 'Environment not set up to connect to DB'));
1312
}
1413

1514
const params = url.parse(config.featuresConnectionString);

services/visits.js

Lines changed: 18 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,14 @@
1-
"use strict"
1+
'use strict';
22

3-
const async = require('async'),
4-
azure = require('azure-storage'),
5-
common = require('service-utils'),
6-
HttpStatus = require('http-status-codes'),
7-
log = common.services.log("featureService/services/visits"),
8-
postgres = require('./postgres'),
9-
ServiceError = common.utils.ServiceError,
10-
uuid = require('uuid/v4');
3+
const
4+
async = require('async'),
5+
common = require('service-utils'),
6+
HttpStatus = require('http-status-codes'),
7+
postgres = require('./postgres'),
8+
ServiceError = common.utils.ServiceError,
9+
uuid = require('uuid/v4');
1110

1211
let featureTablePool;
13-
let redlock;
1412

1513
function rowToVisit(row) {
1614
if (!row) return;
@@ -40,7 +38,7 @@ function resultsToVisits(results) {
4038
}
4139

4240
function deleteByUserId(userId, callback) {
43-
const query = `DELETE FROM visits WHERE user_id = $1`;
41+
const query = 'DELETE FROM visits WHERE user_id = $1';
4442
const params = [userId];
4543

4644
executeQuery(query, params, callback);
@@ -50,15 +48,15 @@ function executeQuery(query, params, callback) {
5048
featureTablePool.connect((err, client, done) => {
5149
if (err) {
5250
console.error(err);
53-
return callback(new ServiceError(HttpStatus.INTERNAL_SERVER_ERROR, "Error connecting to the visits DB"));
51+
return callback(new ServiceError(HttpStatus.INTERNAL_SERVER_ERROR, 'Error connecting to the visits DB'));
5452
}
5553

5654
client.query(query, params, (err, results) => {
5755
done();
5856

5957
if (err) {
6058
console.error(err);
61-
return callback(new ServiceError(HttpStatus.INTERNAL_SERVER_ERROR, "Error querying the visits DB"));
59+
return callback(new ServiceError(HttpStatus.INTERNAL_SERVER_ERROR, 'Error querying the visits DB'));
6260
} else {
6361
return callback(null, resultsToVisits(results));
6462
}
@@ -77,14 +75,14 @@ function fromRequest(visitsJson, callback) {
7775
}
7876

7977
function getByTimestamp(userId, timestamp, callback) {
80-
const query = `SELECT * FROM visits WHERE user_id = $1 AND start >= $2 AND finish <= $3`;
78+
const query = 'SELECT * FROM visits WHERE user_id = $1 AND start >= $2 AND finish <= $3';
8179
const params = [userId, timestamp, timestamp];
8280

8381
executeQuery(query, params, callback);
8482
}
8583

8684
function getByUserId(userId, callback) {
87-
const query = `SELECT * FROM visits WHERE user_id = $1`;
85+
const query = 'SELECT * FROM visits WHERE user_id = $1';
8886
const params = [userId];
8987

9088
executeQuery(query, params, callback);
@@ -119,11 +117,11 @@ function toResponse(visits) {
119117

120118
function upsert(visits, callback) {
121119
visits.forEach(visit => {
122-
if (!visit.id) return callback(new ServiceError(HttpStatus.BAD_REQUEST, "'id' not provided for visit: " + JSON.stringify(visit, null ,2)));
123-
if (!visit.userId) return callback(new ServiceError(HttpStatus.BAD_REQUEST, "'userId' not provided for visit: " + JSON.stringify(visit, null ,2)));
124-
if (!visit.featureId) return callback(new ServiceError(HttpStatus.BAD_REQUEST, "'featureId' not provided for visit: " + JSON.stringify(visit, null ,2)));
125-
if (!visit.start) return callback(new ServiceError(HttpStatus.BAD_REQUEST, "'start' not provided for visit: " + JSON.stringify(visit, null ,2)));
126-
if (!visit.finish) return callback(new ServiceError(HttpStatus.BAD_REQUEST, "'finish' not provided for visit: " + JSON.stringify(visit, null ,2)));
120+
if (!visit.id) return callback(new ServiceError(HttpStatus.BAD_REQUEST, '\'id\' not provided for visit: ' + JSON.stringify(visit, null ,2)));
121+
if (!visit.userId) return callback(new ServiceError(HttpStatus.BAD_REQUEST, '\'userId\' not provided for visit: ' + JSON.stringify(visit, null ,2)));
122+
if (!visit.featureId) return callback(new ServiceError(HttpStatus.BAD_REQUEST, '\'featureId\' not provided for visit: ' + JSON.stringify(visit, null ,2)));
123+
if (!visit.start) return callback(new ServiceError(HttpStatus.BAD_REQUEST, '\'start\' not provided for visit: ' + JSON.stringify(visit, null ,2)));
124+
if (!visit.finish) return callback(new ServiceError(HttpStatus.BAD_REQUEST, '\'finish\' not provided for visit: ' + JSON.stringify(visit, null ,2)));
127125
});
128126

129127
async.each(visits, (visit, visitCallback) => {

0 commit comments

Comments
 (0)