Skip to content

Commit 6116c5f

Browse files
authored
Implement serializers (#19)
* Use serializers to generate JSON responses * Add new files to cleanup script
1 parent a3979dc commit 6116c5f

File tree

5 files changed

+78
-9
lines changed

5 files changed

+78
-9
lines changed

scripts/cleanup.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,12 @@ const tasks = new Listr([
2828
from: [
2929
/\s*const \{(\n.*)+.*app\/user'\);/,
3030
/\s*const.*UsersRepository'\);/,
31+
/\s*const.*UserSerializer'\);/,
3132
/\, User: UserModel/,
3233
/\s*usersRepository.*\}\]/,
3334
/\,\s*UserModel/,
3435
/\s+createUser(.|\n)+.*DeleteUser\n/,
36+
/\s+userSerializer: UserSerializer\n/
3537
],
3638
to: ''
3739
});
@@ -44,10 +46,10 @@ const tasks = new Listr([
4446
path.join(srcAndTestPath, 'app', 'user', '**'),
4547
path.join(srcAndTestPath, 'domain', 'user', '**'),
4648
path.join(srcAndTestPath, 'infra', 'user', '**'),
49+
path.join(srcAndTestPath, 'interfaces', 'http', 'user', '**'),
4750
path.join(srcPath, 'infra', 'database', 'migrate', '*.js'),
4851
path.join(srcPath, 'infra', 'database', 'seeds', '*.js'),
4952
path.join(srcPath, 'infra', 'database', 'models', 'User.js'),
50-
path.join(srcPath, 'interfaces', 'http', 'user', '**'),
5153
path.join(testPath, 'features', 'api', 'users', '**'),
5254
path.join(testPath, 'support', 'factories', '*.js')
5355
]);

src/container.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ const {
1111
DeleteUser
1212
} = require('./app/user');
1313

14+
const UserSerializer = require('./interfaces/http/user/UserSerializer');
15+
1416
const Server = require('./interfaces/http/Server');
1517
const router = require('./interfaces/http/router');
1618
const loggerMiddleware = require('./interfaces/http/logging/loggerMiddleware');
@@ -65,4 +67,9 @@ container.registerClass({
6567
deleteUser: DeleteUser
6668
});
6769

70+
// Serializers
71+
container.registerValue({
72+
userSerializer: UserSerializer
73+
});
74+
6875
module.exports = container;
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
const UserSerializer = {
2+
serialize({ id, name }) {
3+
return {
4+
id,
5+
name
6+
};
7+
}
8+
};
9+
10+
module.exports = UserSerializer;

src/interfaces/http/user/UsersController.js

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ const UsersController = {
66
get router() {
77
const router = Router();
88

9+
router.use(inject('userSerializer'));
10+
911
router.get('/', inject('getAllUsers'), this.index);
1012
router.get('/:id', inject('getUser'), this.show);
1113
router.post('/', inject('createUser'), this.create);
@@ -16,26 +18,30 @@ const UsersController = {
1618
},
1719

1820
index(req, res, next) {
19-
const { getAllUsers } = req;
21+
const { getAllUsers, userSerializer } = req;
2022
const { SUCCESS, ERROR } = getAllUsers.outputs;
2123

2224
getAllUsers
2325
.on(SUCCESS, (users) => {
24-
res.status(Status.OK).json(users);
26+
res
27+
.status(Status.OK)
28+
.json(users.map(userSerializer.serialize));
2529
})
2630
.on(ERROR, next);
2731

2832
getAllUsers.execute();
2933
},
3034

3135
show(req, res, next) {
32-
const { getUser } = req;
36+
const { getUser, userSerializer } = req;
3337

3438
const { SUCCESS, ERROR, NOT_FOUND } = getUser.outputs;
3539

3640
getUser
3741
.on(SUCCESS, (user) => {
38-
res.status(Status.OK).json(user);
42+
res
43+
.status(Status.OK)
44+
.json(userSerializer.serialize(user));
3945
})
4046
.on(NOT_FOUND, (error) => {
4147
res.status(Status.NOT_FOUND).json({
@@ -49,12 +55,14 @@ const UsersController = {
4955
},
5056

5157
create(req, res, next) {
52-
const { createUser } = req;
58+
const { createUser, userSerializer } = req;
5359
const { SUCCESS, ERROR, VALIDATION_ERROR } = createUser.outputs;
5460

5561
createUser
5662
.on(SUCCESS, (user) => {
57-
res.status(Status.CREATED).json(user);
63+
res
64+
.status(Status.CREATED)
65+
.json(userSerializer.serialize(user));
5866
})
5967
.on(VALIDATION_ERROR, (error) => {
6068
res.status(Status.BAD_REQUEST).json({
@@ -68,12 +76,14 @@ const UsersController = {
6876
},
6977

7078
update(req, res, next) {
71-
const { updateUser } = req;
79+
const { updateUser, userSerializer } = req;
7280
const { SUCCESS, ERROR, VALIDATION_ERROR, NOT_FOUND } = updateUser.outputs;
7381

7482
updateUser
7583
.on(SUCCESS, (user) => {
76-
res.status(Status.ACCEPTED).json(user);
84+
res
85+
.status(Status.ACCEPTED)
86+
.json(userSerializer.serialize(user));
7787
})
7888
.on(VALIDATION_ERROR, (error) => {
7989
res.status(Status.BAD_REQUEST).json({
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
const { expect } = require('chai');
2+
const UserSerializer = require('src/interfaces/http/user/UserSerializer');
3+
const User = require('src/domain/user/User');
4+
5+
describe('Interfaces :: HTTP :: User :: UserSerializer', () => {
6+
it('returns id and name', () => {
7+
const serializedUser = UserSerializer.serialize({
8+
id: 123,
9+
name: 'The User'
10+
});
11+
12+
expect(serializedUser).to.eql({
13+
id: 123,
14+
name: 'The User'
15+
});
16+
});
17+
18+
it('ignores extra attributes', () => {
19+
const serializedUser = UserSerializer.serialize({
20+
id: 321,
21+
name: 'The User',
22+
unknown: 'Hello!'
23+
});
24+
25+
expect(serializedUser).to.eql({
26+
id: 321,
27+
name: 'The User'
28+
});
29+
});
30+
31+
it('is able to serialize user entity instances', () => {
32+
const user = new User({ id: 1, name: 'User :)' });
33+
const serializedUser = UserSerializer.serialize(user);
34+
35+
expect(serializedUser).to.eql({
36+
id: 1,
37+
name: 'User :)'
38+
});
39+
});
40+
});

0 commit comments

Comments
 (0)