Skip to content

Instantly share code, notes, and snippets.

@alefcastelo
Last active March 3, 2022 20:22
Show Gist options
  • Save alefcastelo/f4628801be70076a42e8636f31f59276 to your computer and use it in GitHub Desktop.
Save alefcastelo/f4628801be70076a42e8636f31f59276 to your computer and use it in GitHub Desktop.
class ErrorBase<T> extends Error {
constructor(public readonly type: string, public readonly reason: string) {
super(reason)
}
}
class MemberCreateInputError extends ErrorBase<MemberCreateInputError> {
constructor(reason: string) {
super('invalid.member_create_input', reason)
}
}
class MemberEmailAlreadyInUseError extends ErrorBase<MemberEmailAlreadyInUseError> {
constructor(reason: string) {
super('invalid.member_email_already_in_use', reason)
}
}
class MemberPhoneAlreadyInUseError extends ErrorBase<MemberPhoneAlreadyInUseError> {
constructor(reason: string) {
super('invalid.member_phone_already_in_use', reason)
}
}
type MemberCreateError =
| ErrorBase<MemberCreateInputError>
| ErrorBase<MemberEmailAlreadyInUseError>
| ErrorBase<MemberPhoneAlreadyInUseError>
class MemberCreateUseCase {
handle(input: MemberCreateInput): Either<MemberCreateError, MemberFullOutput> {
...
}
}
class MemberCreateController {
handle() {
const result = this.useCase.handle(...)
if (result.isLeft()) {
if (result.getValue() instanceof BaseError) {
return new Response('Bad Request')
}
return new Response('Server Error')
}
return Response(result.getValue())
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment