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];