Skip to content

Commit a2f1b9f

Browse files
authored
Merge pull request #3 from rjlopezdev/feat/usage-methods
Usage methods [v1.0.1]
2 parents f71b23b + cf64e12 commit a2f1b9f

File tree

3 files changed

+111
-26
lines changed

3 files changed

+111
-26
lines changed

README.md

Lines changed: 55 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<p align="center">
2-
<img src="logo.jpg" alt="Ngx Guardian logo" width="200" height="200">
2+
<img src="https://raw.githubusercontent.com/rjlopezdev/typeorm-express-query-builder/master/logo.jpg" alt="TypeORM Express Query Builder logo" width="200" height="200">
33
</p>
44

55
<h1 align="center"> TypeORM Express Query Builder </h1>
@@ -45,14 +45,12 @@ Use QueryBuilder export from package and pass your `req.query` as an argument:
4545
```typescript
4646
import QueryBuilder from 'typeorm-express-query-builder';
4747

48-
const builder = QueryBuilder(req.query);
48+
const builder = new QueryBuilder(req.query);
4949
const builtQuery = builder.build();
5050
// Now your query is built, pass it to your TypeORM repository
5151
const results = await fooRepository.find(builtQuery);
5252
```
5353

54-
## Building queries from url
55-
5654
Given the following url query string:
5755

5856
`foo/?name__contains=foo&role__in=admin,common&age__gte=18&page=3&limit=10`
@@ -71,25 +69,60 @@ It will be transformed into:
7169
}
7270
```
7371

72+
## Different ways of retrieve data
73+
74+
### GET, POST method by url query string
75+
76+
`GET foo/?name__contains=foo&role__in=admin,common&age__gte=18&page=3&limit=10`
77+
78+
`POST foo/?name__contains=foo&role__in=admin,common&age__gte=18&page=3&limit=10`
79+
```javascript
80+
app.get('/foo', (req, res) => {
81+
const queryBuilder = new QueryBuilder(req.query); // => Parsed into req.query
82+
const built = queryBuilder.build();
83+
})
84+
```
85+
86+
### POST method by body
87+
88+
```javascript
89+
POST foo/, body: {
90+
"name__contains": "foo",
91+
"role__in": "admin,common",
92+
"age__gte": 18,
93+
"page": 3,
94+
"limit": 10
95+
}
96+
```
97+
98+
```javascript
99+
app.post('/foo', (req, res) => {
100+
const queryBuilder = new QueryBuilder(req.body); // => Parsed into req.body
101+
const built = queryBuilder.build();
102+
})
103+
```
104+
74105
## Available Lookups
75106

76107
| Lookup | Behaviour | Example |
77108
| --- | --- | --- |
78-
_(none)_ | Return entries that match with value | `?foo=raul`
79-
__contains__ | Return entries that contains value | `?foo__contains=lopez`
80-
__startswith__ | Return entries that starts with value | `?foo__startswith=r`
81-
__endswith__ | Return entries that ends with value | `?foo__endswith=dev`
82-
__isnull__ | Return entries with null value | `?foo__isnull`
83-
__lt__ | Return entries with value less than or equal to provided | `?foo__lt=18`
84-
__lte__ | Return entries with value less than provided | `?foo__lte=18`
85-
__gt__ | Returns entries with value greater tahn provided | `?foo__gt=18`
86-
__gte__ | Return entries with value greater then or equal to provided | `?foo__gte=18`
87-
__in__ | Return entries that match with values in list | `?foo__in=admin,common`
88-
__between__ | Return entries in range | `?foo__between=1,27`
89-
90-
## Extra options
91-
92-
| Option | Default | Behaviour |
93-
| --- | :---: | --- |
94-
page | __1__ | Entries page
95-
limit | __25__ | Page size
109+
_(none)_ | Return entries that match with value | `foo=raul`
110+
__contains__ | Return entries that contains value | `foo__contains=lopez`
111+
__startswith__ | Return entries that starts with value | `foo__startswith=r`
112+
__endswith__ | Return entries that ends with value | `foo__endswith=dev`
113+
__isnull__ | Return entries with null value | `foo__isnull`
114+
__lt__ | Return entries with value less than or equal to provided | `foo__lt=18`
115+
__lte__ | Return entries with value less than provided | `foo__lte=18`
116+
__gt__ | Returns entries with value greater than provided | `foo__gt=18`
117+
__gte__ | Return entries with value greater than or equal to provided | `foo__gte=18`
118+
__in__ | Return entries that match with values in list | `foo__in=admin,common`
119+
__between__ | Return entries in range | `foo__between=1,27`
120+
121+
## Options
122+
123+
| Option | Default | Behaviour | Example |
124+
| --- | :---: | --- | --- |
125+
page | __1__ | Return entries for page `page` | `page=2`
126+
limit | __25__ | Return entries for page `page` paginated by size `limit` | `limit=15`
127+
order | - | Order for fields:<br>`+`: Ascendant <br> `-`: Descendant | `order=+foo,-name,+surname`
128+

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "typeorm-express-query-builder",
3-
"version": "1.0.0",
3+
"version": "1.0.1",
44
"description": "Easily transform an Express req.query into TypeORM query",
55
"main": "index.js",
66
"scripts": {
@@ -24,6 +24,7 @@
2424
"license": "MIT",
2525
"devDependencies": {
2626
"@types/jest": "^24.0.11",
27+
"body-parser": "^1.18.3",
2728
"codecov": "^3.2.0",
2829
"express": "^4.16.4",
2930
"jest": "^24.5.0",

test/integration/express/express.spec.ts

Lines changed: 54 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import express = require('express');
22
import request = require('supertest');
3+
import bodyParser = require('body-parser');
34
import { QueryBuilder } from '../../../src/query-builder';
45
import { Like } from 'typeorm';
56

@@ -9,19 +10,69 @@ describe('Test Express integration', () => {
910

1011
beforeAll((done) => {
1112
let app = express();
12-
app.get('/foo', (req, res) => {
13+
app.use(bodyParser.json());
14+
app.use(bodyParser.urlencoded({extended: true}));
15+
app.get('/get', (req, res) => {
1316
const queryBuilder = new QueryBuilder(req.query);
1417
const built = queryBuilder.build();
1518
res.send(built);
1619
});
20+
app.post('/post_urlquery', (req, res) => {
21+
const queryBuilder = new QueryBuilder(req.query);
22+
const built = queryBuilder.build();
23+
res.send(built);
24+
});
25+
app.post('/post_body', (req, res) => {
26+
const queryBuilder = new QueryBuilder(req.body);
27+
const built = queryBuilder.build();
28+
res.send(built);
29+
});
1730
server = app.listen(3000, () => {
1831
done();
1932
});
2033
})
2134

22-
it('should return an appropiate query built', (done) => {
35+
it('should return an appropiate query built for GET /get?...', (done) => {
36+
request(server)
37+
.get('/get?name=rjlopezdev&[email protected]')
38+
.expect(200)
39+
.end((err, res) => {
40+
expect(JSON.parse(res.text)).toEqual({
41+
where: {
42+
name: 'rjlopezdev',
43+
email: Like('%@gmail.com%')
44+
},
45+
skip: 0,
46+
take: 25
47+
});
48+
done();
49+
})
50+
})
51+
52+
it('should return an appropiate query built for POST /post_urlquery?...', (done) => {
2353
request(server)
24-
.get('/foo?name=rjlopezdev&[email protected]')
54+
.post('/post_urlquery?name=rjlopezdev&[email protected]')
55+
.expect(200)
56+
.end((err, res) => {
57+
expect(JSON.parse(res.text)).toEqual({
58+
where: {
59+
name: 'rjlopezdev',
60+
email: Like('%@gmail.com%')
61+
},
62+
skip: 0,
63+
take: 25
64+
});
65+
done();
66+
})
67+
})
68+
69+
it('should return an appropiate query built for POST /post_body, body: {...}', (done) => {
70+
request(server)
71+
.post('/post_body')
72+
.send({
73+
name: 'rjlopezdev',
74+
email__contains: '@gmail.com'
75+
})
2576
.expect(200)
2677
.end((err, res) => {
2778
expect(JSON.parse(res.text)).toEqual({

0 commit comments

Comments
 (0)