Skip to content

Commit

Permalink
Merge pull request #167 from sliit-foss/feat/increase-filter-query-fi…
Browse files Browse the repository at this point in the history
…lter-support

Feat/increase filter query filter support
  • Loading branch information
Akalanka47000 authored Mar 25, 2024
2 parents c8df401 + 74c1ecf commit 675ee8b
Show file tree
Hide file tree
Showing 7 changed files with 68 additions and 23 deletions.
12 changes: 12 additions & 0 deletions packages/mongoose-filter-query/readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -115,12 +115,24 @@ console.log(data);

- This will return all users with a first name of John, Eric or matches the given regular expression<br><br>

```javascript
"http://localhost:3000/api/users?filter[or]=first_name=eq(John),last_name=eq(Eric)";
```

- This will return all users with a first name of John or a last name of Eric<br><br>

```javascript
"http://localhost:3000/api/users?filter[age]=and(gt(20),lt(30))";
```

- This will return all users with an age which is between 20 and 30<br><br>

```javascript
"http://localhost:3000/api/users?filter[and]=age=gt(20),first_name=eq(John)";
```

- This will return all users with an age greater than 20 and a first name of John<br><br>

## Multiple Filters<br><br>

- Multiple filters can be chained together with the use of the & operator<br><br>
Expand Down
24 changes: 16 additions & 8 deletions packages/mongoose-filter-query/src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,23 @@ const mongooseFilterQuery = (req, res, next) => {
if (req.query.filter) {
Object.keys(req.query.filter).forEach((key) => {
const value = req.query.filter[key];
const complexOp = complexOperators.find((op) => value.startsWith(`${op}(`));
if (complexOp) {
const values = replaceOperator(value, complexOp)?.split(",");
req.query.filter[`$${complexOp}`] = values.map((subValue) => ({
[key]: mapValue(subValue)
}));
delete req.query.filter[key];
if (complexOperators.includes(key)) {
req.query.filter[`$${key}`] = value.split(",").map((kv) => {
const [key, value] = kv.split("=")
return { [key]: mapValue(value) }
})
delete req.query.filter[key]
} else {
req.query.filter[key] = mapValue(value);
const complexOp = complexOperators.find((op) => value.startsWith(`${op}(`));
if (complexOp) {
const values = replaceOperator(value, complexOp)?.split(",");
req.query.filter[`$${complexOp}`] = values.map((subValue) => ({
[key]: mapValue(subValue)
}));
delete req.query.filter[key];
} else {
req.query.filter[key] = mapValue(value);
}
}
});
} else {
Expand Down
14 changes: 14 additions & 0 deletions packages/mongoose-filter-query/test/__mocks.js
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,20 @@ export const complexFilterResult = {
$or: [{ lastName: { $eq: "Doe" } }, { lastName: { $ne: "John" } }]
};

export const complexRootKeyFilterReq = {
query: {
filter: {
or: "firstName=eq(John),lastName=eq(Doe)",
and: "age=gt(20),firstName=eq(John)"
}
}
};

export const complexRootKeyFilterResult = {
$or: [{ firstName: { $eq: "John" } }, { lastName: { $eq: "Doe" } }],
$and: [{ age: { $gt: 20 } }, { firstName: { $eq: "John" } }],
};

export const sortsReq = {
query: {
sort: {
Expand Down
6 changes: 6 additions & 0 deletions packages/mongoose-filter-query/test/index.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ import {
basicFilterResult,
complexFilterReq,
complexFilterResult,
complexRootKeyFilterReq,
complexRootKeyFilterResult,
sortsReq,
sortResult,
includeReq,
Expand All @@ -24,6 +26,10 @@ describe("test mongoose-filter-query", () => {
mongooseFilterQuery(complexFilterReq, {}, () => {});
expect(complexFilterReq.query.filter).toEqual(complexFilterResult);
});
test("complex as root key", async () => {
mongooseFilterQuery(complexRootKeyFilterReq, {}, () => {});
expect(complexRootKeyFilterReq.query.filter).toEqual(complexRootKeyFilterResult);
});
test("undefined", async () => {
mongooseFilterQuery(sortsReq, {}, () => {});
expect(sortsReq.query.filter).toEqual({});
Expand Down
4 changes: 2 additions & 2 deletions plugins/mongoose-audit/package.json
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
{
"name": "@sliit-foss/mongoose-audit",
"version": "1.0.0",
"version": "1.0.1",
"description": "A rework of the mongoose-audit-log package to support newer versions of mongoose and more flexible options",
"main": "dist/index.js",
"types": "types/index.d.ts",
"scripts": {
"build": "node ../../scripts/esbuild.config.js",
"build:watch": "bash ../../scripts/esbuild.watch.sh",
"bump-version": "bash ../../scripts/bump-version.sh --name=@sliit-foss/express-http-context",
"bump-version": "bash ../../scripts/bump-version.sh --name=@sliit-foss/mongoose-audit",
"lint": "bash ../../scripts/lint.sh",
"release": "bash ../../scripts/release.sh",
"test": "if [ \"$CI\" = \"true\" ]; then \n bash ../../scripts/test/test.sh; else \n echo \"Skipping as it is not a CI environment\"; fi"
Expand Down
29 changes: 17 additions & 12 deletions plugins/mongoose-audit/readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

#### A rework of the [mongoose-audit-log](https://www.npmjs.com/package/mongoose-audit-log) package to support newer versions of mongoose and more flexible options<br>

#### !IMPORTANT - The behaviour of this is different from the original `mongoose-audit-log` package and cannot be considered as a drop in replacement for it.
#### IMPORTANT - The behaviour of this is different from the original `mongoose-audit-log` package and cannot be considered as a drop in replacement for it.

It is a mongoose plugin to manage an audit log of changes to a MongoDB database.

Expand Down Expand Up @@ -54,15 +54,20 @@ router.get("/api/users/:id/history", (req, res, next) => {

## All supported plugin options

```javascript
const { plugin, AuditType } = require("@sliit-foss/mongoose-audit");
- getUser - () => any
- The user extractor function to use. This probably will be fetching the current user from a context or something similar.

SomeSchema.plugin(plugin, {
getUser: () => "user details from wherever you wish to get it",
types: [AuditType.Edit], // default: ['add', 'edit', 'delete']
exclude: ["field1", "field2"],
onAudit: (audit) => {
// Called before persisting the audit is saved. Use this to use your own audit model instead of the default one.
}
});
```
- types - AuditType[]
- The types of audit to record.

- include - string[]
- The fields to consider for the audit. Cannot be used along with exclude.

- exclude - string[]
- The fields to exclude from the audit. Cannot be used along with include.

- onAudit - (audit) => Promise<void>
- Called before persisting the audit is saved. Use this to use your own audit model instead of the default one.

- background - boolean
- By default audit logs are persisted asynchronously in the background. Change this to false if you want it to be synchronous.
2 changes: 1 addition & 1 deletion plugins/mongoose-audit/types/index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ export interface Options {
include?: string[];
/** Called before persisting the audit is saved. Use this to use your own audit model instead of the default one. */
onAudit?: (audit: Audit) => Promise<any>;
/** By default audit logs are persisted asynchronously in the background. Change this to false if you want it to be synchronous" */
/** By default audit logs are persisted asynchronously in the background. Change this to false if you want it to be synchronous." */
background?: boolean;
}

Expand Down

0 comments on commit 675ee8b

Please sign in to comment.