diff --git a/.vuepress/config.js b/.vuepress/config.js
index e2e5515f..3652a323 100644
--- a/.vuepress/config.js
+++ b/.vuepress/config.js
@@ -1,20 +1,20 @@
/* tslint:disable */
module.exports = {
- title: 'Awesome nest boilerplate 🎉',
- description: `An ultimate and awesome nodejs boilerplate wrote in typescript`,
- base: process.env.DEPLOY_ENV === 'gh-pages' ? '/awesome-nest-boilerplate/': '/',
- themeConfig: {
- sidebar: [
- ['/', 'Introduction'],
- '/docs/development',
- // '/docs/architecture',
- // '/docs/tech',
- // '/docs/routing',
- // '/docs/state',
- // '/docs/linting',
- // '/docs/editors',
- // '/docs/production',
- // '/docs/troubleshooting',
- ],
- },
+ title: 'Awesome nest boilerplate 🎉',
+ description: `An ultimate and awesome nodejs boilerplate wrote in typescript`,
+ base: process.env.DEPLOY_ENV === 'gh-pages' ? '/awesome-nest-boilerplate/' : '/',
+ themeConfig: {
+ sidebar: [
+ ['/', 'Introduction'],
+ '/docs/development',
+ '/docs/architecture',
+ // '/docs/tech',
+ // '/docs/routing',
+ // '/docs/state',
+ // '/docs/linting',
+ // '/docs/editors',
+ // '/docs/production',
+ // '/docs/troubleshooting',
+ ],
+ },
};
diff --git a/README.md b/README.md
index 3b4499de..89c86acb 100644
--- a/README.md
+++ b/README.md
@@ -25,22 +25,28 @@ yarn start:dev
## Features
- - Quick scaffolding
+ - Quick scaffolding
- Create modules, services, controller - right from the CLI!
- - Instant feedback
+ - Instant feedback
- Enjoy the best DX (Developer eXperience) and code your app at the speed of thought! Your saved changes are reflected instantaneously.
- - JWT Authentication
+ - JWT Authentication
- Installed and configured JWT authentication.
- - Next generation Typescript
+ - Next generation Typescript
- Always up to date typescript version.
- - Industry-standard routing
- - It's natural to want to add pages (e.g. `/about`) to your application, and routing makes this possible.
+ - Industry-standard routing
+ - It's natural to want to add pages (e.g. /about`) to your application, and routing makes this possible.
- - Linter
+ - Environment Configuration
+ - development, staging and production environment configurations
+
+ - Swagger Api Documentation
+ - Already integrated API documentation. To see all available endpoints visit http://localhost:3000/documentation
+
+ - Linter
- tslint + eslint + prettier = ❤️
diff --git a/docs/architecture.md b/docs/architecture.md
new file mode 100644
index 00000000..77803e36
--- /dev/null
+++ b/docs/architecture.md
@@ -0,0 +1,109 @@
+# Architecture
+
+- [Architecture](#architecture)
+ - [`.vscode`](#vscode)
+ - [`docs`](#docs)
+ - [`.vuepress`](#vuepress)
+ - [`src`](#src)
+ - [`common`](#common)
+ - [`decorators`](#decorators)
+ - [`interceptors`](#interceptors)
+ - [`exception-filters`](#exception-filters)
+ - [`guards`](#guards)
+ - [`interfaces`](#interfaces)
+ - [`migrations`](#migrations)
+ - [`providers`](#providers)
+ - [`shared`](#shared)
+ - [`modules`](#modules)
+ - [`app.module.ts`](#appmodulets)
+ - [`boilerplate.polyfill.ts`](#boilerplatepolyfillts)
+ - [`snake-naming.strategy.ts`](#snake-namingstrategyts)
+ - [`.*.env`](#env)
+ - [`.eslintrc.json`](#eslintrcjson)
+ - [`tslint.json`](#tslintjson)
+
+## `.vscode`
+
+Settings and extensions specific to this project, for Visual Studio Code. See [the editors doc](editors.md#visual-studio-code) for more.
+
+## `docs`
+
+You found me! :wink:
+
+## `.vuepress`
+
+Documentation config and destination folder See [VuePress doc](https://vuepress.vuejs.org) for more
+
+## `src`
+
+Where we keep all our source files.
+
+### `common`
+
+Where we keep common typescript files, e.g. constants and DTOs.
+
+### `decorators`
+
+This folder contains all global [decorators](https://www.typescriptlang.org/docs/handbook/decorators.html).
+
+### `interceptors`
+
+Where we are keep [interceptors](https://docs.nestjs.com/interceptors)
+
+### `exception-filters`
+
+In this folder you can find app level [exception-filters](https://docs.nestjs.com/exception-filters).
+
+### `guards`
+
+You can store all guards here
+
+### `interfaces`
+
+This folder contains typescript [interfaces](https://www.typescriptlang.org/docs/handbook/interfaces.html)
+
+### `migrations`
+
+Folder to store application migrations which will be generated by typeorm.
+
+### `providers`
+
+These are utility functions you may want to share between many files in your application. They will always be pure and never have side effects, meaning if you provide a function the same arguments, it will always return the same result.
+
+### `shared`
+
+Shared module with global singleton services.
+
+### `modules`
+
+Where all our NestJS modules lives. See [NestJS modules documentation](https://docs.nestjs.com/modules) for more.
+
+### `app.module.ts`
+
+The root application module.
+
+### `boilerplate.polyfill.ts`
+
+We extend built in classes so you can use helper function anywhere.
+
+```typescript
+const users: UserEntity[] = ...;
+
+const userDtos = users.toDtos();
+```
+
+### `snake-naming.strategy.ts`
+
+We are using snake naming strategy for typeorm, so when you will generate migration it automatically will set snake_case column name from entity fields.
+
+## `.*.env`
+
+Environment variables which will load before app start and will be stored in `process.env`, (*) is a env name (development, staging, production, ...)
+
+## `.eslintrc.json`
+
+Eslint configuration file, See [the eslint doc](https://eslint.org/) for more.
+
+## `tslint.json`
+
+Tslint configuration file, See [the tslint doc](https://palantir.github.io/tslint/) for more.
diff --git a/src/app.module.ts b/src/app.module.ts
index 201d1049..0a2ac079 100644
--- a/src/app.module.ts
+++ b/src/app.module.ts
@@ -1,14 +1,14 @@
import './boilerplate.polyfill';
-import { TypeOrmModule } from '@nestjs/typeorm';
import { Module, NestModule, MiddlewareConsumer } from '@nestjs/common';
+import { TypeOrmModule } from '@nestjs/typeorm';
-import { ConfigService } from './shared/services/config.service';
-import { AuthModule } from './modules/auth/auth.module';
-import { UserModule } from './modules/user/user.module';
import { contextMiddleware } from './middlewares';
+import { AuthModule } from './modules/auth/auth.module';
import { MathModule } from './modules/math/math.module';
-import { SharedModule } from './shared.module';
+import { UserModule } from './modules/user/user.module';
+import { ConfigService } from './shared/services/config.service';
+import { SharedModule } from './shared/shared.module';
@Module({
imports: [
diff --git a/src/common/enum/order.ts b/src/common/constants/order.ts
similarity index 100%
rename from src/common/enum/order.ts
rename to src/common/constants/order.ts
diff --git a/src/constants/role-type.ts b/src/common/constants/role-type.ts
similarity index 100%
rename from src/constants/role-type.ts
rename to src/common/constants/role-type.ts
diff --git a/src/common/dto/PageOptionsDto.ts b/src/common/dto/PageOptionsDto.ts
index e8e80d1e..b87b7275 100644
--- a/src/common/dto/PageOptionsDto.ts
+++ b/src/common/dto/PageOptionsDto.ts
@@ -1,8 +1,8 @@
-import { Type } from 'class-transformer';
import { ApiModelPropertyOptional } from '@nestjs/swagger';
+import { Type } from 'class-transformer';
import { IsEnum, IsInt, Min, IsOptional, Max, IsString, IsNotEmpty } from 'class-validator';
-import { Order } from '../enum/order';
+import { Order } from '../constants/order';
export class PageOptionsDto {
@ApiModelPropertyOptional({
diff --git a/src/decorators/roles.decorator.ts b/src/decorators/roles.decorator.ts
index 47965cda..9922fa41 100644
--- a/src/decorators/roles.decorator.ts
+++ b/src/decorators/roles.decorator.ts
@@ -1,4 +1,5 @@
import { SetMetadata } from '@nestjs/common';
-import { RoleType } from '../constants/role-type';
+
+import { RoleType } from '../common/constants/role-type';
export const Roles = (...roles: RoleType[]) => SetMetadata('roles', roles);
diff --git a/src/filters/bad-request.filter.ts b/src/filters/bad-request.filter.ts
index 10a559b2..e61ec65a 100644
--- a/src/filters/bad-request.filter.ts
+++ b/src/filters/bad-request.filter.ts
@@ -1,8 +1,8 @@
-import * as _ from 'lodash';
-import { Reflector } from '@nestjs/core';
-import { Response } from 'express';
import { ExceptionFilter, Catch, ArgumentsHost, BadRequestException, HttpStatus } from '@nestjs/common';
+import { Reflector } from '@nestjs/core';
import { ValidationError } from 'class-validator';
+import { Response } from 'express';
+import * as _ from 'lodash';
@Catch(BadRequestException)
export class HttpExceptionFilter implements ExceptionFilter {
diff --git a/src/main.hmr.ts b/src/main.hmr.ts
index b6eae074..f73264b0 100644
--- a/src/main.hmr.ts
+++ b/src/main.hmr.ts
@@ -1,17 +1,17 @@
-import * as morgan from 'morgan';
-import * as helmet from 'helmet';
-import * as compression from 'compression';
-import * as RateLimit from 'express-rate-limit';
-import { Transport } from '@nestjs/microservices';
+import { ValidationPipe, ClassSerializerInterceptor } from '@nestjs/common';
import { NestFactory, Reflector } from '@nestjs/core';
+import { Transport } from '@nestjs/microservices';
import { NestExpressApplication } from '@nestjs/platform-express';
-import { ValidationPipe, ClassSerializerInterceptor } from '@nestjs/common';
+import * as compression from 'compression';
+import * as RateLimit from 'express-rate-limit';
+import * as helmet from 'helmet';
+import * as morgan from 'morgan';
import { AppModule } from './app.module';
-import { setupSwagger } from './viveo-swagger';
-import { ConfigService } from './shared/services/config.service';
import { HttpExceptionFilter } from './filters/bad-request.filter';
-import { SharedModule } from './shared.module';
+import { ConfigService } from './shared/services/config.service';
+import { SharedModule } from './shared/shared.module';
+import { setupSwagger } from './viveo-swagger';
declare const module: any;
diff --git a/src/main.ts b/src/main.ts
index fbb6bbe5..d6d61ad5 100644
--- a/src/main.ts
+++ b/src/main.ts
@@ -11,8 +11,8 @@ import { initializeTransactionalContext, patchTypeORMRepositoryWithBaseRepositor
import { AppModule } from './app.module';
import { HttpExceptionFilter } from './filters/bad-request.filter';
import { QueryFailedFilter } from './filters/query-failed.filter';
-import { SharedModule } from './shared.module';
import { ConfigService } from './shared/services/config.service';
+import { SharedModule } from './shared/shared.module';
import { setupSwagger } from './viveo-swagger';
async function bootstrap() {
diff --git a/src/modules/user/dto/UserDto.ts b/src/modules/user/dto/UserDto.ts
index 5128502b..24f0cbc1 100644
--- a/src/modules/user/dto/UserDto.ts
+++ b/src/modules/user/dto/UserDto.ts
@@ -2,9 +2,9 @@
import { ApiModelPropertyOptional } from '@nestjs/swagger';
-import { UserEntity } from '../user.entity';
+import { RoleType } from '../../../common/constants/role-type';
import { AbstractDto } from '../../../common/dto/AbstractDto';
-import { RoleType } from '../../../constants/role-type';
+import { UserEntity } from '../user.entity';
export class UserDto extends AbstractDto {
diff --git a/src/modules/user/user.controller.ts b/src/modules/user/user.controller.ts
index 763acd22..3d261926 100644
--- a/src/modules/user/user.controller.ts
+++ b/src/modules/user/user.controller.ts
@@ -12,7 +12,7 @@ import {
} from '@nestjs/common';
import { ApiBearerAuth, ApiResponse, ApiUseTags } from '@nestjs/swagger';
-import { RoleType } from '../../constants/role-type';
+import { RoleType } from '../../common/constants/role-type';
import { AuthUser } from '../../decorators/auth-user.decorator';
import { Roles } from '../../decorators/roles.decorator';
import { AuthGuard } from '../../guards/auth.guard';
diff --git a/src/modules/user/user.entity.ts b/src/modules/user/user.entity.ts
index 41027290..bc7472b3 100644
--- a/src/modules/user/user.entity.ts
+++ b/src/modules/user/user.entity.ts
@@ -1,8 +1,8 @@
import { Entity, Column } from 'typeorm';
-import { UserDto } from './dto/UserDto';
-import { RoleType } from '../../constants/role-type';
import { AbstractEntity } from '../../common/abstract.entity';
+import { RoleType } from '../../common/constants/role-type';
+import { UserDto } from './dto/UserDto';
import { PasswordTransformer } from './password.transformer';
@Entity({ name: 'users' })
diff --git a/src/shared.module.ts b/src/shared/shared.module.ts
similarity index 76%
rename from src/shared.module.ts
rename to src/shared/shared.module.ts
index 9db1a99e..aab66f2f 100644
--- a/src/shared.module.ts
+++ b/src/shared/shared.module.ts
@@ -1,10 +1,10 @@
-import { JwtModule } from '@nestjs/jwt';
import { Module, Global, HttpModule } from '@nestjs/common';
+import { JwtModule } from '@nestjs/jwt';
-import { ConfigService } from './shared/services/config.service';
-import { ValidatorService } from './shared/services/validator.service';
-import { AwsS3Service } from './shared/services/aws-s3.service';
-import { GeneratorService } from './shared/services/generator.service';
+import { AwsS3Service } from './services/aws-s3.service';
+import { ConfigService } from './services/config.service';
+import { GeneratorService } from './services/generator.service';
+import { ValidatorService } from './services/validator.service';
const providers = [ConfigService, ValidatorService, AwsS3Service, GeneratorService];