Skip to content

Commit abdc679

Browse files
Added a helper for the queries and added better error handling
1 parent f626845 commit abdc679

File tree

6 files changed

+125
-92
lines changed

6 files changed

+125
-92
lines changed

api/endpoints/indicators/index.js

+6-6
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ module.exports = {
2525
try {
2626
let pages = pagination(req);
2727
let {start, count} = pages.limits;
28-
let {length, list} = await indicators.list(start, count, urlResolver).catch(next);
28+
let {length, list} = await indicators.list(start, count, urlResolver);
2929
let links = paginationHelper.getLinks(pages, length, urlResolver);
3030

3131
res.locals.json = {
@@ -43,7 +43,7 @@ module.exports = {
4343
.get(validateIndicatorId)
4444
.get(async (req, res, next) => {
4545
try {
46-
const indicator = await indicators.get(req.params.indicator_id, urlResolver).catch(next);
46+
const indicator = await indicators.get(req.params.indicator_id, urlResolver);
4747
res.locals.json = {
4848
data: indicator
4949
};
@@ -78,7 +78,7 @@ module.exports = {
7878
}
7979
}
8080

81-
let {length, list} = await indicators.listObservations(req.params.indicator_id, start, count, urlResolver, options).catch(next);
81+
let {length, list} = await indicators.listObservations(req.params.indicator_id, start, count, urlResolver, options);
8282
let links = paginationHelper.getLinks(pages, length, urlResolver);
8383

8484
res.locals.json = {
@@ -99,7 +99,7 @@ module.exports = {
9999
let pages = pagination(req);
100100
let {start, count} = pages.limits;
101101

102-
let {length, list} = await indicators.listTimeseries(req.params.indicator_id, start, count, urlResolver).catch(next);
102+
let {length, list} = await indicators.listTimeseries(req.params.indicator_id, start, count, urlResolver);
103103
let links = paginationHelper.getLinks(pages, length, urlResolver);
104104

105105
res.locals.json = {
@@ -117,7 +117,7 @@ module.exports = {
117117
.get(validateIndicatorId)
118118
.get(async (req, res, next) => {
119119
try {
120-
const jsonStat = await indicators.getJSONStat(req.params.indicator_id, urlResolver, {url: req.path}).catch(next);
120+
const jsonStat = await indicators.getJSONStat(req.params.indicator_id, urlResolver, {url: req.path});
121121
res.locals.json = jsonStat;
122122
next();
123123
} catch (err) {
@@ -130,7 +130,7 @@ module.exports = {
130130
.get(validateIndicatorId)
131131
.get(async (req, res, next) => {
132132
try {
133-
const sdmx = await indicators.getSDMX(req.params.indicator_id, urlResolver, {url: req.path}).catch(next);
133+
const sdmx = await indicators.getSDMX(req.params.indicator_id, urlResolver, {url: req.path});
134134
res.set('Content-Type', 'application/vnd.sdmx.genericdata+xml;version=2.1');
135135
res.send(sdmx);
136136
res.end();

api/endpoints/indicators/model.js

+27-27
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
const {Client} = require('pg').native;
1+
const client = require('../../helpers/pg-client');
22
const jsonapiHelper = require('../../helpers/jsonapi');
33
const jsonStat = require('../../helpers/json-stat');
44
const sdmx = require('../../helpers/sdmx');
@@ -41,41 +41,44 @@ function format(indicator, urlResolver) {
4141

4242
module.exports = {
4343
list: async function(start, count, urlResolver = defaultUrlResolver) {
44-
const client = new Client();
4544
return new Promise(async (resolve, reject) => {
46-
await client.connect().catch(reject);
47-
const [res, countRes] = await Promise.all([
48-
client.query(listQuery, [count, start]),
49-
client.query(countQuery)
50-
]).catch(reject);
51-
client.end();
52-
resolve({
53-
length: parseInt(countRes.rows[0].count, 10),
54-
list: res.rows.map((o) => {
55-
return format(o, urlResolver);
56-
})
57-
});
45+
try {
46+
const [res, countRes] = await client.query(
47+
[listQuery, count, start],
48+
countQuery
49+
);
50+
resolve({
51+
length: parseInt(countRes.rows[0].count, 10),
52+
list: res.rows.map((o) => {
53+
return format(o, urlResolver);
54+
})
55+
});
56+
} catch (e) {
57+
reject(e);
58+
}
5859
});
5960
},
6061
isValid: function(id) {
6162
return indicatorIdValidation.test(id);
6263
},
6364
exists: async function(id) {
64-
const client = new Client();
6565
return new Promise(async (resolve, reject) => {
66-
await client.connect().catch(reject);
67-
const res = await client.query(existQuery, [id]).catch(reject);
68-
client.end();
69-
resolve(res.rows[0].count > 0);
66+
try {
67+
const res = await client.query([existQuery, id]);
68+
resolve(res.rows[0].count > 0);
69+
} catch (e) {
70+
reject(e);
71+
}
7072
});
7173
},
7274
get: async function(id, urlResolver = defaultUrlResolver) {
73-
const client = new Client();
7475
return new Promise(async (resolve, reject) => {
75-
await client.connect().catch(reject);
76-
const res = await client.query(getQuery, [id]).catch(reject);
77-
client.end();
78-
resolve(res.rowCount > 0 ? format(res.rows[0], urlResolver) : undefined);
76+
try {
77+
const res = await client.query([getQuery, id]);
78+
resolve(res.rowCount > 0 ? format(res.rows[0], urlResolver) : undefined);
79+
} catch (e) {
80+
reject(e);
81+
}
7982
});
8083
},
8184
listObservations: async function(id, start, count, urlResolver = defaultUrlResolver, options) {
@@ -95,15 +98,12 @@ module.exports = {
9598
});
9699
},
97100
getSDMX: async function(id, urlResolver = defaultUrlResolver, options) {
98-
const client = new Client();
99101
return new Promise(async (resolve, reject) => {
100102
let [indicator, {list}, status] = await Promise.all([
101103
this.get(id, urlResolver),
102104
observations.list(0, null, urlResolver, {indicator: id}),
103105
new Promise(async (resolve, reject) => {
104-
await client.connect().catch(reject);
105106
const res = await client.query(getStatus).catch(reject);
106-
client.end();
107107
resolve(res.rows[0].status);
108108
})
109109
]).catch(reject);

api/endpoints/legacy/model.js

+27-24
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
const {Client} = require('pg').native;
1+
const client = require('../../helpers/pg-client');
22
const jsonapiHelper = require('../../helpers/jsonapi');
33
const defaultUrlResolver = require('../../helpers/defaultUrlResolver');
44

@@ -22,41 +22,44 @@ function format(vector, urlResolver) {
2222

2323
module.exports = {
2424
list: async function(start, count, urlResolver = defaultUrlResolver) {
25-
const client = new Client();
2625
return new Promise(async (resolve, reject) => {
27-
await client.connect().catch(reject);
28-
const [res, countRes] = await Promise.all([
29-
client.query(listQuery, [count, start]),
30-
client.query(countQuery)
31-
]).catch(reject);
32-
client.end();
33-
resolve({
34-
length: parseInt(countRes.rows[0].count, 10),
35-
list: res.rows.map((o) => {
36-
return format(o, urlResolver);
37-
})
38-
});
26+
try {
27+
const [res, countRes] = await client.query(
28+
[listQuery, count, start],
29+
countQuery
30+
);
31+
resolve({
32+
length: parseInt(countRes.rows[0].count, 10),
33+
list: res.rows.map((o) => {
34+
return format(o, urlResolver);
35+
})
36+
});
37+
} catch (e) {
38+
reject(e);
39+
}
3940
});
4041
},
4142
isValid: function(id) {
4243
return vectorIdValidation.test(id);
4344
},
4445
exists: async function(id) {
45-
const client = new Client();
4646
return new Promise(async (resolve, reject) => {
47-
await client.connect().catch(reject);
48-
const res = await client.query(existQuery, [id]).catch(reject);
49-
client.end();
50-
resolve(res.rows[0].count > 0);
47+
try {
48+
const res = await client.query([existQuery, id]);
49+
resolve(res.rows[0].count > 0);
50+
} catch (e) {
51+
reject(e);
52+
}
5153
});
5254
},
5355
getTimeseries: async function(id, urlResolver) {
54-
const client = new Client();
5556
return new Promise(async (resolve, reject) => {
56-
await client.connect().catch(reject);
57-
const res = await client.query(getTimeseriesQuery, [id]).catch(reject);
58-
client.end();
59-
resolve(res.rowCount > 0 ? res.rows[0].timeseries : undefined);
57+
try {
58+
const res = await client.query([getTimeseriesQuery, id]);
59+
resolve(res.rowCount > 0 ? res.rows[0].timeseries : undefined);
60+
} catch (e) {
61+
reject(e);
62+
}
6063
});
6164
}
6265
};

api/endpoints/observations/model.js

+27-24
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
const {Client} = require('pg').native;
1+
const client = require('../../helpers/pg-client');
22
const jsonapiHelper = require('../../helpers/jsonapi');
33
const defaultUrlResolver = require('../../helpers/defaultUrlResolver');
44

@@ -104,42 +104,45 @@ function format(observation, urlResolver) {
104104

105105
module.exports = {
106106
list: async function(start, count, urlResolver = defaultUrlResolver, options={}) {
107-
const client = new Client();
108107
const filters = getFilters(options);
109108
return new Promise(async (resolve, reject) => {
110-
await client.connect().catch(reject);
111-
const [res, countRes] = await Promise.all([
112-
client.query(listQuery[0] + filters + listQuery[1], [count, start]),
113-
client.query(countQuery + filters)
114-
]).catch(reject);
115-
client.end();
116-
resolve({
117-
length: parseInt(countRes.rows[0].count, 10),
118-
list: res.rows.map((o) => {
119-
return format(o, urlResolver);
120-
})
121-
});
109+
try {
110+
const [res, countRes] = await client.query(
111+
[listQuery[0] + filters + listQuery[1], count, start],
112+
countQuery + filters
113+
);
114+
resolve({
115+
length: parseInt(countRes.rows[0].count, 10),
116+
list: res.rows.map((o) => {
117+
return format(o, urlResolver);
118+
})
119+
});
120+
} catch (e) {
121+
reject(e);
122+
}
122123
});
123124
},
124125
isValid: function(id) {
125126
return observationIdValidation.test(id);
126127
},
127128
exists: async function(id) {
128-
const client = new Client();
129129
return new Promise(async (resolve, reject) => {
130-
await client.connect().catch(reject);
131-
const res = await client.query(existQuery, [id]).catch(reject);
132-
client.end();
133-
resolve(res.rows[0].count > 0);
130+
try {
131+
const res = await client.query([existQuery, id]);
132+
resolve(res.rows[0].count > 0);
133+
} catch (e) {
134+
reject(e);
135+
}
134136
});
135137
},
136138
get: async function(id, urlResolver = defaultUrlResolver) {
137-
const client = new Client();
138139
return new Promise(async (resolve, reject) => {
139-
await client.connect().catch(reject);
140-
const res = await client.query(getQuery, [id]).catch(reject);
141-
client.end();
142-
resolve(res.rowCount > 0 ? format(res.rows[0], urlResolver) : undefined);
140+
try {
141+
const res = await client.query([getQuery, id]);
142+
resolve(res.rowCount > 0 ? format(res.rows[0], urlResolver) : undefined);
143+
} catch (e) {
144+
reject(e);
145+
}
143146
});
144147
}
145148
};

api/endpoints/timeseries/model.js

+16-11
Original file line numberDiff line numberDiff line change
@@ -55,17 +55,22 @@ module.exports = {
5555
const filters = getFilters(options);
5656
return new Promise(async (resolve, reject) => {
5757
await client.connect().catch(reject);
58-
const [res, countRes] = await Promise.all([
59-
client.query(listQuery[0] + filters + listQuery[1], [count, start]),
60-
client.query(countQuery + filters)
61-
]).catch(reject);
62-
client.end();
63-
resolve({
64-
length: parseInt(countRes.rows[0].count, 10),
65-
list: res.rows.map((o) => {
66-
return format(o, urlResolver);
67-
})
68-
});
58+
try {
59+
const [res, countRes] = await Promise.all([
60+
client.query(listQuery[0] + filters + listQuery[1], [count, start]),
61+
client.query(countQuery + filters)
62+
]).catch(reject);
63+
resolve({
64+
length: parseInt(countRes.rows[0].count, 10),
65+
list: res.rows.map((o) => {
66+
return format(o, urlResolver);
67+
})
68+
});
69+
} catch (e) {
70+
reject(e);
71+
} finally {
72+
client.end();
73+
}
6974
});
7075
},
7176
isValid: function(id) {

api/helpers/pg-client.js

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
const {Pool} = require('pg').native;
2+
3+
const pool = new Pool();
4+
5+
module.exports = {
6+
query: async (...queryList) => {
7+
const client = await pool.connect();
8+
const queries = queryList.map((query) => {
9+
let q;
10+
let params;
11+
if (typeof query === 'string') {
12+
q = query;
13+
} else {
14+
[q, ...params] = query;
15+
}
16+
return client.query(q, params);
17+
});
18+
const p = Promise.all(queries);
19+
p.then(client.release).catch((e) => e);
20+
return queries.length > 1 ? p : queries[0];
21+
}
22+
};

0 commit comments

Comments
 (0)