result 1.2.0
Install from the command line:
Learn more about npm packages
$ npm install @hakcolt/result@1.2.0
Install via package.json:
"@hakcolt/result": "1.2.0"
About this version
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.
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);
});