.
This commit is contained in:
parent
9d96c76fa4
commit
e350e65f37
@ -16,7 +16,7 @@
|
||||
"author": "Rodax Software <dev@rodax-software.com>",
|
||||
"license": "ISC",
|
||||
"devDependencies": {
|
||||
"@types/bcryptjs": "^2.4.6",
|
||||
"@types/bcrypt": "^5.0.2",
|
||||
"@types/cors": "^2.8.13",
|
||||
"@types/dinero.js": "^1.9.1",
|
||||
"@types/express": "^4.17.21",
|
||||
@ -57,7 +57,7 @@
|
||||
"dependencies": {
|
||||
"@joi/date": "^2.1.0",
|
||||
"@reis/joi-luxon": "^3.0.0",
|
||||
"bcryptjs": "^2.4.3",
|
||||
"bcrypt": "^5.1.1",
|
||||
"cls-rtracer": "^2.6.3",
|
||||
"cors": "^2.8.5",
|
||||
"cross-env": "5.0.5",
|
||||
|
||||
@ -1,9 +1,9 @@
|
||||
import { Password } from "@/contexts/common/domain";
|
||||
import {
|
||||
AggregateRoot,
|
||||
Email,
|
||||
IDomainError,
|
||||
Name,
|
||||
Password,
|
||||
Result,
|
||||
UniqueID,
|
||||
} from "@shared/contexts";
|
||||
|
||||
@ -1,8 +1,9 @@
|
||||
import { Password } from "@/contexts/common/domain";
|
||||
import {
|
||||
ISequelizeMapper,
|
||||
SequelizeMapper,
|
||||
} from "@/contexts/common/infrastructure";
|
||||
import { Email, Name, Password, UniqueID } from "@shared/contexts";
|
||||
import { Email, Name, UniqueID } from "@shared/contexts";
|
||||
import { AuthUser, IAuthUserProps } from "../../domain/entities";
|
||||
import { IAuthContext } from "../Auth.context";
|
||||
import {
|
||||
@ -32,7 +33,7 @@ class AuthUserMapper
|
||||
password: this.mapsValue(
|
||||
source,
|
||||
"password",
|
||||
Password.createFromHashedText,
|
||||
Password.createFromHashedTextPassword,
|
||||
),
|
||||
};
|
||||
|
||||
|
||||
@ -1,14 +1,15 @@
|
||||
import bCrypt from "bcryptjs";
|
||||
import {
|
||||
DomainError,
|
||||
IStringValueObjectOptions,
|
||||
Result,
|
||||
RuleValidator,
|
||||
StringValueObject,
|
||||
handleDomainError,
|
||||
} from "@shared/contexts";
|
||||
import { UndefinedOr } from "@shared/utilities";
|
||||
import bCrypt from "bcrypt";
|
||||
|
||||
import Joi from "joi";
|
||||
import { UndefinedOr } from "../../../../utilities";
|
||||
import { RuleValidator } from "../RuleValidator";
|
||||
import { DomainError, handleDomainError } from "../errors";
|
||||
import { Result } from "./Result";
|
||||
import {
|
||||
IStringValueObjectOptions,
|
||||
StringValueObject,
|
||||
} from "./StringValueObject";
|
||||
|
||||
export interface IPasswordOptions extends IStringValueObjectOptions {}
|
||||
|
||||
@ -32,7 +33,7 @@ export class Password extends StringValueObject {
|
||||
return RuleValidator.validate<string>(rule, value);
|
||||
}
|
||||
|
||||
public static createFromHashedText(
|
||||
public static createFromHashedTextPassword(
|
||||
value: UndefinedOr<string>,
|
||||
options: IPasswordOptions = {},
|
||||
) {
|
||||
@ -56,7 +57,7 @@ export class Password extends StringValueObject {
|
||||
return Result.ok(new Password(validationResult.object));
|
||||
}
|
||||
|
||||
public static async createFromPlainText(
|
||||
public static async createFromPlainTextPassword(
|
||||
value: UndefinedOr<string>,
|
||||
options: IPasswordOptions = {},
|
||||
) {
|
||||
@ -82,29 +83,11 @@ export class Password extends StringValueObject {
|
||||
);
|
||||
}
|
||||
|
||||
public static async hashPassword(plainText: string): Promise<string> {
|
||||
return hashPassword(plainText, await genSalt());
|
||||
public static hashPassword(plainTextPassword: string): string {
|
||||
return bCrypt.hashSync(plainTextPassword, 10);
|
||||
}
|
||||
|
||||
public verifyPassword(candidatePassword: string): boolean {
|
||||
return bCrypt.compareSync(candidatePassword, this.value!);
|
||||
public verifyPassword(plainTextPassword: string): boolean {
|
||||
return bCrypt.compareSync(plainTextPassword, this.value!);
|
||||
}
|
||||
}
|
||||
|
||||
async function genSalt(rounds = 10): Promise<string> {
|
||||
return new Promise((resolve, reject) => {
|
||||
bCrypt.genSalt(rounds, function (err, salt) {
|
||||
if (err) return reject(err);
|
||||
return resolve(salt);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
async function hashPassword(password: string, salt: string): Promise<string> {
|
||||
return new Promise((resolve, reject) => {
|
||||
bCrypt.hash(password, salt, function (err, hash) {
|
||||
if (err) return reject(err);
|
||||
return resolve(hash);
|
||||
});
|
||||
});
|
||||
}
|
||||
1
server/src/contexts/common/domain/entities/index.ts
Normal file
1
server/src/contexts/common/domain/entities/index.ts
Normal file
@ -0,0 +1 @@
|
||||
export * from "./Password";
|
||||
@ -1,3 +1,4 @@
|
||||
export * from "./Mapper.interface";
|
||||
export * from "./Specification";
|
||||
export * from "./entities";
|
||||
export * from "./repositories";
|
||||
|
||||
@ -1,9 +1,9 @@
|
||||
import { Password } from "@/contexts/common/domain";
|
||||
import {
|
||||
AggregateRoot,
|
||||
Email,
|
||||
IDomainError,
|
||||
Name,
|
||||
Password,
|
||||
Result,
|
||||
UniqueID,
|
||||
handleDomainError,
|
||||
|
||||
@ -1,8 +1,9 @@
|
||||
import { Password } from "@/contexts/common/domain";
|
||||
import {
|
||||
ISequelizeMapper,
|
||||
SequelizeMapper,
|
||||
} from "@/contexts/common/infrastructure";
|
||||
import { Email, Name, Password, UniqueID } from "@shared/contexts";
|
||||
import { Email, Name, UniqueID } from "@shared/contexts";
|
||||
import { IUserProps, User } from "../../domain";
|
||||
import { IUserContext } from "../User.context";
|
||||
import { TCreationUser_Attributes, User_Model } from "../sequelize/user.model";
|
||||
@ -25,7 +26,7 @@ class UserMapper
|
||||
password: this.mapsValue(
|
||||
source,
|
||||
"password",
|
||||
Password.createFromHashedText,
|
||||
Password.createFromHashedTextPassword,
|
||||
),
|
||||
};
|
||||
|
||||
|
||||
@ -11,7 +11,6 @@ export * from "./MoneyValue";
|
||||
export * from "./Name";
|
||||
export * from "./Note";
|
||||
export * from "./NullableValueObject";
|
||||
export * from "./Password";
|
||||
export * from "./Percentage";
|
||||
export * from "./Phone";
|
||||
export * from "./Quantity";
|
||||
|
||||
Loading…
Reference in New Issue
Block a user