import { UserRepository } from '../repositories/user.repository';
import { User } from '../entities/user.entity';
import { CreateUserDto, UpdateUserDto } from '../dtos/user.dto';
import bcrypt from 'bcrypt';
export class UserService {
private userRepository: UserRepository;
constructor() {
this.userRepository = new UserRepository();
}
async createUser(createUserDto: CreateUserDto): Promise<User> {
const existingUser = await this.userRepository.findByEmail(createUserDto.email);
if (existingUser) {
throw new Error('User with this email already exists');
}
const hashedPassword = await bcrypt.hash(createUserDto.password, 10);
const user = await this.userRepository.create({
...createUserDto,
password: hashedPassword,
});
return user;
}
async getAllUsers(): Promise<User[]> {
return await this.userRepository.findAll();
}
async getUserById(id: string): Promise<User> {
const user = await this.userRepository.findById(id);
if (!user) {
throw new Error('User not found');
}
return user;
}
async updateUser(id: string, updateUserDto: UpdateUserDto): Promise<User> {
const user = await this.userRepository.findById(id);
if (!user) {
throw new Error('User not found');
}
if (updateUserDto.email && updateUserDto.email !== user.email) {
const existingUser = await this.userRepository.findByEmail(updateUserDto.email);
if (existingUser) {
throw new Error('Email already in use');
}
}
if (updateUserDto.password) {
updateUserDto.password = await bcrypt.hash(updateUserDto.password, 10);
}
const updatedUser = await this.userRepository.update(id, updateUserDto);
if (!updatedUser) {
throw new Error('Failed to update user');
}
return updatedUser;
}
async deleteUser(id: string): Promise<void> {
const user = await this.userRepository.findById(id);
if (!user) {
throw new Error('User not found');
}
const deleted = await this.userRepository.delete(id);
if (!deleted) {
throw new Error('Failed to delete user');
}
}
}