0.0.1 • Published 3 years ago

sanari-search-base v0.0.1

Weekly downloads
-
License
ISC
Repository
gitlab
Last release
3 years ago

Sanari Search Base

Installation

npm install --save sanari-search-base

Usage

Example based on Express framework.

Direct generation of where/order/limit/offset query

const router = require("express").Router(),
  models = require("../models"),
  searchBuilder = require("sanari-search-base");

router.get("/search", async (req, res, next) => {
  // Set req.query param to Search Builder constructor
  const search = new searchBuilder(models.Sequelize, req.query),
    whereQuery = search.getWhereQuery(),
    orderQuery = search.getOrderQuery(),
    limitQuery = search.getLimitQuery(),
    offsetQuery = search.getOffsetQuery();

  res.json({
    data: await models.product.findAll({
      include: [{ all: true, nested: true, duplicating: false }],
      where: whereQuery,
      order: orderQuery,
      limit: limitQuery,
      offset: offsetQuery,
      logging: console.log,
    }),
  });
});

Full query generation example (getFullQuery method)

res.json({
  data: await models.product.findAll(
    search.getFullQuery({
      include: [{ all: true, nested: true, duplicating: true }],
    })
  ),
});

Request Examples

Equal

// HTTP:
?filter[name]=John&filter[surname]=Smith
// req.query:
{ filter: { name: 'John', surname: 'Smith' } }
// getWhereQuery()
{ name: 'John', surname: 'Smith' }

Equal (OR)

// HTTP:
?filter[name]=John&filter[surname]=Smith&filter[_condition]=or
// req.query:
{ filter: { name: 'John', surname: 'Smith', _condition: 'or', } }
// getWhereQuery()
{ [Symbol(or)]: {name: 'John', surname: 'Smith'} }

Conditions

// HTTP:
filter[age][gt]=100&filter[age][lt]=10&filter[age][_condition]=or&filter[name][iLike]=%john%&filter[_condition]=or
// req.query
{
  filter: {
    age: {
      gt: 100,
      lt: 10,
      _condition: 'or',
    },
    name: {
      iLike: '%john%',
    },
    _condition: 'or',
  },
}
// getWhereQuery()
{
  [Op.or]: {
    [Op.or]: [{
      age: {
        [Op.gt]: 100,
      },
    }, {
      age: {
        [Op.lt]: 10,
      },
    }],
    name: {
      [Op.like]: '%john%',
    },
  },
}

If _condition parameter is absent - "and" will be used by default

Order

// HTTP:
?order[name]=desc
// req.query:
{ order: { name: 'desc' } }
// getOrderQuery()
[ [ 'name', 'desc' ] ]

Allowed query conditions

Request OptionSequelize SymbolDescription
eq (=)= (no Symbol)Equal
gtOp.gtGreater than
gteOp.gteGreater than or equal
ltOp.ltLess than
lteOp.lteLess than or equal
neOp.neNot equal
betweenOp.betweenBetween value1, value2
notBetweenOp.notBetweenNot Between value1, value2
inOp.inIn value list value1, value2, ...
notInOp.notInNot in value list value1, value2, ...
likeOp.likeLike search (%value, value%, %value%)
notLikeOp.notLikeNot like search (%value, value%, %value%)
iLikeOp.iLikecase insensitive LIKE (PG only)
notILikeOp.notILikecase insensitive NOT LIKE (PG only)
regexpOp.regexpRegexp (MySQL and PG only)
notRegexpOp.notRegexpNot Regexp (MySQL and PG only)
iRegexpOp.iRegexpiRegexp (case insensitive) (PG only)
notIRegexpOp.notIRegexpnotIRegexp (case insensitive) (PG only)

Configuration

You can redefine configuration variables in rc file

Just create .sanari-search file in root folder of your project

Or use setter for 'config' parameter (setConfig)

RC file example:

{
  "logging": false,
  "fields": {
    "filter" : "filter",
    "order"  : "order",
    "limit"  : "limit",
    "offset" : "offset"
  },
  "default-limit": 10
}

Setter example:

new searchBuilder(models.Sequelize, req.query).setConfig({
  logging: true,
});

Front-End

You can use Sanari Search Client module for the generation request http search string on the client side.

Contribute

You are Welcome =) Keep in mind:

npm run test
0.0.1

3 years ago