UNPKG

ddd-tool-kit

Version:

A development tool kit for using Domain Driven Design in your Web API Node.js

52 lines (51 loc) 2.15 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.PasswordValueObject = void 0; const bcryptjs_1 = require("bcryptjs"); const value_object_abstract_1 = require("../../../abstract/value-object/value-object.abstract"); const output_util_1 = require("../../../utils/output/output.util"); const password_errors_1 = require("./password.errors"); class PasswordValueObject extends value_object_abstract_1.ValueObject { get isHashed() { return this.value.includes('$2a$12') && this.value.length === 60; } hash() { if (this.isHashed) { return output_util_1.Output.fail(password_errors_1.INVALID_PASSWORD_ALREADY_HASHED); } const password = this.props.value; const salt = (0, bcryptjs_1.genSaltSync)(12); this.props.value = (0, bcryptjs_1.hashSync)(password, salt); return output_util_1.Output.success(); } compare(password) { if (!this.isHashed) { return output_util_1.Output.fail(password_errors_1.INVALID_PASSWORD_IS_NOT_HASHED); } const isCorrectPassword = (0, bcryptjs_1.compareSync)(password, this.value); return isCorrectPassword ? output_util_1.Output.success() : output_util_1.Output.fail(password_errors_1.INVALID_INCORRECT_PASSWORD); } sanitizeProps() { this.props.value.trim(); } isValidProps() { const uppercaseRegex = /[A-Z]/; const lowercaseRegex = /[a-z]/; const password = this.value; const hasMinLength = password.length >= 20; const hasUppercase = uppercaseRegex.test(password); const hasLowercase = lowercaseRegex.test(password); return hasMinLength && hasUppercase && hasLowercase; } static init(props) { const password = new PasswordValueObject(props); const isInvalidProps = !password.isValidProps(); if (isInvalidProps) { return output_util_1.Output.fail(password_errors_1.INVALID_USER_PASSWORD); } return output_util_1.Output.success(password); } } exports.PasswordValueObject = PasswordValueObject;