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
JavaScript
;
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;