const UserService = Layer.sync(UserServiceTag, () => ({
users: [],
findOne(filter: Partial<User>) {
return Effect.promise((function(this: UserService) {
const {promise, resolve} = Promise.withResolvers<User | undefined>()
const result = this.users.find((user: User) => {
return Object.keys(filter).every(key => user[key as keyof User] === filter[key as keyof User])
})
resolve(result)
return promise
}).bind(this))
},
findOneValidate(filter: Partial<User>) {
return pipe(
this.findOne(filter),
Effect.promise(function(this: UserService, user: User | undefined) {
return {
...user,
async validatePassword: (password: string) => password === user?.password // implement bcrypt.compare
}
})
)
}
}))
const UserService = Layer.sync(UserServiceTag, () => ({
users: [],
findOne(filter: Partial<User>) {
return Effect.promise((function(this: UserService) {
const {promise, resolve} = Promise.withResolvers<User | undefined>()
const result = this.users.find((user: User) => {
return Object.keys(filter).every(key => user[key as keyof User] === filter[key as keyof User])
})
resolve(result)
return promise
}).bind(this))
},
findOneValidate(filter: Partial<User>) {
return pipe(
this.findOne(filter),
Effect.promise(function(this: UserService, user: User | undefined) {
return {
...user,
async validatePassword: (password: string) => password === user?.password // implement bcrypt.compare
}
})
)
}
}))