typescript-express-starter 8.0.1 → 8.1.3
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 +5 -0
- package/README.md +20 -15
- package/lib/default/.env.development.local +13 -0
- package/lib/default/.env.production.local +13 -0
- package/lib/default/.env.test.local +13 -0
- package/lib/default/.swcrc +1 -0
- package/lib/default/package.json +0 -2
- package/lib/default/src/app.ts +6 -7
- package/lib/default/src/config/index.ts +5 -0
- package/lib/default/src/middlewares/auth.middleware.ts +2 -2
- package/lib/default/src/server.ts +0 -2
- package/lib/default/src/services/auth.service.ts +2 -2
- package/lib/default/src/utils/logger.ts +2 -2
- package/lib/default/tsconfig.json +1 -0
- package/lib/graphql/.env.development.local +20 -0
- package/lib/graphql/.env.production.local +20 -0
- package/lib/graphql/.env.test.local +20 -0
- package/lib/graphql/.swcrc +1 -0
- package/lib/graphql/package.json +0 -2
- package/lib/graphql/src/app.ts +7 -8
- package/lib/graphql/src/config/index.ts +5 -0
- package/lib/graphql/src/databases/index.ts +6 -8
- package/lib/graphql/src/middlewares/auth.middleware.ts +2 -2
- package/lib/graphql/src/repositories/auth.repository.ts +2 -2
- package/lib/graphql/src/server.ts +0 -3
- package/lib/graphql/src/utils/logger.ts +2 -2
- package/lib/graphql/tsconfig.json +1 -0
- package/lib/knex/.env.development.local +20 -0
- package/lib/knex/.env.production.local +20 -0
- package/lib/knex/.env.test.local +20 -0
- package/lib/knex/.swcrc +1 -0
- package/lib/knex/knexfile.ts +6 -10
- package/lib/knex/package.json +0 -2
- package/lib/knex/src/app.ts +6 -7
- package/lib/knex/src/config/index.ts +5 -0
- package/lib/knex/src/controllers/users.controller.ts +2 -2
- package/lib/knex/src/databases/index.ts +6 -8
- package/lib/knex/src/middlewares/auth.middleware.ts +2 -2
- package/lib/knex/src/server.ts +0 -2
- package/lib/knex/src/services/auth.service.ts +2 -2
- package/lib/knex/src/utils/logger.ts +2 -2
- package/lib/knex/tsconfig.json +1 -0
- package/lib/mongoose/.env.development.local +18 -0
- package/lib/mongoose/.env.production.local +18 -0
- package/lib/mongoose/.env.test.local +18 -0
- package/lib/mongoose/.swcrc +1 -0
- package/lib/mongoose/package.json +0 -2
- package/lib/mongoose/src/app.ts +6 -7
- package/lib/mongoose/src/config/index.ts +5 -0
- package/lib/mongoose/src/databases/index.ts +2 -5
- package/lib/mongoose/src/middlewares/auth.middleware.ts +2 -2
- package/lib/mongoose/src/server.ts +0 -2
- package/lib/mongoose/src/services/auth.service.ts +2 -2
- package/lib/mongoose/src/utils/logger.ts +2 -2
- package/lib/mongoose/tsconfig.json +1 -0
- package/lib/prisma/.env.development.local +16 -0
- package/lib/prisma/.env.production.local +16 -0
- package/lib/prisma/.env.test.local +16 -0
- package/lib/prisma/.swcrc +1 -0
- package/lib/prisma/package.json +0 -2
- package/lib/prisma/src/app.ts +6 -7
- package/lib/prisma/src/config/index.ts +5 -0
- package/lib/prisma/src/middlewares/auth.middleware.ts +2 -2
- package/lib/prisma/src/server.ts +0 -2
- package/lib/prisma/src/services/auth.service.ts +2 -2
- package/lib/prisma/src/utils/logger.ts +2 -2
- package/lib/prisma/tsconfig.json +1 -0
- package/lib/routing-controllers/.env.development.local +13 -0
- package/lib/routing-controllers/.env.production.local +13 -0
- package/lib/routing-controllers/.env.test.local +13 -0
- package/lib/routing-controllers/.swcrc +1 -0
- package/lib/routing-controllers/package.json +0 -2
- package/lib/routing-controllers/src/app.ts +7 -8
- package/lib/routing-controllers/src/config/index.ts +5 -0
- package/lib/routing-controllers/src/middlewares/auth.middleware.ts +2 -2
- package/lib/routing-controllers/src/server.ts +0 -2
- package/lib/routing-controllers/src/services/auth.service.ts +2 -2
- package/lib/routing-controllers/src/utils/logger.ts +2 -2
- package/lib/routing-controllers/tsconfig.json +1 -0
- package/lib/sequelize/.env.development.local +20 -0
- package/lib/sequelize/.env.production.local +20 -0
- package/lib/sequelize/.env.test.local +20 -0
- package/lib/sequelize/.swcrc +1 -0
- package/lib/sequelize/package.json +0 -2
- package/lib/sequelize/src/app.ts +6 -7
- package/lib/sequelize/src/config/index.ts +5 -0
- package/lib/sequelize/src/databases/index.ts +7 -8
- package/lib/sequelize/src/middlewares/auth.middleware.ts +2 -2
- package/lib/sequelize/src/server.ts +0 -2
- package/lib/sequelize/src/services/auth.service.ts +2 -2
- package/lib/sequelize/src/utils/logger.ts +2 -2
- package/lib/sequelize/tsconfig.json +1 -0
- package/lib/typegoose/package.json +1 -1
- package/lib/typeorm/.env.development.local +20 -0
- package/lib/typeorm/.env.production.local +20 -0
- package/lib/typeorm/.env.test.local +20 -0
- package/lib/typeorm/.swcrc +1 -0
- package/lib/typeorm/package.json +0 -2
- package/lib/typeorm/src/app.ts +6 -7
- package/lib/typeorm/src/config/index.ts +5 -0
- package/lib/typeorm/src/databases/index.ts +6 -8
- package/lib/typeorm/src/middlewares/auth.middleware.ts +2 -2
- package/lib/typeorm/src/server.ts +0 -2
- package/lib/typeorm/src/services/auth.service.ts +2 -2
- package/lib/typeorm/src/utils/logger.ts +2 -2
- package/lib/typeorm/tsconfig.json +1 -0
- package/package.json +1 -1
- package/lib/default/.env +0 -1
- package/lib/default/src/configs/development.json +0 -12
- package/lib/default/src/configs/production.json +0 -12
- package/lib/default/src/configs/test.json +0 -12
- package/lib/default/src/index.ts +0 -1
- package/lib/graphql/.env +0 -1
- package/lib/graphql/src/configs/development.json +0 -19
- package/lib/graphql/src/configs/production.json +0 -19
- package/lib/graphql/src/configs/test.json +0 -19
- package/lib/graphql/src/index.ts +0 -1
- package/lib/graphql/src/interfaces/db.interface.ts +0 -7
- package/lib/knex/.env +0 -1
- package/lib/knex/src/configs/development.json +0 -19
- package/lib/knex/src/configs/production.json +0 -19
- package/lib/knex/src/configs/test.json +0 -19
- package/lib/knex/src/index.ts +0 -1
- package/lib/knex/src/interfaces/db.interface.ts +0 -7
- package/lib/mongoose/.env +0 -1
- package/lib/mongoose/src/configs/development.json +0 -17
- package/lib/mongoose/src/configs/production.json +0 -17
- package/lib/mongoose/src/configs/test.json +0 -17
- package/lib/mongoose/src/index.ts +0 -1
- package/lib/mongoose/src/interfaces/db.interface.ts +0 -5
- package/lib/prisma/.env +0 -10
- package/lib/prisma/src/configs/development.json +0 -12
- package/lib/prisma/src/configs/production.json +0 -12
- package/lib/prisma/src/configs/test.json +0 -12
- package/lib/prisma/src/index.ts +0 -1
- package/lib/routing-controllers/.env +0 -1
- package/lib/routing-controllers/src/configs/development.json +0 -12
- package/lib/routing-controllers/src/configs/production.json +0 -12
- package/lib/routing-controllers/src/configs/test.json +0 -12
- package/lib/routing-controllers/src/index.ts +0 -1
- package/lib/sequelize/.env +0 -1
- package/lib/sequelize/src/configs/development.json +0 -22
- package/lib/sequelize/src/configs/production.json +0 -22
- package/lib/sequelize/src/configs/test.json +0 -22
- package/lib/sequelize/src/index.ts +0 -1
- package/lib/sequelize/src/interfaces/db.interface.ts +0 -10
- package/lib/typeorm/.env +0 -1
- package/lib/typeorm/src/configs/development.json +0 -18
- package/lib/typeorm/src/configs/production.json +0 -18
- package/lib/typeorm/src/configs/test.json +0 -18
- package/lib/typeorm/src/index.ts +0 -1
- package/lib/typeorm/src/interfaces/db.interface.ts +0 -6
package/README.kr.md
CHANGED
|
@@ -107,6 +107,7 @@ $ npx typescript-express-starter "project name"
|
|
|
107
107
|
| Knex | 쿼리 빌더를 위한 라이브러리 |
|
|
108
108
|
| GraphQL | API 용 쿼리 언어이며 기존 데이터로 이러한 쿼리를 수행하기위한 런타임 |
|
|
109
109
|
| Typegoose | 타입스크립트 클래스를 사용하여 몽구스 모델 정의 |
|
|
110
|
+
| mikro-orm (개발중) | 데이터 매퍼, 작업 단위 및 아이덴티티 맵 패턴을 기반으로 하는 Node.js용 TypeScript ORM. MongoDB, MySQL, MariaDB, PostgreSQL 및 SQLite 데이터베이스를 지원합니다. |
|
|
110
111
|
|
|
111
112
|
## 🛎 Script 명령어
|
|
112
113
|
|
|
@@ -370,6 +371,10 @@ VSCode Extension에서 [REST Client](https://marketplace.visualstudio.com/items?
|
|
|
370
371
|
|
|
371
372
|
- WhatIfWeDigDeeper [https://github.com/WhatIfWeDigDeeper](https://github.com/WhatIfWeDigDeeper)
|
|
372
373
|
|
|
374
|
+
- David Stewart [https://github.com/davidjmstewart](https://github.com/davidjmstewart)
|
|
375
|
+
|
|
376
|
+
- JagTheFriend [JagTheFriend](https://github.com/JagTheFriend)
|
|
377
|
+
|
|
373
378
|
## 💳 라이센스
|
|
374
379
|
|
|
375
380
|
[MIT](LICENSE)
|
package/README.md
CHANGED
|
@@ -100,17 +100,18 @@ Start your typescript-express-starter app in development mode at `http://localho
|
|
|
100
100
|
|
|
101
101
|
#### Template Type
|
|
102
102
|
|
|
103
|
-
| Name | Description
|
|
104
|
-
| :------------------ |
|
|
105
|
-
| Default | Express Default
|
|
106
|
-
| Routing Controllers | Create structured, declarative and beautifully organized class-based controllers with heavy decorators usage
|
|
107
|
-
| Sequelize | Easy to use multi SQL dialect ORM for Node.js
|
|
108
|
-
| Mongoose | MongoDB Object Modeling(ODM) designed to work in an asynchronous environment
|
|
109
|
-
| TypeORM | An ORM that can run in Node.js and Others
|
|
110
|
-
| Prisma | Modern Database Access for TypeScript & Node.js
|
|
111
|
-
| Knex | SQL query builder for Postgres, MySQL, MariaDB, SQLite3 and Oracle
|
|
112
|
-
| GraphQL | query language for APIs and a runtime for fulfilling those queries with your existing data
|
|
113
|
-
| Typegoose | Define Mongoose models using TypeScript classes
|
|
103
|
+
| Name | Description |
|
|
104
|
+
| :------------------ | :---------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
105
|
+
| Default | Express Default |
|
|
106
|
+
| Routing Controllers | Create structured, declarative and beautifully organized class-based controllers with heavy decorators usage |
|
|
107
|
+
| Sequelize | Easy to use multi SQL dialect ORM for Node.js |
|
|
108
|
+
| Mongoose | MongoDB Object Modeling(ODM) designed to work in an asynchronous environment |
|
|
109
|
+
| TypeORM | An ORM that can run in Node.js and Others |
|
|
110
|
+
| Prisma | Modern Database Access for TypeScript & Node.js |
|
|
111
|
+
| Knex | SQL query builder for Postgres, MySQL, MariaDB, SQLite3 and Oracle |
|
|
112
|
+
| GraphQL | query language for APIs and a runtime for fulfilling those queries with your existing data |
|
|
113
|
+
| Typegoose | Define Mongoose models using TypeScript classes |
|
|
114
|
+
| mikro-orm (Develop) | TypeScript ORM for Node.js based on Data Mapper, Unit of Work and Identity Map patterns. Supports MongoDB, MySQL, MariaDB, PostgreSQL and SQLite databases. |
|
|
114
115
|
|
|
115
116
|
## 🛎 Available Commands for the Server
|
|
116
117
|
|
|
@@ -243,9 +244,7 @@ Modify `.swcrc` file to your source code.
|
|
|
243
244
|
│
|
|
244
245
|
├── /src
|
|
245
246
|
│ ├── /configs
|
|
246
|
-
│ │ ├──
|
|
247
|
-
│ │ ├── production.json
|
|
248
|
-
│ │ └── test.json
|
|
247
|
+
│ │ ├── index.ts
|
|
249
248
|
│ │
|
|
250
249
|
│ ├── /controllers
|
|
251
250
|
│ │ ├── auth.controller.ts
|
|
@@ -300,7 +299,9 @@ Modify `.swcrc` file to your source code.
|
|
|
300
299
|
│
|
|
301
300
|
├── .dockerignore
|
|
302
301
|
├── .editorconfig
|
|
303
|
-
├── .env
|
|
302
|
+
├── .env.development.local
|
|
303
|
+
├── .env.production.local
|
|
304
|
+
├── .env.test.local
|
|
304
305
|
├── .eslintignore
|
|
305
306
|
├── .eslintrc
|
|
306
307
|
├── .gitignore
|
|
@@ -375,6 +376,10 @@ Modify `.swcrc` file to your source code.
|
|
|
375
376
|
|
|
376
377
|
- WhatIfWeDigDeeper [https://github.com/WhatIfWeDigDeeper](https://github.com/WhatIfWeDigDeeper)
|
|
377
378
|
|
|
379
|
+
- David Stewart [https://github.com/davidjmstewart](https://github.com/davidjmstewart)
|
|
380
|
+
|
|
381
|
+
- JagTheFriend [JagTheFriend](https://github.com/JagTheFriend)
|
|
382
|
+
|
|
378
383
|
## 💳 License
|
|
379
384
|
|
|
380
385
|
[MIT](LICENSE)
|
package/lib/default/.swcrc
CHANGED
package/lib/default/package.json
CHANGED
|
@@ -20,7 +20,6 @@
|
|
|
20
20
|
"class-transformer": "^0.4.0",
|
|
21
21
|
"class-validator": "^0.13.1",
|
|
22
22
|
"compression": "^1.7.4",
|
|
23
|
-
"config": "^3.3.6",
|
|
24
23
|
"cookie-parser": "^1.4.5",
|
|
25
24
|
"cors": "^2.8.5",
|
|
26
25
|
"dotenv": "^10.0.0",
|
|
@@ -40,7 +39,6 @@
|
|
|
40
39
|
"@swc/core": "^1.2.108",
|
|
41
40
|
"@types/bcrypt": "^5.0.0",
|
|
42
41
|
"@types/compression": "^1.7.1",
|
|
43
|
-
"@types/config": "^0.0.39",
|
|
44
42
|
"@types/cookie-parser": "^1.4.2",
|
|
45
43
|
"@types/cors": "^2.8.11",
|
|
46
44
|
"@types/dotenv": "^8.2.0",
|
package/lib/default/src/app.ts
CHANGED
|
@@ -1,27 +1,26 @@
|
|
|
1
|
-
import '@/index';
|
|
2
1
|
import compression from 'compression';
|
|
3
2
|
import cookieParser from 'cookie-parser';
|
|
4
3
|
import cors from 'cors';
|
|
5
|
-
import config from 'config';
|
|
6
4
|
import express from 'express';
|
|
7
5
|
import helmet from 'helmet';
|
|
8
6
|
import hpp from 'hpp';
|
|
9
7
|
import morgan from 'morgan';
|
|
10
8
|
import swaggerJSDoc from 'swagger-jsdoc';
|
|
11
9
|
import swaggerUi from 'swagger-ui-express';
|
|
10
|
+
import { NODE_ENV, PORT, LOG_FORMAT, ORIGIN, CREDENTIALS } from '@config';
|
|
12
11
|
import { Routes } from '@interfaces/routes.interface';
|
|
13
12
|
import errorMiddleware from '@middlewares/error.middleware';
|
|
14
13
|
import { logger, stream } from '@utils/logger';
|
|
15
14
|
|
|
16
15
|
class App {
|
|
17
16
|
public app: express.Application;
|
|
18
|
-
public port: string | number;
|
|
19
17
|
public env: string;
|
|
18
|
+
public port: string | number;
|
|
20
19
|
|
|
21
20
|
constructor(routes: Routes[]) {
|
|
22
21
|
this.app = express();
|
|
23
|
-
this.
|
|
24
|
-
this.
|
|
22
|
+
this.env = NODE_ENV || 'development';
|
|
23
|
+
this.port = PORT || 3000;
|
|
25
24
|
|
|
26
25
|
this.initializeMiddlewares();
|
|
27
26
|
this.initializeRoutes(routes);
|
|
@@ -43,8 +42,8 @@ class App {
|
|
|
43
42
|
}
|
|
44
43
|
|
|
45
44
|
private initializeMiddlewares() {
|
|
46
|
-
this.app.use(morgan(
|
|
47
|
-
this.app.use(cors({ origin:
|
|
45
|
+
this.app.use(morgan(LOG_FORMAT, { stream }));
|
|
46
|
+
this.app.use(cors({ origin: ORIGIN, credentials: CREDENTIALS }));
|
|
48
47
|
this.app.use(hpp());
|
|
49
48
|
this.app.use(helmet());
|
|
50
49
|
this.app.use(compression());
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import config from 'config';
|
|
2
1
|
import { NextFunction, Response } from 'express';
|
|
3
2
|
import { verify } from 'jsonwebtoken';
|
|
3
|
+
import { SECRET_KEY } from '@config';
|
|
4
4
|
import { HttpException } from '@exceptions/HttpException';
|
|
5
5
|
import { DataStoredInToken, RequestWithUser } from '@interfaces/auth.interface';
|
|
6
6
|
import userModel from '@models/users.model';
|
|
@@ -10,7 +10,7 @@ const authMiddleware = async (req: RequestWithUser, res: Response, next: NextFun
|
|
|
10
10
|
const Authorization = req.cookies['Authorization'] || (req.header('Authorization') ? req.header('Authorization').split('Bearer ')[1] : null);
|
|
11
11
|
|
|
12
12
|
if (Authorization) {
|
|
13
|
-
const secretKey: string =
|
|
13
|
+
const secretKey: string = SECRET_KEY;
|
|
14
14
|
const verificationResponse = (await verify(Authorization, secretKey)) as DataStoredInToken;
|
|
15
15
|
const userId = verificationResponse.id;
|
|
16
16
|
const findUser = userModel.find(user => user.id === userId);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { hash, compare } from 'bcrypt';
|
|
2
|
-
import config from 'config';
|
|
3
2
|
import { sign } from 'jsonwebtoken';
|
|
3
|
+
import { SECRET_KEY } from '@config';
|
|
4
4
|
import { CreateUserDto } from '@dtos/users.dto';
|
|
5
5
|
import { HttpException } from '@exceptions/HttpException';
|
|
6
6
|
import { DataStoredInToken, TokenData } from '@interfaces/auth.interface';
|
|
@@ -49,7 +49,7 @@ class AuthService {
|
|
|
49
49
|
|
|
50
50
|
public createToken(user: User): TokenData {
|
|
51
51
|
const dataStoredInToken: DataStoredInToken = { id: user.id };
|
|
52
|
-
const secretKey: string =
|
|
52
|
+
const secretKey: string = SECRET_KEY;
|
|
53
53
|
const expiresIn: number = 60 * 60;
|
|
54
54
|
|
|
55
55
|
return { expiresIn, token: sign(dataStoredInToken, secretKey, { expiresIn }) };
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import config from 'config';
|
|
2
1
|
import { existsSync, mkdirSync } from 'fs';
|
|
3
2
|
import { join } from 'path';
|
|
4
3
|
import winston from 'winston';
|
|
5
4
|
import winstonDaily from 'winston-daily-rotate-file';
|
|
5
|
+
import { LOG_DIR } from '@config';
|
|
6
6
|
|
|
7
7
|
// logs dir
|
|
8
|
-
const logDir: string = join(__dirname,
|
|
8
|
+
const logDir: string = join(__dirname, LOG_DIR);
|
|
9
9
|
|
|
10
10
|
if (!existsSync(logDir)) {
|
|
11
11
|
mkdirSync(logDir);
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# PORT
|
|
2
|
+
PORT = 3000
|
|
3
|
+
|
|
4
|
+
# DATABASE
|
|
5
|
+
DB_HOST = localhost
|
|
6
|
+
DB_PORT = 3306
|
|
7
|
+
DB_USER = root
|
|
8
|
+
DB_PASSWORD = password
|
|
9
|
+
DB_DATABASE = test
|
|
10
|
+
|
|
11
|
+
# TOKEN
|
|
12
|
+
SECRET_KEY = secretKey
|
|
13
|
+
|
|
14
|
+
# LOG
|
|
15
|
+
LOG_FORMAT = dev
|
|
16
|
+
LOG_DIR = ../logs
|
|
17
|
+
|
|
18
|
+
# CORS
|
|
19
|
+
ORIGIN = *
|
|
20
|
+
CREDENTIALS = true
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# PORT
|
|
2
|
+
PORT = 3000
|
|
3
|
+
|
|
4
|
+
# DATABASE
|
|
5
|
+
DB_HOST = localhost
|
|
6
|
+
DB_PORT = 3306
|
|
7
|
+
DB_USER = root
|
|
8
|
+
DB_PASSWORD = password
|
|
9
|
+
DB_DATABASE = test
|
|
10
|
+
|
|
11
|
+
# TOKEN
|
|
12
|
+
SECRET_KEY = secretKey
|
|
13
|
+
|
|
14
|
+
# LOG
|
|
15
|
+
LOG_FORMAT = combined
|
|
16
|
+
LOG_DIR = ../logs
|
|
17
|
+
|
|
18
|
+
# CORS
|
|
19
|
+
ORIGIN = your.domain.com
|
|
20
|
+
CREDENTIALS = true
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# PORT
|
|
2
|
+
PORT = 3000
|
|
3
|
+
|
|
4
|
+
# DATABASE
|
|
5
|
+
DB_HOST = localhost
|
|
6
|
+
DB_PORT = 3306
|
|
7
|
+
DB_USER = root
|
|
8
|
+
DB_PASSWORD = password
|
|
9
|
+
DB_DATABASE = test
|
|
10
|
+
|
|
11
|
+
# TOKEN
|
|
12
|
+
SECRET_KEY = secretKey
|
|
13
|
+
|
|
14
|
+
# LOG
|
|
15
|
+
LOG_FORMAT = dev
|
|
16
|
+
LOG_DIR = ../logs
|
|
17
|
+
|
|
18
|
+
# CORS
|
|
19
|
+
ORIGIN = *
|
|
20
|
+
CREDENTIALS = true
|
package/lib/graphql/.swcrc
CHANGED
package/lib/graphql/package.json
CHANGED
|
@@ -21,7 +21,6 @@
|
|
|
21
21
|
"bcrypt": "^5.0.1",
|
|
22
22
|
"class-validator": "^0.13.1",
|
|
23
23
|
"compression": "^1.7.4",
|
|
24
|
-
"config": "^3.3.6",
|
|
25
24
|
"cookie-parser": "^1.4.5",
|
|
26
25
|
"cors": "^2.8.5",
|
|
27
26
|
"dotenv": "^10.0.0",
|
|
@@ -43,7 +42,6 @@
|
|
|
43
42
|
"@swc/core": "^1.2.108",
|
|
44
43
|
"@types/bcrypt": "^5.0.0",
|
|
45
44
|
"@types/compression": "^1.7.1",
|
|
46
|
-
"@types/config": "^0.0.39",
|
|
47
45
|
"@types/cookie-parser": "^1.4.2",
|
|
48
46
|
"@types/cors": "^2.8.11",
|
|
49
47
|
"@types/dotenv": "^8.2.0",
|
package/lib/graphql/src/app.ts
CHANGED
|
@@ -1,16 +1,15 @@
|
|
|
1
1
|
import 'reflect-metadata';
|
|
2
|
-
import '@/index';
|
|
3
2
|
import { ApolloServerPluginLandingPageProductionDefault, ApolloServerPluginLandingPageLocalDefault } from 'apollo-server-core';
|
|
4
3
|
import { ApolloServer } from 'apollo-server-express';
|
|
5
4
|
import compression from 'compression';
|
|
6
5
|
import cookieParser from 'cookie-parser';
|
|
7
6
|
import cors from 'cors';
|
|
8
|
-
import config from 'config';
|
|
9
7
|
import express from 'express';
|
|
10
8
|
import helmet from 'helmet';
|
|
11
9
|
import hpp from 'hpp';
|
|
12
10
|
import { buildSchema } from 'type-graphql';
|
|
13
11
|
import { createConnection } from 'typeorm';
|
|
12
|
+
import { NODE_ENV, PORT, ORIGIN, CREDENTIALS } from '@config';
|
|
14
13
|
import { dbConnection } from '@databases';
|
|
15
14
|
import { authMiddleware, authChecker } from '@middlewares/auth.middleware';
|
|
16
15
|
import errorMiddleware from '@middlewares/error.middleware';
|
|
@@ -18,13 +17,13 @@ import { logger, responseLogger, errorLogger } from '@utils/logger';
|
|
|
18
17
|
|
|
19
18
|
class App {
|
|
20
19
|
public app: express.Application;
|
|
21
|
-
public port: string | number;
|
|
22
20
|
public env: string;
|
|
21
|
+
public port: string | number;
|
|
23
22
|
|
|
24
23
|
constructor(resolvers) {
|
|
25
24
|
this.app = express();
|
|
26
|
-
this.
|
|
27
|
-
this.
|
|
25
|
+
this.env = NODE_ENV || 'development';
|
|
26
|
+
this.port = PORT || 3000;
|
|
28
27
|
|
|
29
28
|
this.connectToDatabase();
|
|
30
29
|
this.initializeMiddlewares();
|
|
@@ -51,7 +50,7 @@ class App {
|
|
|
51
50
|
}
|
|
52
51
|
|
|
53
52
|
private initializeMiddlewares() {
|
|
54
|
-
this.app.use(cors({ origin:
|
|
53
|
+
this.app.use(cors({ origin: ORIGIN, credentials: CREDENTIALS }));
|
|
55
54
|
this.app.use(hpp());
|
|
56
55
|
this.app.use(helmet());
|
|
57
56
|
this.app.use(compression());
|
|
@@ -69,7 +68,7 @@ class App {
|
|
|
69
68
|
const apolloServer = new ApolloServer({
|
|
70
69
|
schema: schema,
|
|
71
70
|
plugins: [
|
|
72
|
-
|
|
71
|
+
NODE_ENV === 'production'
|
|
73
72
|
? ApolloServerPluginLandingPageProductionDefault({ footer: false })
|
|
74
73
|
: ApolloServerPluginLandingPageLocalDefault({ footer: false }),
|
|
75
74
|
],
|
|
@@ -94,7 +93,7 @@ class App {
|
|
|
94
93
|
});
|
|
95
94
|
|
|
96
95
|
await apolloServer.start();
|
|
97
|
-
apolloServer.applyMiddleware({ app: this.app, cors:
|
|
96
|
+
apolloServer.applyMiddleware({ app: this.app, cors: ORIGIN, path: '/graphql' });
|
|
98
97
|
}
|
|
99
98
|
|
|
100
99
|
private initializeErrorHandling() {
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { config } from 'dotenv';
|
|
2
|
+
config({ path: `.env.${process.env.NODE_ENV || 'development'}.local` });
|
|
3
|
+
|
|
4
|
+
export const CREDENTIALS = process.env.CREDENTIALS === 'true';
|
|
5
|
+
export const { NODE_ENV, PORT, DB_HOST, DB_PORT, DB_USER, DB_PASSWORD, DB_DATABASE, SECRET_KEY, LOG_FORMAT, LOG_DIR, ORIGIN } = process.env;
|
|
@@ -1,16 +1,14 @@
|
|
|
1
|
-
import config from 'config';
|
|
2
1
|
import { join } from 'path';
|
|
3
2
|
import { ConnectionOptions } from 'typeorm';
|
|
4
|
-
import {
|
|
3
|
+
import { DB_HOST, DB_PORT, DB_USER, DB_PASSWORD, DB_DATABASE } from '@config';
|
|
5
4
|
|
|
6
|
-
const { host, port, user, password, database }: dbConfig = config.get('dbConfig');
|
|
7
5
|
export const dbConnection: ConnectionOptions = {
|
|
8
6
|
type: 'postgres',
|
|
9
|
-
host:
|
|
10
|
-
port:
|
|
11
|
-
username:
|
|
12
|
-
password:
|
|
13
|
-
database:
|
|
7
|
+
host: DB_HOST,
|
|
8
|
+
port: DB_PORT,
|
|
9
|
+
username: DB_USER,
|
|
10
|
+
password: DB_PASSWORD,
|
|
11
|
+
database: DB_DATABASE,
|
|
14
12
|
synchronize: true,
|
|
15
13
|
logging: false,
|
|
16
14
|
entities: [join(__dirname, '../**/*.entity{.ts,.js}')],
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import config from 'config';
|
|
2
1
|
import { verify } from 'jsonwebtoken';
|
|
3
2
|
import { AuthChecker } from 'type-graphql';
|
|
4
3
|
import { getRepository } from 'typeorm';
|
|
4
|
+
import { SECRET_KEY } from '@config';
|
|
5
5
|
import { UserEntity } from '@entities/users.entity';
|
|
6
6
|
import { HttpException } from '@exceptions/HttpException';
|
|
7
7
|
import { RequestWithUser, DataStoredInToken } from '@interfaces/auth.interface';
|
|
@@ -10,7 +10,7 @@ export const authMiddleware = async req => {
|
|
|
10
10
|
try {
|
|
11
11
|
const Authorization = req.cookies['Authorization'] || (req.header('Authorization') ? req.header('Authorization').split('Bearer ')[1] : null);
|
|
12
12
|
if (Authorization) {
|
|
13
|
-
const secretKey: string =
|
|
13
|
+
const secretKey: string = SECRET_KEY;
|
|
14
14
|
const { id } = (await verify(Authorization, secretKey)) as DataStoredInToken;
|
|
15
15
|
const userRepository = getRepository(UserEntity);
|
|
16
16
|
const findUser = await userRepository.findOne(id, { select: ['id', 'email', 'password'] });
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { hash, compare } from 'bcrypt';
|
|
2
|
-
import config from 'config';
|
|
3
2
|
import { sign } from 'jsonwebtoken';
|
|
4
3
|
import { EntityRepository } from 'typeorm';
|
|
4
|
+
import { SECRET_KEY } from '@config';
|
|
5
5
|
import { CreateUserDto } from '@dtos/users.dto';
|
|
6
6
|
import { UserEntity } from '@entities/users.entity';
|
|
7
7
|
import { HttpException } from '@exceptions/HttpException';
|
|
@@ -49,7 +49,7 @@ export default class AuthRepository {
|
|
|
49
49
|
|
|
50
50
|
public createToken(user: User): TokenData {
|
|
51
51
|
const dataStoredInToken: DataStoredInToken = { id: user.id };
|
|
52
|
-
const secretKey: string =
|
|
52
|
+
const secretKey: string = SECRET_KEY;
|
|
53
53
|
const expiresIn: number = 60 * 60;
|
|
54
54
|
|
|
55
55
|
return { expiresIn, token: sign(dataStoredInToken, secretKey, { expiresIn }) };
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import config from 'config';
|
|
2
1
|
import { existsSync, mkdirSync } from 'fs';
|
|
3
2
|
import { join } from 'path';
|
|
4
3
|
import winston from 'winston';
|
|
5
4
|
import winstonDaily from 'winston-daily-rotate-file';
|
|
5
|
+
import { LOG_DIR } from '@config';
|
|
6
6
|
|
|
7
7
|
// logs dir
|
|
8
|
-
const logDir: string = join(__dirname,
|
|
8
|
+
const logDir: string = join(__dirname, LOG_DIR);
|
|
9
9
|
|
|
10
10
|
if (!existsSync(logDir)) {
|
|
11
11
|
mkdirSync(logDir);
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# PORT
|
|
2
|
+
PORT = 3000
|
|
3
|
+
|
|
4
|
+
# DATABASE
|
|
5
|
+
DB_HOST = localhost
|
|
6
|
+
DB_PORT = 3306
|
|
7
|
+
DB_USER = root
|
|
8
|
+
DB_PASSWORD = password
|
|
9
|
+
DB_DATABASE = test
|
|
10
|
+
|
|
11
|
+
# TOKEN
|
|
12
|
+
SECRET_KEY = secretKey
|
|
13
|
+
|
|
14
|
+
# LOG
|
|
15
|
+
LOG_FORMAT = dev
|
|
16
|
+
LOG_DIR = ../logs
|
|
17
|
+
|
|
18
|
+
# CORS
|
|
19
|
+
ORIGIN = *
|
|
20
|
+
CREDENTIALS = true
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# PORT
|
|
2
|
+
PORT = 3000
|
|
3
|
+
|
|
4
|
+
# DATABASE
|
|
5
|
+
DB_HOST = localhost
|
|
6
|
+
DB_PORT = 3306
|
|
7
|
+
DB_USER = root
|
|
8
|
+
DB_PASSWORD = password
|
|
9
|
+
DB_DATABASE = test
|
|
10
|
+
|
|
11
|
+
# TOKEN
|
|
12
|
+
SECRET_KEY = secretKey
|
|
13
|
+
|
|
14
|
+
# LOG
|
|
15
|
+
LOG_FORMAT = combined
|
|
16
|
+
LOG_DIR = ../logs
|
|
17
|
+
|
|
18
|
+
# CORS
|
|
19
|
+
ORIGIN = your.domain.com
|
|
20
|
+
CREDENTIALS = true
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# PORT
|
|
2
|
+
PORT = 3000
|
|
3
|
+
|
|
4
|
+
# DATABASE
|
|
5
|
+
DB_HOST = localhost
|
|
6
|
+
DB_PORT = 3306
|
|
7
|
+
DB_USER = root
|
|
8
|
+
DB_PASSWORD = password
|
|
9
|
+
DB_DATABASE = test
|
|
10
|
+
|
|
11
|
+
# TOKEN
|
|
12
|
+
SECRET_KEY = secretKey
|
|
13
|
+
|
|
14
|
+
# LOG
|
|
15
|
+
LOG_FORMAT = dev
|
|
16
|
+
LOG_DIR = ../logs
|
|
17
|
+
|
|
18
|
+
# CORS
|
|
19
|
+
ORIGIN = *
|
|
20
|
+
CREDENTIALS = true
|
package/lib/knex/.swcrc
CHANGED
package/lib/knex/knexfile.ts
CHANGED
|
@@ -1,19 +1,15 @@
|
|
|
1
|
-
|
|
1
|
+
import { DB_HOST, DB_PORT, DB_USER, DB_PASSWORD, DB_DATABASE } from './src/config';
|
|
2
2
|
|
|
3
|
-
import config from 'config';
|
|
4
|
-
import { dbConfig } from './src/interfaces/db.interface';
|
|
5
|
-
|
|
6
|
-
const { host, user, password, database, port }: dbConfig = config.get('dbConfig');
|
|
7
3
|
export = {
|
|
8
4
|
client: 'mysql',
|
|
9
5
|
connection: {
|
|
10
6
|
charset: 'utf8',
|
|
11
7
|
timezone: 'UTC',
|
|
12
|
-
host:
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
8
|
+
host: DB_HOST,
|
|
9
|
+
port: DB_PORT,
|
|
10
|
+
user: DB_USER,
|
|
11
|
+
password: DB_PASSWORD,
|
|
12
|
+
database: DB_DATABASE
|
|
17
13
|
},
|
|
18
14
|
migrations: {
|
|
19
15
|
directory: 'src/databases/migrations',
|
package/lib/knex/package.json
CHANGED
|
@@ -25,7 +25,6 @@
|
|
|
25
25
|
"class-transformer": "^0.4.0",
|
|
26
26
|
"class-validator": "^0.13.1",
|
|
27
27
|
"compression": "^1.7.4",
|
|
28
|
-
"config": "^3.3.6",
|
|
29
28
|
"cookie-parser": "^1.4.5",
|
|
30
29
|
"cors": "^2.8.5",
|
|
31
30
|
"dotenv": "^9.0.2",
|
|
@@ -48,7 +47,6 @@
|
|
|
48
47
|
"@swc/core": "^1.2.108",
|
|
49
48
|
"@types/bcrypt": "^5.0.0",
|
|
50
49
|
"@types/compression": "^1.7.0",
|
|
51
|
-
"@types/config": "0.0.38",
|
|
52
50
|
"@types/cookie-parser": "^1.4.2",
|
|
53
51
|
"@types/cors": "^2.8.10",
|
|
54
52
|
"@types/dotenv": "^8.2.0",
|