All files / UserServices CreateUserService.ts

100% Statements 67/67
71.88% Branches 23/32
90% Functions 9/10
100% Lines 67/67

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 681x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 5x 5x 5x 5x 5x 5x 5x 5x 5x 5x 5x 5x 5x 5x 5x 5x 5x 4x 4x 5x 5x 5x 5x 5x 5x 5x 1x 1x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 1x 1x  
import * as Yup from "yup";
 
import AppError from "../../errors/AppError";
import User from "../../models/User";
 
interface Request {
  email: string;
  password: string;
  name: string;
  profile?: string;
}
 
interface Response {
  email: string;
  name: string;
  id: number;
  profile: string;
}
 
const CreateUserService = async ({
  email,
  password,
  name,
  profile = "admin"
}: Request): Promise<Response> => {
  const schema = Yup.object().shape({
    name: Yup.string().required().min(2),
    email: Yup.string()
      .email()
      .required()
      .test(
        "Check-email",
        "An user with this email already exists.",
        async value => {
          const emailExists = await User.findOne({
            where: { email: value! }
          });
          return !emailExists;
        }
      ),
    password: Yup.string().required().min(5)
  });
 
  try {
    await schema.validate({ email, password, name });
  } catch (err) {
    throw new AppError(err.message);
  }
 
  const user = await User.create({
    email,
    password,
    name,
    profile
  });
 
  const serializedUser = {
    id: user.id,
    name: user.name,
    email: user.email,
    profile: user.profile
  };
 
  return serializedUser;
};
 
export default CreateUserService;