Skip to content

Commit f04bd21

Browse files
author
Lionel Dcosta
committed
First commit
0 parents  commit f04bd21

38 files changed

+8918
-0
lines changed

.editorconfig

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
root = true
2+
3+
[*]
4+
charset = utf-8
5+
indent_style = space
6+
indent_size = 2
7+
end_of_line = lf
8+
insert_final_newline = true
9+
trim_trailing_whitespace = true
10+

.env.example

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
BASEURL=http://localhost
2+
NODE_ENV=development
3+
LOG_LEVEL=debug

.gitignore

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
# Logs
2+
logs
3+
*.log
4+
npm-debug.log*
5+
yarn-debug.log*
6+
yarn-error.log*
7+
8+
# Runtime data
9+
pids
10+
*.pid
11+
*.seed
12+
*.pid.lock
13+
14+
# Directory for instrumented libs generated by jscoverage/JSCover
15+
lib-cov
16+
17+
# Coverage directory used by tools like istanbul
18+
coverage
19+
20+
# nyc test coverage
21+
.nyc_output
22+
23+
# node-waf configuration
24+
.lock-wscript
25+
26+
# Dependency directories
27+
node_modules/
28+
29+
# Optional npm cache directory
30+
.npm
31+
32+
# Optional REPL history
33+
.node_repl_history
34+
35+
# Output of 'npm pack'
36+
*.tgz
37+
38+
# dotenv environment variables file
39+
.env
40+
41+
# vscode
42+
.vscode
43+
.vs
44+
45+
# output dirs
46+
build/
47+
48+
# config files
49+
config/local*
50+

.npmrc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
loglevel="silent"

.prettierrc.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
module.exports = {
2+
semi: true,
3+
trailingComma: 'all',
4+
singleQuote: true,
5+
printWidth: 120,
6+
tabWidth: 2,
7+
bracketSpacing: true
8+
};
9+

README.md

Whitespace-only changes.

nodemon.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"exec": "node -r ts-node/register ./src/bootstrap/index",
3+
"ext": "ts",
4+
"ignore": ["/**/*.spec.ts"],
5+
"legacyWatch": true
6+
}

package.json

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
{
2+
"name": "blue-app",
3+
"version": "0.0.1",
4+
"description": "Blue App",
5+
"main": "src/bootstrap/index",
6+
"license": "ISC",
7+
"scripts": {
8+
"build": "tsc -p tsconfig.json",
9+
"start-dev": "nodemon",
10+
"start-prod": "yarn build && npx pm2 start pm2.yaml",
11+
"inspect": "nodemon --inspect src/bootstrap/index",
12+
"test": "mocha --require ts-node/register --require ts-jest --require source-map-support/register --watch-extensions ts --forbid-only --full-trace --bail --check-leaks --reporter list --timeout 10000 --recursive tests",
13+
"jest": "jest",
14+
"format": "prettier --write './src/**/**/*.ts'",
15+
"tslint": "tslint -c tslint.json -p tsconfig.json",
16+
"precise-commits": "precise-commits --check-only"
17+
},
18+
"devDependencies": {
19+
"@types/chai": "^4.1.7",
20+
"@types/chai-as-promised": "^7.1.0",
21+
"@types/express": "^4.16.1",
22+
"@types/http-server": "^0.10.0",
23+
"@types/ip": "^1.1.0",
24+
"@types/jest": "^24.0.15",
25+
"@types/lodash": "^4.14.133",
26+
"@types/node": "^12.0.4",
27+
"@types/pg": "^7.4.14",
28+
"@types/sinon-as-promised": "^4.0.12",
29+
"@types/supertest": "^2.0.7",
30+
"@typescript-eslint/eslint-plugin": "^1.9.0",
31+
"@typescript-eslint/parser": "^1.9.0",
32+
"chai": "^4.2.0",
33+
"chai-as-promised": "^7.1.1",
34+
"eslint": "^5.16.0",
35+
"eslint-config-prettier": "^4.3.0",
36+
"eslint-plugin-prettier": "^3.1.0",
37+
"jest": "^24.8.0",
38+
"mocha": "^6.1.4",
39+
"nodemon": "^1.19.1",
40+
"npx": "^10.2.0",
41+
"prettier": "^1.17.1",
42+
"qs": "^6.7.0",
43+
"sinon": "^7.3.2",
44+
"sinon-as-promised": "^4.0.3",
45+
"supertest": "^4.0.2",
46+
"ts-jest": "^24.0.2",
47+
"ts-node": "^8.2.0",
48+
"tslint": "^5.17.0",
49+
"tslint-config-prettier": "^1.18.0",
50+
"typescript": "^3.5.1"
51+
},
52+
"dependencies": {
53+
"compression": "^1.7.4",
54+
"cors": "^2.8.5",
55+
"dotenv-safe": "^6.1.0",
56+
"express": "^4.17.1",
57+
"helmet": "^3.18.0",
58+
"http": "^0.0.0",
59+
"module-alias": "^2.2.0",
60+
"morgan": "^1.9.1",
61+
"pg": "^7.11.0",
62+
"pm2": "^3.5.1",
63+
"reflect-metadata": "^0.1.13",
64+
"swagger-jsdoc": "^3.2.9",
65+
"swagger-ui-express": "^4.0.6",
66+
"typedi": "^0.8.0",
67+
"winston": "^3.2.1"
68+
},
69+
"husky": {
70+
"hooks": {
71+
"pre-commit": "yarn tslint && yarn precise-commits"
72+
}
73+
},
74+
"_moduleAliases": {
75+
"@interfaces/*": "./src/interfaces/*",
76+
"@cfg/*": "./src/cfg/*"
77+
}
78+
}

pm2.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
apps:
2+
- script: ./build/bootstrap/index.js
3+
instances: max
4+
exec_mode: cluster

src/api/index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import StatusRoute from './v1/status/index';
2+
3+
export default [...StatusRoute];

src/api/v1/index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export const version = 'v1';
2+
export const prefix = 'api';
3+
export const path = `/${prefix}/${version}`;

src/api/v1/status/index.ts

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
import { Request, Response, NextFunction } from 'express';
2+
import { Container } from 'typedi';
3+
import statusService from './../../../services/status';
4+
import { path } from './../index';
5+
6+
/**
7+
* @swagger
8+
*
9+
* definition:
10+
* status:
11+
* properties:
12+
* status:
13+
* type: object
14+
* properties:
15+
* apiStatus:
16+
* type: string
17+
* /status:
18+
* get:
19+
* tags:
20+
* - "status"
21+
* summary: "return the status of server"
22+
* consumes:
23+
* - "application/json"
24+
* produces:
25+
* - "application/json"
26+
* responses:
27+
* 200:
28+
* description: "Successful operation"
29+
* schema:
30+
* $ref: '#/definitions/status'
31+
* 500:
32+
* description: "Error connecting the all the resources"
33+
*/
34+
35+
export default [
36+
{
37+
path: `${path}/status`,
38+
method: 'get',
39+
handler: [
40+
async (Req: Request, res: Response, next: NextFunction) => {
41+
try {
42+
let statusServiceInstance = Container.get(statusService);
43+
let apiStatus = await statusServiceInstance.status();
44+
res.json({ status: apiStatus }).status(200);
45+
} catch (error) {
46+
console.log('error detected', error);
47+
next(error);
48+
}
49+
},
50+
],
51+
},
52+
];

src/bootstrap/index.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import 'reflect-metadata';
2+
3+
//import 'module-alias/register';
4+
import * as express from 'express';
5+
import { createServer } from 'http';
6+
import { middlewareLoader } from './middleware';
7+
import { handleServerExit, handleExceptions } from './middleware/errorMiddleware';
8+
import Config from './../cfg';
9+
10+
async function startServer() {
11+
let app = express();
12+
13+
await middlewareLoader(app);
14+
15+
let server = createServer(app);
16+
17+
server.listen(Config.api.port);
18+
19+
process.on('unhandledRejection', handleExceptions);
20+
process.on('uncaughtException', handleExceptions);
21+
process.on('SIGINT', handleServerExit('SIGINT', server));
22+
process.on('SIGTERM', handleServerExit('SIGTERM', server));
23+
}
24+
25+
startServer();

src/bootstrap/middleware/apiDocs.ts

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import { Router } from 'express';
2+
import * as swaggerUi from 'swagger-ui-express';
3+
//import * as swaggerDocument from '../../util/swagger.json';
4+
import * as swaggerJsdoc from 'swagger-jsdoc';
5+
6+
const options = {
7+
swaggerDefinition: {
8+
// Like the one described here: http://swagger.io/specification/#infoObject
9+
info: {
10+
title: 'API Documentation',
11+
version: '0.0.1',
12+
description: "Documentation to check & verify the api's",
13+
},
14+
host: 'localhost:3000',
15+
basePath: '/api/v1',
16+
tags: [
17+
{
18+
name: 'status',
19+
description: 'Get the server status',
20+
},
21+
],
22+
schemes: {
23+
http: 'http',
24+
},
25+
},
26+
// List of files to be processes. You can also set globs './routes/*.js'
27+
apis: ['src/api/v1/*/*.ts'],
28+
};
29+
30+
const specs = swaggerJsdoc(options);
31+
32+
const handleAPIDocs = (router: Router) => {
33+
router.use('/api-docs', swaggerUi.serve);
34+
router.get('/api-docs', swaggerUi.setup(specs));
35+
};
36+
37+
export default [handleAPIDocs];
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { Router, Request, Response, NextFunction } from 'express';
2+
3+
const dataFormat = (router: Router) => {
4+
router.use((req: Request, res: Response, next: NextFunction) => {
5+
req._data = [];
6+
next();
7+
});
8+
};
9+
10+
const resFormat = (router: Router) => {
11+
router.use((req: Request, res: Response, next: NextFunction) => {
12+
res.api = {
13+
status: 200,
14+
errors: [],
15+
data: [] || {},
16+
};
17+
next();
18+
});
19+
};
20+
21+
export default [dataFormat, resFormat];
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import { Container } from 'typedi';
2+
import { Logger } from 'winston';
3+
import { Pool } from 'pg';
4+
5+
//set the db connection here
6+
//set the logger here
7+
8+
type Models = {};
9+
10+
export default ({ models, logger, db }: { models: Models[]; logger: Logger; db: Pool }) => {
11+
try {
12+
models &&
13+
models.forEach(model => {
14+
Container.set(model);
15+
});
16+
17+
Container.set('logger', logger);
18+
Container.set('db', db);
19+
} catch (e) {
20+
console.log('🔥 Error on dependency injector loader %o', e);
21+
throw e;
22+
}
23+
};
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import * as pg from 'pg';
2+
import { Logger } from 'winston';
3+
import { Container } from 'typedi';
4+
import cfg from './../../../cfg';
5+
6+
const config = {
7+
user: cfg.db.user, //this is the db user credential
8+
database: cfg.db.database,
9+
password: cfg.db.password,
10+
port: cfg.db.port,
11+
max: cfg.db.max, // max number of clients in the pool
12+
idleTimeoutMillis: cfg.db.idleTimeoutMillis,
13+
};
14+
15+
const pool = new pg.Pool(config);
16+
17+
pool.on('connect', () => {
18+
console.log('connected to the Database');
19+
});
20+
21+
pool.on('error', function(err, client) {
22+
console.error('idle client error', err.message, err.stack);
23+
if (err) {
24+
const logger: Logger = Container.get('logger');
25+
logger.error('500', {
26+
method: '',
27+
url: '',
28+
query: '',
29+
ip: '',
30+
error: err.message,
31+
stack: err.stack,
32+
});
33+
}
34+
});
35+
36+
export default pool;
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import StatusModel from './../../../core/status';
2+
3+
export const statusDI = {
4+
StatusModel,
5+
};

0 commit comments

Comments
 (0)