user.service.ts 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. import { Injectable, Logger } from '@nestjs/common';
  2. import * as bcrypt from 'bcrypt';
  3. import { LoginPayload, RegisteredUser, User } from 'src/interface/interface';
  4. @Injectable()
  5. export class UsersService {
  6. private logger: Logger = new Logger(`UsersService`)
  7. private users: RegisteredUser[] = [];
  8. private idCounter = 1;
  9. public async createUser(user: User): Promise<RegisteredUser> {
  10. return new Promise(async (resolve, reject) => {
  11. const existing = this.users.find(u => u.email === user.email);
  12. if (existing) {
  13. reject('User already exists');
  14. } else {
  15. const hashedPassword = await bcrypt.hash(user.password, 10);
  16. const newUser: RegisteredUser = {
  17. id: (this.idCounter++).toString(),
  18. name: user.name,
  19. email: user.email,
  20. password: hashedPassword,
  21. };
  22. this.users.push(newUser);
  23. this.logger.log(`Current users count: ${this.users.length}`)
  24. resolve(newUser)
  25. }
  26. })
  27. }
  28. public async findByEmail(email: string): Promise<RegisteredUser | undefined> {
  29. return this.users.find(user => user.email === email);
  30. }
  31. public async validateUser(login: LoginPayload): Promise<Omit<RegisteredUser, 'password'>> {
  32. return new Promise((resolve, reject) => {
  33. this.findByEmail(login.email)
  34. .then(user => {
  35. if (!user) return reject('No such user');
  36. // console.log('Comparing passwords...');
  37. // console.log('Login.password:', login.password, typeof login.password);
  38. // console.log('User.password:', user.password, typeof user.password);
  39. if (typeof login.password !== 'string' || typeof user.password !== 'string') {
  40. return reject('Password and hash must be strings');
  41. }
  42. bcrypt.compare(login.password, user.password, (err, isMatch) => {
  43. if (err) return reject(err);
  44. if (!isMatch) return reject(`Password doesn't match`);
  45. const { password, ...safeUser } = user;
  46. resolve(safeUser);
  47. });
  48. })
  49. .catch(err => reject(err));
  50. });
  51. }
  52. public async findById(id: string): Promise<RegisteredUser | undefined> {
  53. return this.users.find(user => user.id === id);
  54. }
  55. public getAllUsers(): Omit<RegisteredUser, 'password'>[] {
  56. return this.users.map(({ password, ...rest }) => rest);
  57. }
  58. public async updateUser(updatedUser: RegisteredUser): Promise<void> {
  59. const index = this.users.findIndex(user => user.id === updatedUser.id);
  60. if (index === -1) {
  61. throw new Error(`User with ID ${updatedUser.id} not found`);
  62. }
  63. this.users[index] = updatedUser;
  64. this.logger.log(`User ${updatedUser.id} updated successfully`);
  65. }
  66. }