diff --git a/src/app.controller.spec.ts b/src/app.controller.spec.ts deleted file mode 100644 index d22f389..0000000 --- a/src/app.controller.spec.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { AppController } from './app.controller'; -import { AppService } from './app.service'; - -describe('AppController', () => { - let appController: AppController; - - beforeEach(async () => { - const app: TestingModule = await Test.createTestingModule({ - controllers: [AppController], - providers: [AppService], - }).compile(); - - appController = app.get(AppController); - }); - - describe('root', () => { - it('should return "Hello World!"', () => { - expect(appController.getHello()).toBe('Hello World!'); - }); - }); -}); diff --git a/src/app.controller.ts b/src/app.controller.ts deleted file mode 100644 index cce879e..0000000 --- a/src/app.controller.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Controller, Get } from '@nestjs/common'; -import { AppService } from './app.service'; - -@Controller() -export class AppController { - constructor(private readonly appService: AppService) {} - - @Get() - getHello(): string { - return this.appService.getHello(); - } -} diff --git a/src/app.module.ts b/src/app.module.ts index 30c8b66..e5a8b82 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -1,6 +1,4 @@ import { Module } from '@nestjs/common'; -import { AppController } from './app.controller'; -import { AppService } from './app.service'; import { TypeOrmModule } from '@nestjs/typeorm'; import { ConfigModule, ConfigService } from '@nestjs/config'; import Joi from 'joi'; @@ -17,7 +15,5 @@ import { databaseConfig } from './config/typeorm.config'; TypeOrmModule.forRootAsync(databaseConfig()), UsersModule ], - controllers: [AppController], - providers: [AppService], }) export class AppModule {} diff --git a/src/app.service.ts b/src/app.service.ts deleted file mode 100644 index 927d7cc..0000000 --- a/src/app.service.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { Injectable } from '@nestjs/common'; - -@Injectable() -export class AppService { - getHello(): string { - return 'Hello World!'; - } -} diff --git a/src/config/config.validation.ts b/src/config/config.validation.ts index 5be941b..ffb022c 100644 --- a/src/config/config.validation.ts +++ b/src/config/config.validation.ts @@ -1,6 +1,8 @@ import * as Joi from 'joi'; export const validationSchema = Joi.object({ + APP_PORT: Joi.number().required(), + DB_HOST: Joi.string().required(), DB_PORT: Joi.number().required(), DB_USER: Joi.string().required(), diff --git a/src/main.ts b/src/main.ts index 3df971c..633b475 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,27 +1,33 @@ import { NestFactory, Reflector } from '@nestjs/core'; import { AppModule } from './app.module'; -import { ClassSerializerInterceptor, ValidationPipe } from '@nestjs/common'; +import { ClassSerializerInterceptor, Logger, ValidationPipe } from '@nestjs/common'; import { setupSwagger } from './config/swagger.config'; +import { ConfigService } from '@nestjs/config'; async function bootstrap() { + const logger = new Logger('APP'); + const app = await NestFactory.create(AppModule); app.useGlobalPipes( - new ValidationPipe( - { - whitelist: true, - forbidNonWhitelisted: true, - transform: true - } - ) + new ValidationPipe({ + whitelist: true, + forbidNonWhitelisted: true, + transform: true, + }), ); - app.useGlobalInterceptors( - new ClassSerializerInterceptor(app.get(Reflector)) - ); + app.useGlobalInterceptors(new ClassSerializerInterceptor(app.get(Reflector))); setupSwagger(app); - await app.listen(process.env.PORT ?? 3000); + const configService = app.get(ConfigService); + + + const PORT = configService.getOrThrow('APP_PORT'); + await app.listen(PORT, '0.0.0.0', () => { + logger.log(`Server running at http://localhost:${PORT}`); + logger.log(`Swagger is serving at http://localhost:${PORT}/api-docs`); + }); } bootstrap(); diff --git a/src/users/DTO/create-user.dto.ts b/src/users/DTO/create-user.dto.ts index bdc1a18..763e8c5 100644 --- a/src/users/DTO/create-user.dto.ts +++ b/src/users/DTO/create-user.dto.ts @@ -22,7 +22,6 @@ export class CreateUserDto { lastName: string; @ApiProperty({ example: 'mahdirafie@gmail.com' }) - @MaxLength(20) @IsEmail() @MaxLength(100) email: string; @@ -36,6 +35,5 @@ export class CreateUserDto { @ApiProperty({ example: 'MahdiPassword@5!' }) @IsString() @MinLength(8) - @Exclude() password: string; } diff --git a/src/users/controllers/users.controller.ts b/src/users/controllers/users.controller.ts index d24f5d4..c64425b 100644 --- a/src/users/controllers/users.controller.ts +++ b/src/users/controllers/users.controller.ts @@ -1,6 +1,21 @@ -import { Controller } from '@nestjs/common'; +import { Body, Controller, Get, Post } from '@nestjs/common'; +import { ApiOperation, ApiResponse } from '@nestjs/swagger'; +import { CreateUserDto } from '../DTO/create-user.dto'; +import { User } from '../entities/user.entity'; +import { UsersService } from '../providers/users.service'; @Controller('users') export class UsersController { - + + constructor( + private readonly userService: UsersService + ) {} + + @Post('signup') + @ApiOperation({summary: 'Create a new user!'}) + @ApiResponse({status: 201, description: 'User created successfully!'}) + @ApiResponse({status: 400, description: 'Bad Request from User!'}) + signupUser(@Body() body: CreateUserDto): Promise { + return this.userService.signupUser(body); + } } diff --git a/src/users/entities/user.entity.ts b/src/users/entities/user.entity.ts index fd79773..9e7189d 100644 --- a/src/users/entities/user.entity.ts +++ b/src/users/entities/user.entity.ts @@ -1,5 +1,6 @@ import { Entity, Column } from "typeorm"; import { BaseEntity } from "src/common/entities/base.entity"; +import { Exclude } from "class-transformer"; @Entity('users') export class User extends BaseEntity { @@ -18,6 +19,7 @@ export class User extends BaseEntity { @Column({ select: false }) + @Exclude() password: string; @Column({ @@ -25,5 +27,6 @@ export class User extends BaseEntity { nullable: true, select: false }) + @Exclude() refreshToken: string; } \ No newline at end of file