Search code examples
typescriptexpressdomain-driven-designbcrypt

Value object static Factory


I have some problematic for now that i want to know ur opinions. First, i have a userPassword which represent a value object within my user domain model. i would like to validate 2 cases when creating my userPassword object :

  • Not empty value of password

  • Hash the given value Thus, i don't really know the best approach to achieve it. Now that the problem was exposed, take a look at my code below :

    export class UserPassword {
      private readonly value:string
    
     private  constructor(value: string) {
    
         this.value =  value
     }
      public getValue():string {
          return this.value
      }
    
      // My static factory in which i want to apply my validations cases
    
      static create(password: string):UserPassword {
          // Need to be implemented
      }
      private async hashPassword(password: string):Promise<string>{
         return await bcrypt.hash(password,10)
      }
      async comparePassword(password:string):Promise<boolean> {
          let hashed: string = this.value
          return await bcrypt.compare(password, hashed)
      }
    

    }


Solution

  • For validations purposes, i just done some verifications before creating my password object. Because i think that it's always relevant to defined validation logic in the object contruction. So here is my solution:

    export class UserPassword {
        private readonly value:string
    
         constructor(value: string) {
            if (value === "") {
                throw new UserInputError("Password must be filled")
            }
            else {
                this.hashPassword(value).then(r => console.log(r))
                this.value =  value
            }
       }
        public getValue():string {
            return this.value
        }
    
        private async hashPassword(password: string):Promise<string>{
            return bcrypt.hash(password,10)
        }
        async comparePassword(password:string):Promise<boolean> {
            let hashed: string = this.value
            return  bcrypt.compare(password, hashed)
        }
    }