Skip to content
Snippets Groups Projects
UserService.ts 4.82 KiB
Newer Older
Ramiro's avatar
Ramiro committed
import bcrypt from 'bcrypt';
import { profiles, status } from '../enums/index.enum';
import Paginator from '../interfaces/paginator.interface';
import { User } from '../models/users.model';

Ignacio Otero's avatar
Ignacio Otero committed
import { UserCreateDTO, UserDTO } from '../DTOs/UserDTO';
Ramiro's avatar
Ramiro committed

const list = async (limit: number, offset: number): Promise<Paginator<User>> => {
  let options = {};
  if (limit && offset) {
    options = {
      limit,
      offset,
    };
  }
  return User.findAndCountAll({
    attributes: [
Ignacio Otero's avatar
Ignacio Otero committed
      'id', 'name', 'email', 'organization', 'type', 'status', 'active', 'createdAt',
Ramiro's avatar
Ramiro committed
    ],
    order: [
Ignacio Otero's avatar
Ignacio Otero committed
      ['createdAt', 'ASC'],
Ramiro's avatar
Ramiro committed
    ],
    ...options,
  });
};

const create = async (userDTO: UserCreateDTO): Promise<User> => User.findOne({
  where: {
    email: userDTO.email,
  },
}).then(async (user: User) => {
  if (user) {
Ignacio Otero's avatar
Ignacio Otero committed
    throw new Error('email is taken');
Ramiro's avatar
Ramiro committed
  } else {
Ignacio Otero's avatar
Ignacio Otero committed
    // se hace el checkeo antes porque luego se encripta
    if (userDTO.password.length >= 6) {
      const newUser: User = await User.create({
Ramiro's avatar
Ramiro committed
        name: userDTO.name,
        email: userDTO.email,
Ignacio Otero's avatar
Ignacio Otero committed
        organization: userDTO.organization,
        password: bcrypt.hashSync(userDTO.password, 10),
        type: profiles.client,
        status: status.pending,
Ramiro's avatar
Ramiro committed
        createdBy: 1,
        createdAt: new Date(),
      }).catch((error: Error) => {
        console.log(error);
        throw new Error('create user error');
      });
Ignacio Otero's avatar
Ignacio Otero committed
      newUser.toJSON();
      return newUser;
Ramiro's avatar
Ramiro committed
    }
Ignacio Otero's avatar
Ignacio Otero committed
    throw new Error('password too short');
Ramiro's avatar
Ramiro committed
  }
}).catch((error: Error) => {
  console.log(error);
Ignacio Otero's avatar
Ignacio Otero committed
  throw error;
Ramiro's avatar
Ramiro committed
});

const update = async (userId: number, userDTO: UserCreateDTO): Promise<User> => User.findOne({
  attributes: [
    'id', 'name', 'email',
  ],
  where: {
    id: userId,
  },
}).then(async (user: User) => {
  if (!user) {
    throw new Error('user not found');
  } else {
    const emailUser: User = await User.findOne({
      where: {
        email: userDTO.email,
      },
    });
    if (!emailUser || emailUser.get('id') === user.get('id')) {
      return user.update({
        name: userDTO.name,
        email: userDTO.email,
Ignacio Otero's avatar
Ignacio Otero committed
        organization: userDTO.organization,
Ramiro's avatar
Ramiro committed
        updatedAt: new Date(),
      }).catch((error: Error) => {
        console.log(error);
        throw new Error('user update error');
      });
    }
    throw new Error('email in use');
  }
}).catch((error: Error) => {
  console.log(error);
  throw new Error('find user error');
});

const password = async (userId: number, userDTO: UserCreateDTO): Promise<User> => User.findOne({
  attributes: [
    'id', 'name', 'email',
  ],
  where: {
    id: userId,
  },
}).then(async (user: User) => {
  if (!user) {
    throw new Error('user not found');
  } else {
Ignacio Otero's avatar
Ignacio Otero committed
    return user.update({
      password: bcrypt.hashSync(userDTO.password, 10),
      updatedAt: new Date(),
    }).catch((error: Error) => {
      console.log(error);
      throw new Error('user update error');
    });
  }
}).catch((error: Error) => {
  console.log(error);
  throw new Error('find user error');
});

const approve = async (userId: number): Promise<User> => User.findOne({
  attributes: [
    'id', 'name',
    'email', 'type',
    'createdAt',
  ],
  where: {
    id: userId,
  },
}).then(async (user: User) => {
  if (!user) {
    throw new Error('user not found');
  } else {
    return user.update({
      status: status.approved,
      updatedAt: new Date(),
    }).catch((error: Error) => {
      console.log(error);
      throw new Error('user update error');
    });
Ramiro's avatar
Ramiro committed
  }
}).catch((error: Error) => {
  console.log(error);
  throw new Error('find user error');
});

Ignacio Otero's avatar
Ignacio Otero committed
const cancel = async (userId: number): Promise<User> => User.findOne({
Ramiro's avatar
Ramiro committed
  attributes: [
    'id', 'name',
    'email', 'type',
    'createdAt',
  ],
  where: {
    id: userId,
  },
}).then(async (user: User) => {
  if (!user) {
    throw new Error('user not found');
  } else {
    return user.update({
Ignacio Otero's avatar
Ignacio Otero committed
      status: status.pending,
Ramiro's avatar
Ramiro committed
      updatedAt: new Date(),
    }).catch((error: Error) => {
      console.log(error);
      throw new Error('user update error');
    });
  }
}).catch((error: Error) => {
  console.log(error);
  throw new Error('find user error');
});

const active = async (userId: number): Promise<User> => User.findOne({
  where: {
    id: userId,
  },
}).then(async (user: User) => {
  if (!user) {
    throw new Error('user not found');
  } else {
    return user.update({
      active: !user.get('active'),
      updatedAt: new Date(),
    }).catch((error: Error) => {
      throw new Error('user update error');
    });
  }
}).catch((error: Error) => {
  console.log(error);
  throw new Error('find user error');
});

export default {
  list,
  create,
  update,
  password,
  approve,
Ignacio Otero's avatar
Ignacio Otero committed
  cancel,
Ramiro's avatar
Ramiro committed
  active,
};