Skip to content

Commit b8f8e24

Browse files
authored
Merge pull request #3 from Gambitier/book-services
create Book Library controllers/service/repo
2 parents 48fca71 + 12cfe69 commit b8f8e24

File tree

25 files changed

+398
-22
lines changed

25 files changed

+398
-22
lines changed

Projects/BooksLibrary/package-lock.json

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

Projects/BooksLibrary/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
"dotenv": "^16.0.0",
3333
"express": "^4.17.3",
3434
"express-fileupload": "^1.3.1",
35+
"express-validator": "^6.14.0",
3536
"jsonwebtoken": "^8.5.1",
3637
"pg": "^8.7.3",
3738
"reflect-metadata": "^0.1.13",

Projects/BooksLibrary/src/api/controllers/user.controller.ts

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1+
import { UserValidator } from 'api/validators/user.validator';
12
import { Authorizer } from 'auth/authorizer';
3+
import { ResponseHandler } from 'common/response.handler';
4+
import { UserDomainModel } from 'domain.types/user/user.domain.model';
5+
import { UserDetailsDto } from 'domain.types/user/user.dto';
26
import express from 'express';
37
import { UserService } from 'services/user.service';
48
import { Loader } from 'startup/loader';
@@ -30,6 +34,25 @@ export class UserController {
3034
};
3135

3236
create = async (request: express.Request, response: express.Response): Promise<void> => {
33-
throw new Error('Method not implemented.');
37+
try {
38+
// request.context = 'User.create';
39+
40+
const domainData: UserDomainModel = await UserValidator.create(request, response);
41+
42+
const userdetails: UserDetailsDto = await this._service.create(domainData);
43+
44+
ResponseHandler.success(
45+
request,
46+
response,
47+
'User created!',
48+
200,
49+
{
50+
entity: userdetails,
51+
},
52+
false
53+
);
54+
} catch (err) {
55+
ResponseHandler.handleError(request, response, err);
56+
}
3457
};
3558
}

Projects/BooksLibrary/src/api/routes/router.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import express from 'express';
22
import { Logger } from '../../common/logger';
3+
import { register } from './user.routes';
34

45
export class Router {
56
private _app = null;
@@ -14,9 +15,12 @@ export class Router {
1415
//Handling the base route
1516
this._app.get('/api/v1/', (req, res) => {
1617
res.send({
17-
message : `API [Version ${process.env.API_VERSION}]`,
18+
message: `API [Version ${process.env.API_VERSION}]`,
1819
});
1920
});
21+
22+
register(this._app);
23+
2024
resolve(true);
2125
} catch (error) {
2226
Logger.instance().log('Error initializing the router: ' + error.message);
Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
1-
import express from 'express';
2-
import { Loader } from '../../startup/loader';
1+
import express, { Router } from 'express';
2+
// import { Loader } from '../../startup/loader';
33
import { UserController } from '../controllers/user.controller';
44

55
///////////////////////////////////////////////////////////////////////////////////
66

77
export const register = (app: express.Application): void => {
8-
const router = express.Router();
9-
const authenticator = Loader.authenticator;
8+
const router: Router = express.Router();
9+
// const authenticator = Loader.authenticator;
1010
const controller = new UserController();
1111

1212
router.post('/', controller.create);
13-
router.get('/', authenticator.authenticateUser, controller.search);
14-
router.get('/:id', authenticator.authenticateUser, controller.getById);
15-
router.delete('/:id', authenticator.authenticateUser, controller.delete);
13+
// router.get('/', authenticator.authenticateUser, controller.search);
14+
// router.get('/:id', authenticator.authenticateUser, controller.getById);
15+
// router.delete('/:id', authenticator.authenticateUser, controller.delete);
1616

1717
app.use('/api/v1/users', router);
1818
};
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
/* eslint-disable newline-per-chained-call */
2+
import { Helper } from 'common/helper';
3+
import { ResponseHandler } from 'common/response.handler';
4+
import { UserDomainModel } from 'domain.types/user/user.domain.model';
5+
import express from 'express';
6+
import { body, oneOf, param, query, validationResult } from 'express-validator';
7+
8+
export class UserValidator {
9+
static create = async (request: express.Request, response: express.Response): Promise<UserDomainModel> => {
10+
try {
11+
await body('Prefix').optional().trim().run(request);
12+
await body('FirstName').isString().notEmpty().trim().run(request);
13+
await body('MiddleName').optional().trim().run(request);
14+
await body('LastName').isString().notEmpty().trim().run(request);
15+
await body('Email').isEmail().trim().run(request);
16+
await body('Password').isString().notEmpty().trim().run(request);
17+
18+
const result = validationResult(request);
19+
if (!result.isEmpty()) {
20+
Helper.handleValidationError(result);
21+
}
22+
23+
const createUserDomainModel: UserDomainModel = {
24+
Prefix: request.body.prefix,
25+
FirstName: request.body.FirstName,
26+
MiddleName: request.body.MiddleName,
27+
LastName: request.body.LastName,
28+
Email: request.body.Email,
29+
Password: request.body.Password,
30+
RoleId: request.body.RoleId ?? null,
31+
};
32+
33+
return createUserDomainModel;
34+
} catch (err) {
35+
ResponseHandler.handleError(request, response, err);
36+
}
37+
};
38+
}

Projects/BooksLibrary/src/app.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,9 @@ export default class Application {
4444
//Connect with database
4545
await Loader.databaseConnector.init();
4646

47+
//call the seeder
48+
await Loader.seeder.init();
49+
4750
//Set-up middlewares
4851
await this.setupMiddlewares();
4952

@@ -58,6 +61,8 @@ export default class Application {
5861
await this.listen();
5962
} catch (error) {
6063
Logger.instance().log(`An error occurred while starting api service. ${error.message}`);
64+
// eslint-disable-next-line no-console
65+
console.error(error);
6166
}
6267
};
6368

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import { InputValidationError } from './input.validation.error';
2+
3+
export class Helper {
4+
static handleValidationError = (result) => {
5+
let index = 1;
6+
const errorMessages = [];
7+
for (const er of result.errors) {
8+
errorMessages.push(` ${index}. ${er.msg} - <${er.value}> for <${er.param}> in ${er.location}`);
9+
index++;
10+
}
11+
throw new InputValidationError(errorMessages);
12+
};
13+
}

Projects/BooksLibrary/src/common/response.handler.ts

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@ export class ResponseHandler {
2929
Message: msg,
3030
HttpCode: httpErrorCode ? httpErrorCode : 500,
3131
Trace: trace_path,
32-
User: request ? request.currentUser : null,
33-
Context: request ? request.context : null,
32+
User: null,
33+
Context: 'request ? request.context : null',
3434
Request: {
3535
Method: request ? request.method : null,
3636
Host: request ? request.hostname : null,
@@ -73,8 +73,8 @@ export class ResponseHandler {
7373
HttpCode: httpCode ?? 200,
7474
Data: data ?? null,
7575
Trace: null,
76-
User: request ? request.currentUser : null,
77-
Context: request ? request.context : null,
76+
User: null,
77+
Context: 'request ? request.context : null',
7878
Request: {
7979
Method: request ? request.method : null,
8080
Host: request ? request.hostname : null,
@@ -89,10 +89,11 @@ export class ResponseHandler {
8989
};
9090

9191
if (process.env.NODE_ENV !== 'test') {
92+
const logObj = { ...responseObject };
9293
if (!logDataObject) {
93-
responseObject.Data = null;
94+
logObj.Data = null;
9495
}
95-
Logger.instance().log(JSON.stringify(responseObject, null, 2));
96+
Logger.instance().log(JSON.stringify(logObj, null, 2));
9697
}
9798

9899
ActivityRecorder.record(responseObject);
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import { UserDomainModel } from 'domain.types/user/user.domain.model';
2+
import { UserDetailsDto } from 'domain.types/user/user.dto';
3+
4+
export interface IUserRepo {
5+
findUsersByRoleId(id: string): Promise<UserDetailsDto[]>;
6+
createUser(userDetails: UserDomainModel): Promise<UserDetailsDto>;
7+
}

0 commit comments

Comments
 (0)