1.2.0 • Published 1 year ago

@hakcolt/result v1.2.0

Weekly downloads
-
License
MIT
Repository
github
Last release
1 year ago

Result

Result is a tool that helps us control the flow of our use cases and allows us to manage the response, be it an object, an array of objects, a message or an error.

How To Use

export class GetProductUseCase extends BaseUseCase {
  constructor(
    resources: Resources,
    private readonly healthProvider: IHealthProvider,
    private readonly productQueryService: IProductQueryService,
  ) {
    super(resources);
  }

  async execute(idMask: string): Promise<IResult<ProductDto>> {
    // We create the instance of our type of result at the beginning of the use case.
    const result = new Result<ProductDto>();
    // With the resulting object we can control validations within other functions.
    if (!this.validator.isValidEntry(result, { productMaskId: idMask })) {
      return result;
    }
    const product: Product = await this.productQueryService.getByMaskId(idMask);
    if (!product) {
      // The result object helps us with the error response and the code.
      result.setError(
        this.resources.get(resourceKeys.PRODUCT_DOES_NOT_EXIST),
        applicationStatusCodes.NOT_FOUND,
      );
      return result;
    }
    const productDto = ProductDto.fromJSON(product)
    // The result object also helps you with the response data.
    result.setData(productDto, this.applicationStatusCodes.SUCCESS);
    // And finally you give it back.
    return result;
  }
}

The Result object may or may not have a type of response, it fits your needs, and the Result instance without type cannot be assigned data.

const resultWithType = new Result<ProductDto>();
// or
const resultWithoutType = new Result();

For clean code you can return validation result and handles the error clean way through Result visitor pattern method like:

async execute(args: ActionDto): Promise<IResult> {
    const result = new Result();

    if (!this.isValidRequest(result, args)) return result;

    /*...*/

    return result;
}

The Result object can help you in unit tests as shown below:

it("should return a 400 error if quantity is null or zero", async () => {
  itemDto.quantity = null;
  const result = await addUseCase.execute({ userUid, itemDto });
  expect(result.success).toBeFalsy();
  expect(result.error).toBe(
    resources.getWithParams(resourceKeys.SOME_PARAMETERS_ARE_MISSING, "quantity: string"),
  );
  expect(result.statusCode).toBe(resultCodes.BAD_REQUEST);
});