Skip to content

Commit 2df2e71

Browse files
authored
Merge pull request #12 from ClickPop/feature/response-routes
✨ Added response routes
2 parents 93411c5 + 39b6445 commit 2df2e71

15 files changed

Lines changed: 247 additions & 65 deletions

globalSetup.js

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
const { exec } = require('child_process');
2+
const env = process.env.NODE_ENV || 'development';
23

34
const cmd = (cmd) => {
45
return new Promise((res, rej) => {
@@ -16,15 +17,25 @@ const cmd = (cmd) => {
1617

1718
module.exports = async () => {
1819
try {
19-
const create = await cmd('NODE_ENV=test npm run db:create');
20-
// eslint-disable-next-line
21-
console.log(create);
22-
const migrate = await cmd('NODE_ENV=test npm run migrate:fresh');
23-
// eslint-disable-next-line
24-
console.log(migrate);
25-
const seed = await cmd('NODE_ENV=test npm run seed:fresh');
26-
// eslint-disable-next-line
27-
console.log(seed);
20+
const create = await cmd('cross-env-shell NODE_ENV=test npm run db:create');
21+
if (env === 'development') {
22+
// eslint-disable-next-line
23+
console.log(create);
24+
}
25+
26+
const migrate = await cmd(
27+
'cross-env-shell NODE_ENV=test npm run migrate:fresh',
28+
);
29+
if (env === 'development') {
30+
// eslint-disable-next-line
31+
console.log(migrate);
32+
}
33+
34+
const seed = await cmd('cross-env-shell NODE_ENV=test npm run seed:fresh');
35+
if (env === 'development') {
36+
// eslint-disable-next-line
37+
console.log(seed);
38+
}
2839
} catch (err) {
2940
console.error(err);
3041
}

globalTeardown.js

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,23 @@
11
const { exec } = require('child_process');
2+
const env = process.env.NODE_ENV || 'development';
3+
24
module.exports = async () => {
3-
exec('NODE_ENV=test npm run db:drop', (err, stdout, stderr) => {
4-
if (err) {
5-
console.error(err);
6-
return;
7-
}
8-
if (stderr) {
9-
console.error(err);
10-
return;
11-
}
12-
//eslint-disable-next-line
13-
console.log(stdout);
14-
});
5+
exec(
6+
'cross-env-shell NODE_ENV=test npm run db:drop',
7+
(err, stdout, stderr) => {
8+
if (err) {
9+
console.error(err);
10+
return;
11+
}
12+
if (stderr) {
13+
console.error(err);
14+
return;
15+
}
16+
17+
if (env === 'development') {
18+
// eslint-disable-next-line
19+
console.log(stdout);
20+
}
21+
},
22+
);
1523
};

helpers/hashIds.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
const HashIds = require('hashids/cjs');
2+
const hashIds = new HashIds(process.env.HASH_SECRET, 8);
3+
4+
module.exports = hashIds;

jest.config.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ module.exports = {
124124
// setupFiles: [],
125125

126126
// A list of paths to modules that run some code to configure or set up the testing framework before each test
127-
// setupFilesAfterEnv: [],
127+
setupFilesAfterEnv: ['./jest.sequelizeClose.js'],
128128

129129
// The number of seconds after which a test is considered as slow and reported as such in the results.
130130
// slowTestThreshold: 5,

jest.sequelizeClose.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
const { sequelize } = require('./models');
2+
3+
afterAll(async (done) => {
4+
await sequelize.close();
5+
done();
6+
});

package-lock.json

Lines changed: 11 additions & 9 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
"dependencies": {
4545
"bcryptjs": "^2.4.3",
4646
"cookie-parser": "^1.4.5",
47+
"cross-env": "^7.0.2",
4748
"express": "^4.17.1",
4849
"express-validator": "^6.6.1",
4950
"hashids": "^2.2.1",

routes/v1/v1-index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ const router = express.Router();
44
router.use('/auth', require('./v1-auth'));
55
router.use('/users', require('./v1-users'));
66
router.use('/surveys', require('./v1-surveys.js'));
7+
router.use('/responses', require('./v1-responses.js'));
78

89
//eslint-disable-next-line
910
router.use((err, req, res, next) => {

routes/v1/v1-responses.js

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
require('dotenv').config();
2+
const express = require('express');
3+
const authenticate = require('../../middleware/authenticate');
4+
const { Response, Survey, Question } = require('../../models');
5+
const router = express.Router();
6+
const hashIds = require('../../helpers/hashIds');
7+
8+
router.post('/new', async (req, res, next) => {
9+
try {
10+
const { responses } = req.body;
11+
responses.forEach((response) => {
12+
response.renameProperty('questionId', 'QuestionId');
13+
});
14+
const data = await Response.bulkCreate(responses);
15+
data.forEach((response) => {
16+
response.renameProperty('questionId', 'QuestionId');
17+
});
18+
res.status(200).json({
19+
created: true,
20+
results: data,
21+
});
22+
} catch (err) {
23+
console.error(err);
24+
next({
25+
status: 500,
26+
stack: err,
27+
errors: [
28+
{
29+
msg: err.msg,
30+
},
31+
],
32+
});
33+
}
34+
});
35+
36+
router.get('/:surveyId', authenticate, async (req, res, next) => {
37+
try {
38+
const id = await hashIds.decode(req.params.surveyId)[0];
39+
if (!id) {
40+
return next({
41+
status: 404,
42+
errors: [
43+
{
44+
msg: 'Not Found',
45+
location: 'url',
46+
},
47+
],
48+
});
49+
}
50+
const survey = await Survey.findOne({
51+
where: { id: id },
52+
include: [Question],
53+
});
54+
const questions = survey.Questions;
55+
const responses = [];
56+
for (const question of questions) {
57+
const resps = await question.getResponses();
58+
resps.forEach((resp) => responses.push(resp.toJSON()));
59+
}
60+
res.status(200).json({
61+
results: responses,
62+
});
63+
} catch (err) {
64+
console.error(err);
65+
next({
66+
status: 500,
67+
stack: err,
68+
errors: [
69+
{
70+
msg: err.msg,
71+
},
72+
],
73+
});
74+
}
75+
});
76+
77+
router.delete('/delete', authenticate, async (req, res, next) => {
78+
try {
79+
const id = req.body.responseId;
80+
if (!id) {
81+
return next({
82+
status: 404,
83+
errors: [
84+
{
85+
msg: 'Not Found',
86+
location: 'url',
87+
},
88+
],
89+
});
90+
}
91+
const response = await Response.destroy({
92+
where: {
93+
id,
94+
},
95+
});
96+
if (response < 1) {
97+
return res.status(200).json({ deleted: false });
98+
}
99+
res.status(200).json({
100+
deleted: true,
101+
});
102+
} catch (err) {
103+
console.error(err);
104+
next({
105+
status: 500,
106+
stack: err,
107+
errors: [
108+
{
109+
msg: err.msg,
110+
},
111+
],
112+
});
113+
}
114+
});
115+
116+
module.exports = router;

routes/v1/v1-surveys.js

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,13 @@ const {
88
checkSurveyQuestions,
99
} = require('../../middleware/validate');
1010
const { Survey } = require('../../models');
11-
const HashIds = require('hashids/cjs');
12-
const hashIds = new HashIds(process.env.HASH_SECRET, 8);
11+
const hashIds = require('../../helpers/hashIds');
12+
13+
router.get('/getHash', async (req, res) => {
14+
const { num } = req.query;
15+
const hash = await hashIds.encode(num);
16+
res.json({ hash });
17+
});
1318

1419
router.post(
1520
'/new',
@@ -34,8 +39,6 @@ router.post(
3439
);
3540

3641
let result = survey.toJSON().renameProperty('Questions', 'questions');
37-
result = { ...result };
38-
3942
return res.status(200).json({
4043
created: true,
4144
result,
@@ -64,11 +67,9 @@ router.get('/', authenticate, async (req, res, next) => {
6467
offset: req.query.offset || 0,
6568
include: [Survey.questions],
6669
});
67-
let results = surveys.map((survey) => {
68-
let json = survey.toJSON().renameProperty('Questions', 'questions');
69-
json = { ...json };
70-
return json;
71-
});
70+
let results = surveys.map((survey) =>
71+
survey.toJSON().renameProperty('Questions', 'questions'),
72+
);
7273
res.status(200).json({
7374
results,
7475
});
@@ -87,7 +88,7 @@ router.get('/', authenticate, async (req, res, next) => {
8788

8889
router.get('/:hash', async (req, res, next) => {
8990
try {
90-
const id = hashIds.decode(req.params.hash)[0];
91+
const id = await hashIds.decode(req.params.hash)[0];
9192
if (!id) {
9293
return next({
9394
status: 404,
@@ -111,7 +112,6 @@ router.get('/:hash', async (req, res, next) => {
111112
result,
112113
});
113114
} catch (err) {
114-
console.error(err);
115115
next({
116116
status: 500,
117117
stack: err,
@@ -151,7 +151,6 @@ router.delete('/delete', authenticate, async (req, res, next) => {
151151
deleted: true,
152152
});
153153
} catch (err) {
154-
console.error(err);
155154
next({
156155
status: 500,
157156
stack: err,

0 commit comments

Comments
 (0)