npm i @nestjs/typeorm typeorm pg npm i @nestjs/config
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { ConfigModule, ConfigService } from '@nestjs/config';
import { TypeOrmModule } from '@nestjs/typeorm';
@Module({
imports: [
// load the env variables
ConfigModule.forRoot({ isGlobal: true }),
// database connection
TypeOrmModule.forRootAsync({
inject: [ConfigService],
useFactory: (config: ConfigService) => ({
type: 'postgres',
url: config.get<string>('DATABASE_URL'),
autoLoadEntities: true,
synchronize: true,
ssl: { rejectUnauthorized: false },
}),
}),
],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm';
@Entity('users')
export class User {
@PrimaryGeneratedColumn('uuid')
id: string;
@Column()
name: string;
@Column({ unique: true })
email: string;
}
import { Module } from '@nestjs/common';
import { UsersController } from './users.controller';
import { UsersService } from './users.service';
import { TypeOrmModule } from '@nestjs/typeorm';
import { User } from './entities/user.entity';
@Module({
controllers: [UsersController],
providers: [UsersService],
imports: [TypeOrmModule.forFeature([User])],
})
export class UsersModule {}
import { IsString, IsNotEmpty, IsEmail } from 'class-validator';
export class CreateUserDto {
@IsString()
@IsNotEmpty()
name: string;
@IsEmail()
email: string;
}
import { PartialType } from '@nestjs/mapped-types';
import { CreateUserDto } from './create-user.dto';
export class UpdateUserDto extends PartialType(CreateUserDto) {}
import {
ConflictException,
Injectable,
NotFoundException,
} from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { User } from './entities/user.entity';
import { Repository } from 'typeorm';
import { CreateUserDto } from './dto/create-user.dto';
import { UpdateUserDto } from './dto/update-user.dto';
@Injectable()
export class UsersService {
constructor(
@InjectRepository(User) private readonly userRepo: Repository<User>,
) {}
async create(data: CreateUserDto) {
const existing = await this.userRepo.findOne({
where: { email: data.email },
});
if (existing) {
throw new ConflictException('Email already in use');
}
const user = this.userRepo.create(data);
return this.userRepo.save(user);
}
findAll() {
return this.userRepo.find();
}
async findOne(id: string) {
const user = await this.userRepo.findOne({ where: { id } });
if (!user) {
throw new NotFoundException(`user with ${id} not found`);
}
return user;
}
async update(id: string, data: UpdateUserDto) {
const user = await this.findOne(id);
Object.assign(user, data);
return this.userRepo.save(user);
}
async delete(id: string) {
const user = await this.findOne(id);
await this.userRepo.remove(user);
return { deleted: true, id };
}
}
import {
Body,
Controller,
Delete,
Get,
Param,
Patch,
Post,
} from '@nestjs/common';
import { UsersService } from './users.service';
import { CreateUserDto } from './dto/create-user.dto';
import { UpdateUserDto } from './dto/update-user.dto';
@Controller('users')
export class UsersController {
constructor(private readonly userService: UsersService) {}
@Post()
create(@Body() createUserDto: CreateUserDto) {
return this.userService.create(createUserDto);
}
@Get()
findAll() {
return this.userService.findAll();
}
@Get(':id')
findOne(@Param('id') id: string) {
return this.userService.findOne(id);
}
@Patch(':id')
updateUser(@Param('id') id: string, @Body() updateUserDto: UpdateUserDto) {
return this.userService.update(id, updateUserDto);
}
@Delete(':id')
deleteUser(@Param('id') id: string) {
return this.userService.delete(id);
}
}