Skip to content
This repository was archived by the owner on Aug 22, 2023. It is now read-only.
/ rules Public archive

Rule packages of galatajs framework

License

Notifications You must be signed in to change notification settings

galatajs/rules

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

11 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation


Image

@galatajs/rules

Rule package of galatajs framework.

What Is It?

This package is the rule package of the galatajs framework. It allows you to write and manage business rules in a cleaner way, not nested if conditions.

You don't have to use galatajs framework, @galatajs/rules is a nodejs package.

Installation

npm install @galatajs/rules

or with yarn

yarn add @galatajs/rules

Basic Usage

import { createRule } from '@galatajs/rules';

const validateUserType = (user) => {
    return {success: user.type === 'admin', error: 'User type is not admin'};
}

const validateUser = createRule<string>(validateUserType);

Advanced Usage

import { createRule } from '@galatajs/rules';
import { ErrorDataResult } from "@galatajs/core"

type Product = {
    name: string;
    price: number;
    stock: number;
}

class ValidationError {
    constructor(public field: string, public message: string) {}
}

const nameValidator = (name: string) => {
    return name.length < 3 ? {success: false, error: new ValidationError('name', 'Name is too short')} : {success: true};
}

const priceNegativeValidator = (price: number) => {
    return price < 0 ? {success: false, error: new ValidationError('price', 'Price is negative')} : {success: true};
}

const priceLimitValidator = (price: number) => {
    return price > 100 ? {success: false, error: new ValidationError('price', 'Price is too high')} : {success: true};
}

const stockValidator = (stock: number) => {
    return stock < 10 ? {success: false, error: new ValidationError('stock', 'Stock is too short')} : {success: true};
}

const productValidatorMiddleware = (req, res, next) => {
    const { name, price, stock } = req.body;
    const result = createRule<ValidationError>()
        .start(nameValidator)
        .and(priceNegativeValidator)
        .or(priceLimitValidator)
        .and(stockValidator)
        .end(name, price, stock);
    next(result.success ? undefined : new ErrorDataResult("Validation Error", result.errors));
}

Usage with waitAll option

It some cases we may wait for all the validations to perform, and sometimes we may want to finish if only one of the validation is false. Set waitAll to false if you want to terminate validation only when a false is returned.

    const { name, price, stock } = req.body;
    const result = createRule<ValidationError>({waitAll: false}) 
        .start(nameValidator)
        .and(priceNegativeValidator)
        .or(priceLimitValidator)
        .and(stockValidator)
        .end(name, price, stock);

So if the first wrong transaction comes in priceNegativeValidator, priceLimitValidator will not be executed.

Releases

No releases published

Packages

No packages published