|
|
|
@ -7,6 +7,7 @@ import { ConfigService } from "@nestjs/config"; |
|
|
|
|
import { CreateUserDto } from "./dto/create-user.dto"; |
|
|
|
|
import { LoginUserDto } from "./dto/login-user.dto"; |
|
|
|
|
import { UpdateUserDto } from "./dto/update-user.dto"; |
|
|
|
|
import e from "express"; |
|
|
|
|
|
|
|
|
|
@Injectable() |
|
|
|
|
export class UsersService { |
|
|
|
@ -17,7 +18,7 @@ export class UsersService { |
|
|
|
|
) {} |
|
|
|
|
|
|
|
|
|
// Register method
|
|
|
|
|
async register(createUserDto: CreateUserDto): Promise<{ message: string }> { |
|
|
|
|
async register(createUserDto: CreateUserDto){ |
|
|
|
|
try { |
|
|
|
|
createUserDto.password = await bcrypt.hash(createUserDto.password, parseInt(process.env.BCRYPT_SALT_ROUNDS || "10", 10)); |
|
|
|
|
|
|
|
|
@ -69,7 +70,7 @@ export class UsersService { |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
// Login method
|
|
|
|
|
async login(loginUserDto: LoginUserDto): Promise<{ accessToken: string , refreshToken:string}> { |
|
|
|
|
async login(loginUserDto: LoginUserDto){ |
|
|
|
|
try { |
|
|
|
|
const user = await this.userModel.findOne({ |
|
|
|
|
where: { email: loginUserDto.email, username:loginUserDto.username }, |
|
|
|
@ -114,7 +115,7 @@ export class UsersService { |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
// getting access token
|
|
|
|
|
async newAccessToken(refreshToken: string) { |
|
|
|
|
async newAccessToken(refreshToken: string){ |
|
|
|
|
if (!refreshToken) { |
|
|
|
|
throw new HttpException("Refresh token is required.", HttpStatus.BAD_REQUEST); |
|
|
|
|
} |
|
|
|
@ -146,7 +147,7 @@ export class UsersService { |
|
|
|
|
return { accessToken }; |
|
|
|
|
} |
|
|
|
|
//logout (delete refresh token from database)
|
|
|
|
|
async logout(userId: number): Promise<{ message: string }> { |
|
|
|
|
async logout(userId: number){ |
|
|
|
|
if (!userId) { |
|
|
|
|
throw new HttpException("User ID is required.", HttpStatus.BAD_REQUEST); |
|
|
|
|
} |
|
|
|
@ -165,7 +166,7 @@ export class UsersService { |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
//get information user method
|
|
|
|
|
async getProfile(userId: number): Promise<User> { |
|
|
|
|
async getProfile(userId: number){ |
|
|
|
|
try { |
|
|
|
|
const user = await this.userModel.findOne({ |
|
|
|
|
where: { id: userId }, |
|
|
|
@ -186,19 +187,56 @@ export class UsersService { |
|
|
|
|
if (!user) { |
|
|
|
|
throw new NotFoundException("User not found."); |
|
|
|
|
} |
|
|
|
|
if (updateUserDto.password) { |
|
|
|
|
updateUserDto.password = await bcrypt.hash(updateUserDto.password, 10); |
|
|
|
|
|
|
|
|
|
const { refreshToken, ...allowedUpdates } = updateUserDto; |
|
|
|
|
|
|
|
|
|
if (allowedUpdates.username) { |
|
|
|
|
const usernameExists = await this.userModel.findOne({ |
|
|
|
|
where: { username: allowedUpdates.username }, |
|
|
|
|
}); |
|
|
|
|
if (usernameExists && usernameExists.id !== userId) { |
|
|
|
|
throw new BadRequestException("Username is already in use."); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (allowedUpdates.phoneNumber) { |
|
|
|
|
const phoneNumberExists = await this.userModel.findOne({ |
|
|
|
|
where: { phoneNumber: allowedUpdates.phoneNumber }, |
|
|
|
|
}); |
|
|
|
|
if (phoneNumberExists && phoneNumberExists.id !== userId) { |
|
|
|
|
throw new BadRequestException("Phone number is already in use."); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (allowedUpdates.email) { |
|
|
|
|
const emailExists = await this.userModel.findOne({ |
|
|
|
|
where: { email: allowedUpdates.email }, |
|
|
|
|
}); |
|
|
|
|
if (emailExists && emailExists.id !== userId) { |
|
|
|
|
throw new BadRequestException("Email is already in use."); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (allowedUpdates.password) { |
|
|
|
|
allowedUpdates.password = await bcrypt.hash(allowedUpdates.password, 10); |
|
|
|
|
} |
|
|
|
|
await user.update(updateUserDto); |
|
|
|
|
|
|
|
|
|
await user.update(allowedUpdates); |
|
|
|
|
|
|
|
|
|
user = await this.userModel.findOne({ |
|
|
|
|
where: { id: userId }, |
|
|
|
|
attributes: { exclude: ["password"] }, |
|
|
|
|
attributes: { exclude: ["password", "refreshToken"] }, |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
return { message: "User account updated successfully.", user }; |
|
|
|
|
} catch (error) { |
|
|
|
|
console.error(error) |
|
|
|
|
if (error instanceof HttpException) { |
|
|
|
|
throw error; |
|
|
|
|
} |
|
|
|
|
throw new HttpException("An unexpected error occurred. Please try again later.", HttpStatus.INTERNAL_SERVER_ERROR); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
}
|
|
|
|
|
//get users list
|
|
|
|
|
async findAll(): Promise<User[]> { |
|
|
|
|
try { |
|
|
|
|