Skip to content

Commit a4516fd

Browse files
committed
Code refactoring
1 parent 237e995 commit a4516fd

File tree

8 files changed

+38
-45
lines changed

8 files changed

+38
-45
lines changed

app.js

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
const express = require('express');
22
const bodyParser = require('body-parser');
33
const config = require('config');
4+
const URIGenerator = require('./routing/uriGenerator');
45

56
class App {
67
constructor(router) {
@@ -12,19 +13,29 @@ class App {
1213
this.express.use(bodyParser.json());
1314
this.expressRouter = express.Router();
1415
this._registerRoute = this._registerRoute.bind(this);
15-
this._buildControllerInstance = this._buildControllerInstance.bind(this);
16+
this._createRouteBoundAction = this._createRouteBoundAction.bind(this);
1617
}
1718

1819
_registerRoute(uri, httpMethod, boundAction) {
1920
this.expressRouter.route(uri)[httpMethod](boundAction);
2021
}
2122

23+
_createRouteBoundAction(controllerClass, method) {
24+
const result = [
25+
(req, res) => {
26+
this._buildControllerInstance(controllerClass, req, res)[method]();
27+
}];
28+
29+
return result;
30+
}
31+
2232
_buildControllerInstance(ControllerClass, req, res) {
2333
return new ControllerClass(
2434
{
2535
params: req.params,
2636
query: req.query,
2737
body: req.body,
38+
uriGenerator: new URIGenerator(),
2839
send: (statusCode, resource) => {
2940
res.status(statusCode).send(resource);
3041
},
@@ -33,7 +44,7 @@ class App {
3344
}
3445

3546
run() {
36-
this.router.registerRoutes(this._registerRoute, this._buildControllerInstance);
47+
this.router.registerRoutes(this._registerRoute, this._createRouteBoundAction);
3748
this.express.use('/api/v1', this.expressRouter);
3849
this.express.use((req, res) => {
3950
res.status(404).send({ url: `${req.originalUrl} not found` });

controllers/booksListController.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ class BooksListController extends ControllerBase {
66
try {
77
const { id } = this.params;
88
const bookModel = new BookModel({ _id: id });
9-
const resource = await bookModel.getResource();
9+
const resource = await bookModel.getResource(this.uriGenerator);
1010
this.ok(resource);
1111
} catch (err) {
1212
this.error(err);
@@ -18,7 +18,7 @@ class BooksListController extends ControllerBase {
1818
const { id } = this.params;
1919
const { rating } = this.body;
2020
const bookModel = new BookModel({ _id: id, rating });
21-
const resource = await bookModel.getResource();
21+
const resource = await bookModel.getResource(this.uriGenerator);
2222
this.ok(resource);
2323
} catch (err) {
2424
this.error(err);
Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
const BookListController = require('./booksListController');
22
const Router = require('../routing/router');
33
const BooksListRoutesBuilder = require('../routing/routesBuilders/booksListRoutesBuilder');
4+
const URIGenerator = require('../routing/uriGenerator');
45

56
beforeEach(() => {
67
const router = new Router([
@@ -11,24 +12,28 @@ beforeEach(() => {
1112

1213
describe('testing BooksListController controller', () => {
1314
test('GetBook action success', async (done) => {
15+
const id = 0;
1416
const sendFunc = (status, resource) => {
1517
expect(status).toBe(200);
16-
expect(resource.id).toBe(0);
18+
expect(resource.id).toBe(id);
1719
done();
1820
};
19-
const controller = new BookListController({ params: { id: 0 }, send: sendFunc });
21+
const controller = new BookListController(
22+
{ params: { id }, send: sendFunc, uriGenerator: new URIGenerator() },
23+
);
2024
await controller.getBook();
2125
});
2226

2327
test('RateBook action success', async (done) => {
28+
const id = 0;
2429
const sendFunc = (status, resource) => {
2530
expect(status).toBe(200);
26-
expect(resource.id).toBe(0);
31+
expect(resource.id).toBe(id);
2732
expect(resource.rating).toBe(5);
2833
done();
2934
};
3035
const controller = new BookListController(
31-
{ params: { id: 0 }, body: { rating: 5 }, send: sendFunc },
36+
{ params: { id }, body: { rating: 5 }, send: sendFunc, uriGenerator: new URIGenerator() },
3237
);
3338
await controller.rateBook();
3439
});
@@ -38,7 +43,7 @@ describe('testing BooksListController controller', () => {
3843
expect(status).toBe(204);
3944
done();
4045
};
41-
const controller = new BookListController({ send: sendFunc });
46+
const controller = new BookListController({ send: sendFunc, uriGenerator: new URIGenerator() });
4247
await controller.removeBook();
4348
});
4449
});

controllers/controllerBase.js

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
1-
const URIGenerator = require('../routing/uriGenerator');
2-
31
class ControllerBase {
4-
constructor({ params, query, body, send }) {
5-
this.uriGenerator = URIGenerator;
2+
constructor({ params, query, body, send, uriGenerator }) {
3+
this.uriGenerator = uriGenerator;
64
this.params = params;
75
this.query = query;
86
this.body = body;

models/bookModel.js

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,16 @@
11
const Model = require('./model');
2-
const URIGenerator = require('../routing/uriGenerator');
32

43
class BookModel extends Model {
5-
constructor(data, uriGenerator) {
6-
super(uriGenerator);
7-
this.uriGenerator = URIGenerator;
4+
constructor(data) {
5+
super();
86
this.id = data._id;
97
this.name = data.name;
108
this.author = data.author;
119
this.language = data.language;
1210
this.rating = data.rating;
1311
}
1412

15-
async getResource() {
13+
async getResource(uriGenerator) {
1614
const resource = super.getResource({
1715
id: this.id,
1816
name: this.name,
@@ -21,20 +19,20 @@ class BookModel extends Model {
2119
rating: this.rating,
2220
});
2321

24-
await this.addLinks(resource);
22+
await this.addLinks(resource, uriGenerator);
2523
return resource;
2624
}
2725

28-
async addLinks(resource) {
29-
const removeURI = await this.uriGenerator.getURI(
26+
async addLinks(resource, uriGenerator) {
27+
const removeURI = await uriGenerator.getURI(
3028
'BooksListController_removeBook',
3129
{ id: this.id },
3230
);
3331
if (removeURI) {
3432
resource.addLink(removeURI.id, removeURI);
3533
}
3634

37-
const rateURI = await this.uriGenerator.getURI(
35+
const rateURI = await uriGenerator.getURI(
3836
'BooksListController_rateBook',
3937
{ id: this.id },
4038
);

models/model.js

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,6 @@
11
const halson = require('halson');
22

33
class Model {
4-
constructor(uriGenerator, controllers) {
5-
this.uriGenerator = uriGenerator;
6-
this.controllers = controllers;
7-
}
8-
94
getResource(data) {
105
return halson(data);
116
}

routing/router.js

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,27 +5,17 @@ class Router {
55
this.routeBuilders = routeBuilders;
66
}
77

8-
registerRoutes(registerRouteCallback, buildControllerInstanceCallback) {
8+
registerRoutes(registerRouteCallback, createRouteBoundAction) {
99
this.routeBuilders.forEach((builder) => {
1010
const routes = builder.getRoutes();
1111
routes.forEach((routeData) => {
1212
RoutesCollection.addRouteData(routeData.controllerClass, routeData.action,
1313
{ uri: routeData.uri, httpMethod: routeData.httpMethod });
14-
const boundAction = this._bindRouteTo(routeData.controllerClass, routeData.action,
15-
buildControllerInstanceCallback);
14+
const boundAction = createRouteBoundAction(routeData.controllerClass, routeData.action);
1615
registerRouteCallback(routeData.uri, routeData.httpMethod, boundAction);
1716
});
1817
});
1918
}
20-
21-
_bindRouteTo(controllerClass, method, buildControllerInstanceCallback) {
22-
const result = [
23-
(req, res) => {
24-
buildControllerInstanceCallback(controllerClass, req, res)[method]();
25-
}];
26-
27-
return result;
28-
}
2919
}
3020

3121
module.exports = Router;

routing/uriGenerator.js

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,9 @@ const queryString = require('query-string');
22
const RoutesCollection = require('./routesCollection');
33

44
class URIGenerator {
5-
constructor() {
6-
this.routes = RoutesCollection;
7-
}
8-
95
getURI(controllerAction, params, id) {
106
const caArray = controllerAction.split('_');
11-
const routeData = this.routes[caArray[0]][caArray[1]];
7+
const routeData = RoutesCollection[caArray[0]][caArray[1]];
128
return new Promise((resolve) => {
139
const uri = params ? this._bindParams(routeData.uri, params) : routeData.uri;
1410
resolve({ id: id || routeData.action, method: routeData.method, uri });
@@ -46,4 +42,4 @@ class URIGenerator {
4642
}
4743
}
4844

49-
module.exports = new URIGenerator();
45+
module.exports = URIGenerator;

0 commit comments

Comments
 (0)