diff --git a/src/app.module.ts b/src/app.module.ts index a67681e..b66cc54 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -1,6 +1,7 @@ import { Module } from '@nestjs/common'; import { ConfigModule } from '@nestjs/config'; import { TypeOrmModule } from '@nestjs/typeorm'; +import { UsersModule } from './users/users.module'; @Module({ imports: [ @@ -12,7 +13,10 @@ import { TypeOrmModule } from '@nestjs/typeorm'; username: process.env.DB_USERNAME, password: process.env.DB_PASSWORD, database: process.env.DB_NAME, + autoLoadEntities: true, + entities: [__dirname + '/**/*.entity.{js,ts}'], }), + UsersModule, ], controllers: [], providers: [], diff --git a/src/users/dto/create-user.dto.ts b/src/users/dto/create-user.dto.ts new file mode 100644 index 0000000..b80112a --- /dev/null +++ b/src/users/dto/create-user.dto.ts @@ -0,0 +1,21 @@ +import { IsEnum, IsNotEmpty, IsString, Length, Matches } from 'class-validator'; +import { UserRole } from '../enums/user-role.enum'; + +export class CreateUserDto { + @IsString() + @Length(1, 100) + @IsNotEmpty() + firstName: string; + + @IsString() + @Length(1, 100) + @IsNotEmpty() + lastName: string; + + @Matches(/^09\d{9}$/) + mobile: string; + + @IsEnum(UserRole) + @IsNotEmpty() + role: UserRole; +} diff --git a/src/users/dto/update-user.dto.ts b/src/users/dto/update-user.dto.ts new file mode 100644 index 0000000..cb09441 --- /dev/null +++ b/src/users/dto/update-user.dto.ts @@ -0,0 +1,28 @@ +import { + IsEnum, + IsOptional, + IsString, + Length, + Matches, +} from 'class-validator'; +import { UserRole } from '../enums/user-role.enum'; + +export class UpdateUserDto { + @IsOptional() + @IsString() + @Length(1, 100) + firstName?: string; + + @IsOptional() + @IsString() + @Length(1, 100) + lastName?: string; + + @IsOptional() + @Matches(/^09\d{9}$/) + mobile?: string; + + @IsOptional() + @IsEnum(UserRole) + role?: UserRole; +} diff --git a/src/users/users.controller.ts b/src/users/users.controller.ts new file mode 100644 index 0000000..a3af450 --- /dev/null +++ b/src/users/users.controller.ts @@ -0,0 +1,46 @@ +import { + Body, + Controller, + Delete, + Get, + Param, + ParseUUIDPipe, + Patch, + Post, +} from '@nestjs/common'; +import { CreateUserDto } from './dto/create-user.dto'; +import { UpdateUserDto } from './dto/update-user.dto'; +import { UsersService } from './users.service'; + +@Controller('users') +export class UsersController { + constructor(private readonly usersService: UsersService) {} + + @Post() + create(@Body() createUserDto: CreateUserDto) { + return this.usersService.create(createUserDto); + } + + @Get() + findAll() { + return this.usersService.findAll(); + } + + @Get(':id') + findOne(@Param('id', ParseUUIDPipe) id: string) { + return this.usersService.findOne(id); + } + + @Patch(':id') + update( + @Param('id', ParseUUIDPipe) id: string, + @Body() updateUserDto: UpdateUserDto, + ) { + return this.usersService.update(id, updateUserDto); + } + + @Delete(':id') + remove(@Param('id', ParseUUIDPipe) id: string) { + return this.usersService.remove(id); + } +} diff --git a/src/users/users.module.ts b/src/users/users.module.ts new file mode 100644 index 0000000..12a46ed --- /dev/null +++ b/src/users/users.module.ts @@ -0,0 +1,13 @@ +import { Module } from '@nestjs/common'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { User } from './entities/user.entity'; +import { UsersController } from './users.controller'; +import { UsersService } from './users.service'; + +@Module({ + imports: [TypeOrmModule.forFeature([User])], + controllers: [UsersController], + providers: [UsersService], + exports: [UsersService], +}) +export class UsersModule {} diff --git a/src/users/users.service.ts b/src/users/users.service.ts new file mode 100644 index 0000000..c27d41a --- /dev/null +++ b/src/users/users.service.ts @@ -0,0 +1,42 @@ +import { Injectable, NotFoundException } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Repository } from 'typeorm'; +import { CreateUserDto } from './dto/create-user.dto'; +import { UpdateUserDto } from './dto/update-user.dto'; +import { User } from './entities/user.entity'; + +@Injectable() +export class UsersService { + constructor( + @InjectRepository(User) + private readonly usersRepository: Repository, + ) {} + + create(createUserDto: CreateUserDto): Promise { + const user = this.usersRepository.create(createUserDto); + return this.usersRepository.save(user); + } + + findAll(): Promise { + return this.usersRepository.find(); + } + + async findOne(id: string): Promise { + const user = await this.usersRepository.findOneBy({ id }); + if (!user) { + throw new NotFoundException(`User #${id} not found`); + } + return user; + } + + async update(id: string, updateUserDto: UpdateUserDto): Promise { + const user = await this.findOne(id); + Object.assign(user, updateUserDto); + return this.usersRepository.save(user); + } + + async remove(id: string): Promise { + const user = await this.findOne(id); + await this.usersRepository.remove(user); + } +}