typescript-express-starter 6.1.0 → 7.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.kr.md +122 -53
- package/README.md +127 -59
- package/bin/cli.js +4 -3
- package/lib/default/.swcrc +41 -0
- package/lib/default/Dockerfile +1 -1
- package/lib/default/ecosystem.config.js +40 -24
- package/lib/default/nodemon.json +2 -2
- package/lib/default/package.json +15 -8
- package/lib/default/src/app.ts +1 -2
- package/lib/default/src/http/auth.http +12 -15
- package/lib/default/src/http/users.http +12 -16
- package/lib/default/src/index.ts +1 -0
- package/lib/default/src/middlewares/auth.middleware.ts +3 -3
- package/lib/default/src/models/users.model.ts +5 -5
- package/lib/default/src/server.ts +1 -2
- package/lib/default/src/services/auth.service.ts +5 -5
- package/lib/default/src/services/users.service.ts +3 -3
- package/lib/default/src/tests/auth.test.ts +4 -4
- package/lib/default/src/tests/users.test.ts +4 -4
- package/lib/default/src/utils/logger.ts +5 -5
- package/lib/default/tsconfig.json +2 -2
- package/lib/graphql/.dockerignore +18 -0
- package/lib/graphql/.editorconfig +9 -0
- package/lib/graphql/.env +1 -0
- package/lib/graphql/.eslintignore +1 -0
- package/lib/graphql/.eslintrc +18 -0
- package/lib/graphql/.huskyrc +5 -0
- package/lib/graphql/.lintstagedrc.json +5 -0
- package/lib/graphql/.prettierrc +8 -0
- package/lib/graphql/.swcrc +39 -0
- package/lib/graphql/.vscode/launch.json +35 -0
- package/lib/graphql/.vscode/settings.json +6 -0
- package/lib/graphql/Dockerfile +24 -0
- package/lib/graphql/Makefile +6 -0
- package/lib/graphql/docker-compose.yml +50 -0
- package/lib/graphql/ecosystem.config.js +59 -0
- package/lib/graphql/jest.config.js +12 -0
- package/lib/graphql/nginx.conf +40 -0
- package/lib/graphql/nodemon.json +12 -0
- package/lib/graphql/package.json +79 -0
- package/lib/graphql/src/app.ts +105 -0
- package/lib/graphql/src/configs/development.json +19 -0
- package/lib/graphql/src/configs/production.json +19 -0
- package/lib/graphql/src/configs/test.json +19 -0
- package/lib/graphql/src/databases/index.ts +24 -0
- package/lib/graphql/src/dtos/users.dto.ts +14 -0
- package/lib/{typeorm/src/entity → graphql/src/entities}/users.entity.ts +3 -3
- package/lib/graphql/src/exceptions/HttpException.ts +10 -0
- package/lib/graphql/src/http/auth.http +49 -0
- package/lib/graphql/src/http/users.http +78 -0
- package/lib/graphql/src/index.ts +1 -0
- package/lib/graphql/src/interfaces/auth.interface.ts +14 -0
- package/lib/graphql/src/interfaces/db.interface.ts +7 -0
- package/lib/graphql/src/interfaces/users.interface.ts +5 -0
- package/lib/graphql/src/middlewares/auth.middleware.ts +32 -0
- package/lib/graphql/src/middlewares/error.middleware.ts +17 -0
- package/lib/graphql/src/repositories/auth.repository.ts +61 -0
- package/lib/graphql/src/repositories/users.repository.ts +60 -0
- package/lib/graphql/src/resolvers/auth.resolver.ts +32 -0
- package/lib/graphql/src/resolvers/users.resolver.ts +47 -0
- package/lib/graphql/src/server.ts +14 -0
- package/lib/graphql/src/tests/auth.test.ts +52 -0
- package/lib/graphql/src/tests/index.test.ts +18 -0
- package/lib/graphql/src/tests/users.test.ts +71 -0
- package/lib/graphql/src/typedefs/users.type.ts +13 -0
- package/lib/graphql/src/utils/logger.ts +75 -0
- package/lib/graphql/src/utils/util.ts +19 -0
- package/lib/graphql/src/utils/validateEnv.ts +10 -0
- package/lib/graphql/tsconfig.json +39 -0
- package/lib/knex/.swcrc +39 -0
- package/lib/knex/Dockerfile +1 -1
- package/lib/knex/ecosystem.config.js +57 -43
- package/lib/knex/knexfile.ts +6 -6
- package/lib/knex/nodemon.json +2 -2
- package/lib/knex/package.json +14 -8
- package/lib/knex/src/app.ts +2 -3
- package/lib/knex/src/databases/index.ts +6 -6
- package/lib/knex/src/http/auth.http +12 -15
- package/lib/knex/src/http/users.http +12 -16
- package/lib/knex/src/index.ts +1 -0
- package/lib/knex/src/middlewares/auth.middleware.ts +4 -4
- package/lib/knex/src/server.ts +1 -2
- package/lib/knex/src/services/auth.service.ts +5 -5
- package/lib/knex/src/services/users.service.ts +3 -3
- package/lib/knex/src/tests/auth.test.ts +2 -2
- package/lib/knex/src/tests/index.test.ts +1 -1
- package/lib/knex/src/tests/users.test.ts +2 -2
- package/lib/knex/src/utils/logger.ts +5 -5
- package/lib/knex/tsconfig.json +2 -2
- package/lib/mongoose/.swcrc +39 -0
- package/lib/mongoose/Dockerfile +1 -1
- package/lib/mongoose/docker-compose.yml +0 -4
- package/lib/mongoose/ecosystem.config.js +42 -27
- package/lib/mongoose/nodemon.json +2 -2
- package/lib/mongoose/package.json +15 -8
- package/lib/mongoose/src/app.ts +2 -3
- package/lib/mongoose/src/configs/development.json +1 -1
- package/lib/mongoose/src/configs/production.json +1 -1
- package/lib/mongoose/src/configs/test.json +1 -1
- package/lib/mongoose/src/http/auth.http +32 -0
- package/lib/mongoose/src/http/users.http +34 -0
- package/lib/mongoose/src/index.ts +1 -0
- package/lib/mongoose/src/middlewares/auth.middleware.ts +3 -3
- package/lib/mongoose/src/server.ts +1 -2
- package/lib/mongoose/src/services/auth.service.ts +5 -5
- package/lib/mongoose/src/services/users.service.ts +3 -3
- package/lib/mongoose/src/utils/logger.ts +5 -5
- package/lib/mongoose/tsconfig.json +2 -2
- package/lib/prisma/.env +1 -1
- package/lib/prisma/.swcrc +37 -0
- package/lib/prisma/Dockerfile +1 -1
- package/lib/prisma/docker-compose.yml +1 -6
- package/lib/prisma/ecosystem.config.js +40 -24
- package/lib/prisma/nodemon.json +2 -2
- package/lib/prisma/package.json +17 -10
- package/lib/prisma/src/app.ts +2 -3
- package/lib/prisma/src/http/auth.http +12 -15
- package/lib/prisma/src/http/users.http +12 -16
- package/lib/prisma/src/index.ts +1 -0
- package/lib/prisma/src/middlewares/auth.middleware.ts +4 -4
- package/lib/prisma/src/server.ts +1 -2
- package/lib/prisma/src/services/auth.service.ts +5 -5
- package/lib/prisma/src/services/users.service.ts +3 -3
- package/lib/prisma/src/utils/logger.ts +5 -5
- package/lib/prisma/tsconfig.json +2 -2
- package/lib/routing-controllers/.swcrc +37 -0
- package/lib/routing-controllers/Dockerfile +1 -1
- package/lib/routing-controllers/ecosystem.config.js +40 -24
- package/lib/routing-controllers/nodemon.json +2 -2
- package/lib/routing-controllers/package.json +15 -9
- package/lib/routing-controllers/src/app.ts +3 -4
- package/lib/routing-controllers/src/http/auth.http +12 -15
- package/lib/routing-controllers/src/http/users.http +12 -16
- package/lib/routing-controllers/src/index.ts +1 -0
- package/lib/routing-controllers/src/middlewares/auth.middleware.ts +3 -3
- package/lib/routing-controllers/src/middlewares/validation.middleware.ts +10 -2
- package/lib/routing-controllers/src/models/users.model.ts +5 -5
- package/lib/routing-controllers/src/server.ts +1 -3
- package/lib/routing-controllers/src/services/auth.service.ts +5 -5
- package/lib/routing-controllers/src/services/users.service.ts +3 -3
- package/lib/routing-controllers/src/utils/logger.ts +5 -5
- package/lib/routing-controllers/tsconfig.json +2 -2
- package/lib/sequelize/.swcrc +39 -0
- package/lib/sequelize/Dockerfile +1 -1
- package/lib/sequelize/docker-compose.yml +1 -6
- package/lib/sequelize/ecosystem.config.js +42 -27
- package/lib/sequelize/nodemon.json +2 -2
- package/lib/sequelize/package.json +15 -8
- package/lib/sequelize/src/app.ts +1 -2
- package/lib/sequelize/src/configs/development.json +2 -2
- package/lib/sequelize/src/configs/production.json +1 -1
- package/lib/sequelize/src/configs/test.json +1 -1
- package/lib/sequelize/src/http/auth.http +32 -0
- package/lib/sequelize/src/http/users.http +34 -0
- package/lib/sequelize/src/index.ts +1 -0
- package/lib/sequelize/src/middlewares/auth.middleware.ts +4 -4
- package/lib/sequelize/src/server.ts +1 -2
- package/lib/sequelize/src/services/auth.service.ts +5 -5
- package/lib/sequelize/src/services/users.service.ts +3 -3
- package/lib/sequelize/src/utils/logger.ts +5 -5
- package/lib/sequelize/tsconfig.json +2 -2
- package/lib/starter.js +5 -9
- package/lib/typeorm/.swcrc +39 -0
- package/lib/typeorm/Dockerfile +1 -1
- package/lib/typeorm/docker-compose.yml +1 -1
- package/lib/typeorm/ecosystem.config.js +42 -27
- package/lib/typeorm/nodemon.json +2 -2
- package/lib/typeorm/package.json +15 -8
- package/lib/typeorm/src/app.ts +1 -2
- package/lib/typeorm/src/configs/development.json +1 -1
- package/lib/typeorm/src/configs/production.json +1 -1
- package/lib/typeorm/src/configs/test.json +1 -1
- package/lib/typeorm/src/databases/index.ts +5 -5
- package/lib/typeorm/src/entities/users.entity.ts +26 -0
- package/lib/typeorm/src/http/auth.http +12 -15
- package/lib/typeorm/src/http/users.http +12 -16
- package/lib/typeorm/src/index.ts +1 -0
- package/lib/typeorm/src/middlewares/auth.middleware.ts +5 -9
- package/lib/typeorm/src/server.ts +1 -2
- package/lib/typeorm/src/services/auth.service.ts +13 -17
- package/lib/typeorm/src/services/users.service.ts +16 -22
- package/lib/typeorm/src/utils/logger.ts +5 -5
- package/lib/typeorm/tsconfig.json +3 -3
- package/package.json +13 -4
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"pretty": true,
|
|
14
14
|
"sourceMap": true,
|
|
15
15
|
"declaration": true,
|
|
16
|
-
"outDir": "
|
|
16
|
+
"outDir": "dist",
|
|
17
17
|
"allowJs": true,
|
|
18
18
|
"noEmit": false,
|
|
19
19
|
"esModuleInterop": true,
|
|
@@ -35,5 +35,5 @@
|
|
|
35
35
|
}
|
|
36
36
|
},
|
|
37
37
|
"include": ["src/**/*.ts", "src/**/*.json", ".env"],
|
|
38
|
-
"exclude": ["node_modules"]
|
|
38
|
+
"exclude": ["node_modules", "src/http", "src/logs", "src/tests"]
|
|
39
39
|
}
|
package/lib/starter.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
/*****************************************************************
|
|
2
|
-
* Create
|
|
3
|
-
*
|
|
4
|
-
*
|
|
2
|
+
* Create Typescript Express Starter
|
|
3
|
+
* 2019.12.18 ~ 🎮
|
|
4
|
+
* Made By AGUMON 🦖
|
|
5
|
+
* https://github.com/ljlm0402/typescript-express-starter
|
|
5
6
|
*****************************************************************/
|
|
6
7
|
|
|
7
8
|
const chalk = require("chalk");
|
|
@@ -44,14 +45,11 @@ const createProject = async (projectName) => {
|
|
|
44
45
|
spinner = ora();
|
|
45
46
|
spinner.start();
|
|
46
47
|
|
|
47
|
-
// manage node_modules
|
|
48
48
|
await installNodeModules(projectName, spinner);
|
|
49
49
|
isUpdated && (await updateNodeModules(projectName, spinner));
|
|
50
50
|
isDeduped && (await dedupeNodeModules(projectName, spinner));
|
|
51
|
-
|
|
52
51
|
await postInstallScripts(projectName, template, spinner);
|
|
53
52
|
|
|
54
|
-
// set gitignore
|
|
55
53
|
await createGitignore(projectName, spinner);
|
|
56
54
|
await initGit(projectName);
|
|
57
55
|
|
|
@@ -183,9 +181,7 @@ const postInstallScripts = async (destination, template, spinner) => {
|
|
|
183
181
|
case "prisma":
|
|
184
182
|
{
|
|
185
183
|
spinner.text = "Run prisma generate...";
|
|
186
|
-
await asyncExec("
|
|
187
|
-
cwd: destination,
|
|
188
|
-
});
|
|
184
|
+
await asyncExec("npm run prisma:generate", { cwd: destination });
|
|
189
185
|
}
|
|
190
186
|
break;
|
|
191
187
|
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{
|
|
2
|
+
"jsc": {
|
|
3
|
+
"parser": {
|
|
4
|
+
"syntax": "typescript",
|
|
5
|
+
"tsx": false,
|
|
6
|
+
"dynamicImport": true,
|
|
7
|
+
"decorators": true
|
|
8
|
+
},
|
|
9
|
+
"transform": {
|
|
10
|
+
"legacyDecorator": true,
|
|
11
|
+
"decoratorMetadata": true
|
|
12
|
+
},
|
|
13
|
+
"target": "es2017",
|
|
14
|
+
"externalHelpers": false,
|
|
15
|
+
"keepClassNames": true,
|
|
16
|
+
"loose": false,
|
|
17
|
+
"minify": {
|
|
18
|
+
"compress": false,
|
|
19
|
+
"mangle": false
|
|
20
|
+
},
|
|
21
|
+
"baseUrl": "src",
|
|
22
|
+
"paths": {
|
|
23
|
+
"@/*": ["*"],
|
|
24
|
+
"@controllers/*": ["controllers/*"],
|
|
25
|
+
"@databases": ["databases"],
|
|
26
|
+
"@dtos/*": ["dtos/*"],
|
|
27
|
+
"@entities/*": ["entities/*"],
|
|
28
|
+
"@exceptions/*": ["exceptions/*"],
|
|
29
|
+
"@interfaces/*": ["interfaces/*"],
|
|
30
|
+
"@middlewares/*": ["middlewares/*"],
|
|
31
|
+
"@routes/*": ["routes/*"],
|
|
32
|
+
"@services/*": ["services/*"],
|
|
33
|
+
"@utils/*": ["utils/*"]
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
"module": {
|
|
37
|
+
"type": "commonjs"
|
|
38
|
+
}
|
|
39
|
+
}
|
package/lib/typeorm/Dockerfile
CHANGED
|
@@ -1,42 +1,57 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* @description pm2 configuration file.
|
|
3
|
+
* @example
|
|
4
|
+
* production mode :: pm2 start ecosystem.config.js --only prod
|
|
5
|
+
* development mode :: pm2 start ecosystem.config.js --only dev
|
|
6
|
+
*/
|
|
7
|
+
module.exports = {
|
|
2
8
|
apps: [
|
|
3
9
|
{
|
|
4
|
-
name: '
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
instances: 2,
|
|
9
|
-
autorestart: true,
|
|
10
|
-
watch: false,
|
|
11
|
-
|
|
12
|
-
//
|
|
13
|
-
// pm2
|
|
14
|
-
|
|
15
|
-
|
|
10
|
+
name: 'prod', // pm2 start App name
|
|
11
|
+
script: 'dist/server.js',
|
|
12
|
+
exec_mode: 'cluster', // 'cluster' or 'fork'
|
|
13
|
+
instance_var: 'INSTANCE_ID', // instance variable
|
|
14
|
+
instances: 2, // pm2 instance count
|
|
15
|
+
autorestart: true, // auto restart if process crash
|
|
16
|
+
watch: false, // files change automatic restart
|
|
17
|
+
ignore_watch: ['node_modules', 'logs'], // ignore files change
|
|
18
|
+
max_memory_restart: '1G', // restart if process use more than 1G memory
|
|
19
|
+
merge_logs: true, // if true, stdout and stderr will be merged and sent to pm2 log
|
|
20
|
+
output: './logs/access.log', // pm2 log file
|
|
21
|
+
error: './logs/error.log', // pm2 error log file
|
|
22
|
+
env: { // environment variable
|
|
16
23
|
PORT: 3000,
|
|
17
|
-
NODE_ENV: '
|
|
24
|
+
NODE_ENV: 'production',
|
|
18
25
|
},
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
name: 'dev', // pm2 start App name
|
|
29
|
+
script: 'ts-node', // ts-node
|
|
30
|
+
args: '-r tsconfig-paths/register --transpile-only src/server.ts', // ts-node args
|
|
31
|
+
exec_mode: 'cluster', // 'cluster' or 'fork'
|
|
32
|
+
instance_var: 'INSTANCE_ID', // instance variable
|
|
33
|
+
instances: 2, // pm2 instance count
|
|
34
|
+
autorestart: true, // auto restart if process crash
|
|
35
|
+
watch: false, // files change automatic restart
|
|
36
|
+
ignore_watch: ['node_modules', 'logs'], // ignore files change
|
|
37
|
+
max_memory_restart: '1G', // restart if process use more than 1G memory
|
|
38
|
+
merge_logs: true, // if true, stdout and stderr will be merged and sent to pm2 log
|
|
39
|
+
output: './logs/access.log', // pm2 log file
|
|
40
|
+
error: './logs/error.log', // pm2 error log file
|
|
41
|
+
env: { // environment variable
|
|
23
42
|
PORT: 3000,
|
|
24
|
-
NODE_ENV: '
|
|
43
|
+
NODE_ENV: 'development',
|
|
25
44
|
},
|
|
26
|
-
output: './logs/console.log',
|
|
27
|
-
error: './logs/consoleError.log',
|
|
28
45
|
},
|
|
29
46
|
],
|
|
30
|
-
|
|
31
47
|
deploy: {
|
|
32
48
|
production: {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
host: '123.12.123.1',
|
|
49
|
+
user: 'user',
|
|
50
|
+
host: '0.0.0.0',
|
|
36
51
|
ref: 'origin/master',
|
|
37
52
|
repo: 'git@github.com:repo.git',
|
|
38
|
-
path: '/
|
|
39
|
-
'post-deploy': 'npm install && pm2 reload ecosystem.config.js --
|
|
53
|
+
path: 'dist/server.js',
|
|
54
|
+
'post-deploy': 'npm install && npm run build && pm2 reload ecosystem.config.js --only prod',
|
|
40
55
|
},
|
|
41
56
|
},
|
|
42
57
|
};
|
package/lib/typeorm/nodemon.json
CHANGED
package/lib/typeorm/package.json
CHANGED
|
@@ -7,10 +7,13 @@
|
|
|
7
7
|
"scripts": {
|
|
8
8
|
"start": "npm run build && cross-env NODE_ENV=production node dist/server.js",
|
|
9
9
|
"dev": "cross-env NODE_ENV=development nodemon",
|
|
10
|
-
"build": "
|
|
10
|
+
"build": "swc src -d dist --source-maps --copy-files",
|
|
11
|
+
"build:tsc": "tsc && tsc-alias",
|
|
11
12
|
"test": "jest --forceExit --detectOpenHandles",
|
|
12
13
|
"lint": "eslint --ignore-path .gitignore --ext .ts src/",
|
|
13
|
-
"lint:fix": "npm run lint -- --fix"
|
|
14
|
+
"lint:fix": "npm run lint -- --fix",
|
|
15
|
+
"deploy:prod": "npm run build && pm2 start ecosystem.config.js --only prod",
|
|
16
|
+
"deploy:dev": "pm2 start ecosystem.config.js --only dev"
|
|
14
17
|
},
|
|
15
18
|
"dependencies": {
|
|
16
19
|
"bcrypt": "^5.0.1",
|
|
@@ -20,27 +23,24 @@
|
|
|
20
23
|
"config": "^3.3.6",
|
|
21
24
|
"cookie-parser": "^1.4.5",
|
|
22
25
|
"cors": "^2.8.5",
|
|
23
|
-
"cross-env": "^7.0.3",
|
|
24
26
|
"dotenv": "^10.0.0",
|
|
25
27
|
"envalid": "^7.1.0",
|
|
26
28
|
"express": "^4.17.1",
|
|
27
29
|
"helmet": "^4.6.0",
|
|
28
30
|
"hpp": "^0.2.3",
|
|
29
|
-
"jest": "^27.0.6",
|
|
30
31
|
"jsonwebtoken": "^8.5.1",
|
|
31
32
|
"morgan": "^1.10.0",
|
|
32
33
|
"pg": "^8.6.0",
|
|
33
34
|
"reflect-metadata": "^0.1.13",
|
|
34
35
|
"swagger-jsdoc": "^6.0.0",
|
|
35
36
|
"swagger-ui-express": "^4.1.6",
|
|
36
|
-
"ts-jest": "^27.0.3",
|
|
37
|
-
"ts-node": "^10.0.0",
|
|
38
37
|
"typeorm": "^0.2.34",
|
|
39
|
-
"typescript": "^4.3.5",
|
|
40
38
|
"winston": "^3.3.3",
|
|
41
39
|
"winston-daily-rotate-file": "^4.5.5"
|
|
42
40
|
},
|
|
43
41
|
"devDependencies": {
|
|
42
|
+
"@swc/cli": "^0.1.51",
|
|
43
|
+
"@swc/core": "^1.2.108",
|
|
44
44
|
"@types/bcrypt": "^5.0.0",
|
|
45
45
|
"@types/compression": "^1.7.1",
|
|
46
46
|
"@types/config": "^0.0.39",
|
|
@@ -60,16 +60,23 @@
|
|
|
60
60
|
"@types/winston": "^2.4.4",
|
|
61
61
|
"@typescript-eslint/eslint-plugin": "^4.28.2",
|
|
62
62
|
"@typescript-eslint/parser": "^4.28.2",
|
|
63
|
+
"cross-env": "^7.0.3",
|
|
63
64
|
"eslint": "^7.30.0",
|
|
64
65
|
"eslint-config-prettier": "^8.3.0",
|
|
65
66
|
"eslint-plugin-prettier": "^3.4.0",
|
|
66
67
|
"husky": "^7.0.1",
|
|
68
|
+
"jest": "^27.0.6",
|
|
67
69
|
"lint-staged": "^11.0.0",
|
|
68
70
|
"node-config": "^0.0.2",
|
|
69
71
|
"node-gyp": "^8.1.0",
|
|
70
72
|
"nodemon": "^2.0.9",
|
|
73
|
+
"pm2": "^5.1.0",
|
|
71
74
|
"prettier": "^2.3.2",
|
|
72
75
|
"supertest": "^6.1.3",
|
|
73
|
-
"
|
|
76
|
+
"ts-jest": "^27.0.7",
|
|
77
|
+
"ts-node": "^10.4.0",
|
|
78
|
+
"tsc-alias": "^1.4.1",
|
|
79
|
+
"tsconfig-paths": "^3.10.1",
|
|
80
|
+
"typescript": "^4.5.2"
|
|
74
81
|
}
|
|
75
82
|
}
|
package/lib/typeorm/src/app.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import config from 'config';
|
|
2
|
-
import
|
|
2
|
+
import { join } from 'path';
|
|
3
3
|
import { ConnectionOptions } from 'typeorm';
|
|
4
4
|
import { dbConfig } from '@interfaces/db.interface';
|
|
5
5
|
|
|
@@ -13,11 +13,11 @@ export const dbConnection: ConnectionOptions = {
|
|
|
13
13
|
database: database,
|
|
14
14
|
synchronize: true,
|
|
15
15
|
logging: false,
|
|
16
|
-
entities: [
|
|
17
|
-
migrations: [
|
|
18
|
-
subscribers: [
|
|
16
|
+
entities: [join(__dirname, '../**/*.entity{.ts,.js}')],
|
|
17
|
+
migrations: [join(__dirname, '../**/*.migration{.ts,.js}')],
|
|
18
|
+
subscribers: [join(__dirname, '../**/*.subscriber{.ts,.js}')],
|
|
19
19
|
cli: {
|
|
20
|
-
entitiesDir: 'src/
|
|
20
|
+
entitiesDir: 'src/entities',
|
|
21
21
|
migrationsDir: 'src/migration',
|
|
22
22
|
subscribersDir: 'src/subscriber',
|
|
23
23
|
},
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { IsNotEmpty } from 'class-validator';
|
|
2
|
+
import { BaseEntity, Entity, PrimaryGeneratedColumn, Column, Unique, CreateDateColumn, UpdateDateColumn } from 'typeorm';
|
|
3
|
+
import { User } from '@interfaces/users.interface';
|
|
4
|
+
|
|
5
|
+
@Entity()
|
|
6
|
+
export class UserEntity extends BaseEntity implements User {
|
|
7
|
+
@PrimaryGeneratedColumn()
|
|
8
|
+
id: number;
|
|
9
|
+
|
|
10
|
+
@Column()
|
|
11
|
+
@IsNotEmpty()
|
|
12
|
+
@Unique(['email'])
|
|
13
|
+
email: string;
|
|
14
|
+
|
|
15
|
+
@Column()
|
|
16
|
+
@IsNotEmpty()
|
|
17
|
+
password: string;
|
|
18
|
+
|
|
19
|
+
@Column()
|
|
20
|
+
@CreateDateColumn()
|
|
21
|
+
createdAt: Date;
|
|
22
|
+
|
|
23
|
+
@Column()
|
|
24
|
+
@UpdateDateColumn()
|
|
25
|
+
updatedAt: Date;
|
|
26
|
+
}
|
|
@@ -1,35 +1,32 @@
|
|
|
1
|
-
# auth API
|
|
2
|
-
|
|
3
|
-
###
|
|
4
1
|
# baseURL
|
|
5
2
|
@baseURL = http://localhost:3000
|
|
6
3
|
|
|
7
4
|
###
|
|
8
|
-
#
|
|
9
|
-
POST {{baseURL}}/signup
|
|
5
|
+
# User Signup
|
|
6
|
+
POST {{ baseURL }}/signup
|
|
10
7
|
Content-Type: application/json
|
|
11
8
|
|
|
12
9
|
{
|
|
13
|
-
"email": "example@
|
|
14
|
-
"password": "
|
|
10
|
+
"email": "example@email.com",
|
|
11
|
+
"password": "password"
|
|
15
12
|
}
|
|
16
13
|
|
|
17
14
|
###
|
|
18
|
-
# Login
|
|
19
|
-
POST {{baseURL}}/login
|
|
15
|
+
# User Login
|
|
16
|
+
POST {{ baseURL }}/login
|
|
20
17
|
Content-Type: application/json
|
|
21
18
|
|
|
22
19
|
{
|
|
23
|
-
"email": "
|
|
24
|
-
"password": "
|
|
20
|
+
"email": "example@email.com",
|
|
21
|
+
"password": "password"
|
|
25
22
|
}
|
|
26
23
|
|
|
27
24
|
###
|
|
28
|
-
# Logout
|
|
29
|
-
POST {{baseURL}}/logout
|
|
25
|
+
# User Logout
|
|
26
|
+
POST {{ baseURL }}/logout
|
|
30
27
|
Content-Type: application/json
|
|
31
28
|
|
|
32
29
|
{
|
|
33
|
-
"email": "
|
|
34
|
-
"password": "
|
|
30
|
+
"email": "example@email.com",
|
|
31
|
+
"password": "password"
|
|
35
32
|
}
|
|
@@ -1,38 +1,34 @@
|
|
|
1
|
-
# users API
|
|
2
|
-
|
|
3
|
-
###
|
|
4
1
|
# baseURL
|
|
5
2
|
@baseURL = http://localhost:3000
|
|
6
3
|
|
|
7
4
|
###
|
|
8
5
|
# Find All Users
|
|
9
|
-
GET {{baseURL}}/users
|
|
6
|
+
GET {{ baseURL }}/users
|
|
10
7
|
|
|
11
8
|
###
|
|
12
9
|
# Find User By Id
|
|
13
|
-
GET {{baseURL}}/users/1
|
|
14
|
-
|
|
10
|
+
GET {{ baseURL }}/users/1
|
|
15
11
|
|
|
16
12
|
###
|
|
17
|
-
#
|
|
18
|
-
POST {{baseURL}}/users
|
|
13
|
+
# Create User
|
|
14
|
+
POST {{ baseURL }}/users
|
|
19
15
|
Content-Type: application/json
|
|
20
16
|
|
|
21
17
|
{
|
|
22
|
-
"email": "example@
|
|
23
|
-
"password": "
|
|
18
|
+
"email": "example@email.com",
|
|
19
|
+
"password": "password"
|
|
24
20
|
}
|
|
25
21
|
|
|
26
22
|
###
|
|
27
|
-
#
|
|
28
|
-
PUT {{baseURL}}/users/1
|
|
23
|
+
# Modify User By Id
|
|
24
|
+
PUT {{ baseURL }}/users/1
|
|
29
25
|
Content-Type: application/json
|
|
30
26
|
|
|
31
27
|
{
|
|
32
|
-
"email": "example@
|
|
33
|
-
"password": "
|
|
28
|
+
"email": "example@email.com",
|
|
29
|
+
"password": "password"
|
|
34
30
|
}
|
|
35
31
|
|
|
36
32
|
###
|
|
37
|
-
#
|
|
38
|
-
DELETE {{baseURL}}/users/1
|
|
33
|
+
# Delete User By Id
|
|
34
|
+
DELETE {{ baseURL }}/users/1
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
process.env['NODE_CONFIG_DIR'] = __dirname + '/configs';
|
|
@@ -1,22 +1,18 @@
|
|
|
1
1
|
import config from 'config';
|
|
2
2
|
import { NextFunction, Response } from 'express';
|
|
3
|
-
import
|
|
4
|
-
import {
|
|
5
|
-
import { UserEntity } from '@entity/users.entity';
|
|
3
|
+
import { verify } from 'jsonwebtoken';
|
|
4
|
+
import { UserEntity } from '@entities/users.entity';
|
|
6
5
|
import { HttpException } from '@exceptions/HttpException';
|
|
7
6
|
import { DataStoredInToken, RequestWithUser } from '@interfaces/auth.interface';
|
|
8
7
|
|
|
9
8
|
const authMiddleware = async (req: RequestWithUser, res: Response, next: NextFunction) => {
|
|
10
9
|
try {
|
|
11
|
-
const Authorization = req.cookies['Authorization'] || req.header('Authorization').split('Bearer ')[1]
|
|
10
|
+
const Authorization = req.cookies['Authorization'] || (req.header('Authorization') ? req.header('Authorization').split('Bearer ')[1] : null);
|
|
12
11
|
|
|
13
12
|
if (Authorization) {
|
|
14
13
|
const secretKey: string = config.get('secretKey');
|
|
15
|
-
const
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
const userRepository = getRepository(UserEntity);
|
|
19
|
-
const findUser = await userRepository.findOne(userId, { select: ['id', 'email', 'password'] });
|
|
14
|
+
const { id } = (await verify(Authorization, secretKey)) as DataStoredInToken;
|
|
15
|
+
const findUser = await UserEntity.findOne(id, { select: ['id', 'email', 'password'] });
|
|
20
16
|
|
|
21
17
|
if (findUser) {
|
|
22
18
|
req.user = findUser;
|
|
@@ -1,37 +1,34 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { compare, hash } from 'bcrypt';
|
|
2
2
|
import config from 'config';
|
|
3
|
-
import
|
|
4
|
-
import {
|
|
3
|
+
import { sign } from 'jsonwebtoken';
|
|
4
|
+
import { EntityRepository, Repository } from 'typeorm';
|
|
5
5
|
import { CreateUserDto } from '@dtos/users.dto';
|
|
6
|
-
import { UserEntity } from '@
|
|
6
|
+
import { UserEntity } from '@entities/users.entity';
|
|
7
7
|
import { HttpException } from '@exceptions/HttpException';
|
|
8
8
|
import { DataStoredInToken, TokenData } from '@interfaces/auth.interface';
|
|
9
9
|
import { User } from '@interfaces/users.interface';
|
|
10
10
|
import { isEmpty } from '@utils/util';
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
12
|
+
@EntityRepository()
|
|
13
|
+
class AuthService extends Repository<UserEntity> {
|
|
15
14
|
public async signup(userData: CreateUserDto): Promise<User> {
|
|
16
15
|
if (isEmpty(userData)) throw new HttpException(400, "You're not userData");
|
|
17
16
|
|
|
18
|
-
const
|
|
19
|
-
const findUser: User = await userRepository.findOne({ where: { email: userData.email } });
|
|
17
|
+
const findUser: User = await UserEntity.findOne({ where: { email: userData.email } });
|
|
20
18
|
if (findUser) throw new HttpException(409, `You're email ${userData.email} already exists`);
|
|
21
19
|
|
|
22
|
-
const hashedPassword = await
|
|
23
|
-
const createUserData: User = await
|
|
20
|
+
const hashedPassword = await hash(userData.password, 10);
|
|
21
|
+
const createUserData: User = await UserEntity.create({ ...userData, password: hashedPassword }).save();
|
|
24
22
|
return createUserData;
|
|
25
23
|
}
|
|
26
24
|
|
|
27
25
|
public async login(userData: CreateUserDto): Promise<{ cookie: string; findUser: User }> {
|
|
28
26
|
if (isEmpty(userData)) throw new HttpException(400, "You're not userData");
|
|
29
27
|
|
|
30
|
-
const
|
|
31
|
-
const findUser: User = await userRepository.findOne({ where: { email: userData.email } });
|
|
28
|
+
const findUser: User = await UserEntity.findOne({ where: { email: userData.email } });
|
|
32
29
|
if (!findUser) throw new HttpException(409, `You're email ${userData.email} not found`);
|
|
33
30
|
|
|
34
|
-
const isPasswordMatching: boolean = await
|
|
31
|
+
const isPasswordMatching: boolean = await compare(userData.password, findUser.password);
|
|
35
32
|
if (!isPasswordMatching) throw new HttpException(409, "You're password not matching");
|
|
36
33
|
|
|
37
34
|
const tokenData = this.createToken(findUser);
|
|
@@ -43,8 +40,7 @@ class AuthService {
|
|
|
43
40
|
public async logout(userData: User): Promise<User> {
|
|
44
41
|
if (isEmpty(userData)) throw new HttpException(400, "You're not userData");
|
|
45
42
|
|
|
46
|
-
const
|
|
47
|
-
const findUser: User = await userRepository.findOne({ where: { email: userData.email, password: userData.password } });
|
|
43
|
+
const findUser: User = await UserEntity.findOne({ where: { email: userData.email, password: userData.password } });
|
|
48
44
|
if (!findUser) throw new HttpException(409, "You're not user");
|
|
49
45
|
|
|
50
46
|
return findUser;
|
|
@@ -55,7 +51,7 @@ class AuthService {
|
|
|
55
51
|
const secretKey: string = config.get('secretKey');
|
|
56
52
|
const expiresIn: number = 60 * 60;
|
|
57
53
|
|
|
58
|
-
return { expiresIn, token:
|
|
54
|
+
return { expiresIn, token: sign(dataStoredInToken, secretKey, { expiresIn }) };
|
|
59
55
|
}
|
|
60
56
|
|
|
61
57
|
public createCookie(tokenData: TokenData): string {
|