Skip to content

Commit 4f3b905

Browse files
sachin6161akshatdubeysf
andauthoredDec 6, 2021
refactor(repository): use FilterBuilder.impose() to merge {deleted:false} filter (#52)
#51 Co-authored-by: akshatdubeysf <77672713+akshatdubeysf@users.noreply.github.com>
1 parent e512996 commit 4f3b905

File tree

3 files changed

+69
-290
lines changed

3 files changed

+69
-290
lines changed
 

‎src/repositories/default-transaction-soft-crud.repository.base.ts

+8-145
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
import {
2-
AndClause,
3-
Condition,
42
DataObject,
53
Filter,
64
juggler,
7-
OrClause,
85
DefaultTransactionalRepository,
96
Where,
107
Getter,
@@ -16,6 +13,7 @@ import {SoftDeleteEntity} from '../models';
1613
import {IAuthUser} from 'loopback4-authentication';
1714
import {HttpErrors} from '@loopback/rest';
1815
import {ErrorKeys} from '../error-keys';
16+
import {produceSoftDeleteFilter, produceSoftDeleteWhere} from './repo-utils';
1917

2018
export abstract class DefaultTransactionSoftCrudRepository<
2119
T extends SoftDeleteEntity,
@@ -34,33 +32,7 @@ export abstract class DefaultTransactionSoftCrudRepository<
3432

3533
find(filter?: Filter<T>, options?: Options): Promise<(T & Relations)[]> {
3634
// Filter out soft deleted entries
37-
if (
38-
filter?.where &&
39-
(filter.where as AndClause<T>).and &&
40-
(filter.where as AndClause<T>).and.length > 0
41-
) {
42-
(filter.where as AndClause<T>).and.push({
43-
deleted: false,
44-
} as Condition<T>);
45-
} else if (
46-
filter?.where &&
47-
(filter.where as OrClause<T>).or &&
48-
(filter.where as OrClause<T>).or.length > 0
49-
) {
50-
(filter.where as AndClause<T>).and = [];
51-
(filter.where as AndClause<T>).and.push(
52-
{
53-
deleted: false,
54-
} as Condition<T>,
55-
{
56-
or: (filter.where as OrClause<T>).or,
57-
},
58-
);
59-
} else {
60-
filter = filter ?? {};
61-
filter.where = filter.where ?? {};
62-
(filter.where as Condition<T>).deleted = false;
63-
}
35+
filter = produceSoftDeleteFilter(filter);
6436

6537
// Now call super
6638
return super.find(filter, options);
@@ -75,34 +47,7 @@ export abstract class DefaultTransactionSoftCrudRepository<
7547
filter?: Filter<T>,
7648
options?: Options,
7749
): Promise<(T & Relations) | null> {
78-
// Filter out soft deleted entries
79-
if (
80-
filter?.where &&
81-
(filter.where as AndClause<T>).and &&
82-
(filter.where as AndClause<T>).and.length > 0
83-
) {
84-
(filter.where as AndClause<T>).and.push({
85-
deleted: false,
86-
} as Condition<T>);
87-
} else if (
88-
filter?.where &&
89-
(filter.where as OrClause<T>).or &&
90-
(filter.where as OrClause<T>).or.length > 0
91-
) {
92-
(filter.where as AndClause<T>).and = [];
93-
(filter.where as AndClause<T>).and.push(
94-
{
95-
deleted: false,
96-
} as Condition<T>,
97-
{
98-
or: (filter.where as OrClause<T>).or,
99-
},
100-
);
101-
} else {
102-
filter = filter ?? {};
103-
filter.where = filter.where ?? {};
104-
(filter.where as Condition<T>).deleted = false;
105-
}
50+
filter = produceSoftDeleteFilter(filter);
10651

10752
// Now call super
10853
return super.findOne(filter, options);
@@ -121,40 +66,9 @@ export abstract class DefaultTransactionSoftCrudRepository<
12166
filter?: Filter<T>,
12267
options?: Options,
12368
): Promise<T & Relations> {
124-
// Filter out soft deleted entries
125-
// Filter out soft deleted entries
126-
if (
127-
filter?.where &&
128-
(filter.where as AndClause<T>).and &&
129-
(filter.where as AndClause<T>).and.length > 0
130-
) {
131-
(filter.where as AndClause<T>).and.push({
132-
deleted: false,
133-
id: id,
134-
} as Condition<T>);
135-
} else if (
136-
filter?.where &&
137-
(filter.where as OrClause<T>).or &&
138-
(filter.where as OrClause<T>).or.length > 0
139-
) {
140-
filter.where = {
141-
and: [
142-
{
143-
deleted: false,
144-
id: id,
145-
} as Condition<T>,
146-
{
147-
or: (filter.where as OrClause<T>).or,
148-
},
149-
],
150-
};
151-
} else {
152-
filter = filter ?? {};
153-
filter.where = {
154-
deleted: false,
155-
id: id,
156-
} as Condition<T>;
157-
}
69+
filter = produceSoftDeleteFilter(filter, {
70+
id,
71+
});
15872

15973
//As parent method findById have filter: FilterExcludingWhere<T>
16074
//so we need add check here.
@@ -181,66 +95,15 @@ export abstract class DefaultTransactionSoftCrudRepository<
18195
where?: Where<T>,
18296
options?: Options,
18397
): Promise<Count> {
184-
// Filter out soft deleted entries
185-
if (
186-
where &&
187-
(where as AndClause<T>).and &&
188-
(where as AndClause<T>).and.length > 0
189-
) {
190-
(where as AndClause<T>).and.push({
191-
deleted: false,
192-
} as Condition<T>);
193-
} else if (
194-
where &&
195-
(where as OrClause<T>).or &&
196-
(where as OrClause<T>).or.length > 0
197-
) {
198-
(where as AndClause<T>).and = [];
199-
(where as AndClause<T>).and.push(
200-
{
201-
deleted: false,
202-
} as Condition<T>,
203-
{
204-
or: (where as OrClause<T>).or,
205-
},
206-
);
207-
} else {
208-
where = where ?? {};
209-
(where as Condition<T>).deleted = false;
210-
}
98+
where = produceSoftDeleteWhere(where);
21199

212100
// Now call super
213101
return super.updateAll(data, where, options);
214102
}
215103

216104
count(where?: Where<T>, options?: Options): Promise<Count> {
217105
// Filter out soft deleted entries
218-
if (
219-
where &&
220-
(where as AndClause<T>).and &&
221-
(where as AndClause<T>).and.length > 0
222-
) {
223-
(where as AndClause<T>).and.push({
224-
deleted: false,
225-
} as Condition<T>);
226-
} else if (
227-
where &&
228-
(where as OrClause<T>).or &&
229-
(where as OrClause<T>).or.length > 0
230-
) {
231-
(where as AndClause<T>).and = [];
232-
(where as AndClause<T>).and.push(
233-
{
234-
deleted: false,
235-
} as Condition<T>,
236-
{
237-
or: (where as OrClause<T>).or,
238-
},
239-
);
240-
} else {
241-
where = where ?? {};
242-
(where as Condition<T>).deleted = false;
243-
}
106+
where = produceSoftDeleteWhere(where);
244107

245108
// Now call super
246109
return super.count(where, options);

‎src/repositories/repo-utils.ts

+52
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
import {Filter, Where} from '@loopback/repository';
2+
import {FilterBuilder, WhereBuilder} from '@loopback/filter';
3+
import {SoftDeleteEntity} from '../models/soft-delete-entity';
4+
5+
/**
6+
* Returns a filter which filters out soft deleted entities.
7+
* @param {Filter<T>?} filter
8+
* @param {object} extras
9+
* @returns {Filter<T> | undefined}
10+
*/
11+
export function produceSoftDeleteFilter<T extends SoftDeleteEntity>(
12+
filter?: Filter<T>,
13+
extras: object = {},
14+
): Filter<T> | undefined {
15+
let builder = new FilterBuilder();
16+
if (filter) {
17+
builder = builder.impose(filter);
18+
}
19+
builder = builder.impose({
20+
where: {
21+
and: [{deleted: false, ...extras}],
22+
},
23+
});
24+
filter = builder.build() as Filter<T>;
25+
return filter;
26+
}
27+
28+
/**
29+
* Returns a where selector which filters out soft deleted entities.
30+
* @param {Filter<T>?} filter
31+
* @param {object} extras
32+
* @returns {Filter<T> | undefined}
33+
*/
34+
export function produceSoftDeleteWhere<T extends SoftDeleteEntity>(
35+
where?: Where<T>,
36+
extras: object = {},
37+
): Where<T> | undefined {
38+
let builder = new WhereBuilder();
39+
if (where) {
40+
builder = builder.impose(where);
41+
}
42+
builder = builder.impose({
43+
and: [
44+
{
45+
deleted: false,
46+
...extras,
47+
},
48+
],
49+
});
50+
where = builder.build() as Where<T>;
51+
return where;
52+
}

‎src/repositories/soft-crud.repository.base.ts

+9-145
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,10 @@
11
import {Getter} from '@loopback/core';
22
import {
3-
AndClause,
4-
Condition,
53
DataObject,
64
DefaultCrudRepository,
75
Entity,
86
Filter,
97
juggler,
10-
OrClause,
118
Where,
129
} from '@loopback/repository';
1310
import {Count} from '@loopback/repository/src/common-types';
@@ -18,6 +15,8 @@ import {IAuthUser} from 'loopback4-authentication';
1815
import {ErrorKeys} from '../error-keys';
1916
import {SoftDeleteEntity} from '../models';
2017

18+
import {produceSoftDeleteFilter, produceSoftDeleteWhere} from './repo-utils';
19+
2120
export abstract class SoftCrudRepository<
2221
T extends SoftDeleteEntity,
2322
ID,
@@ -35,34 +34,7 @@ export abstract class SoftCrudRepository<
3534

3635
find(filter?: Filter<T>, options?: Options): Promise<(T & Relations)[]> {
3736
// Filter out soft deleted entries
38-
if (
39-
filter?.where &&
40-
(filter.where as AndClause<T>).and &&
41-
(filter.where as AndClause<T>).and.length > 0
42-
) {
43-
(filter.where as AndClause<T>).and.push({
44-
deleted: false,
45-
} as Condition<T>);
46-
} else if (
47-
filter?.where &&
48-
(filter.where as OrClause<T>).or &&
49-
(filter.where as OrClause<T>).or.length > 0
50-
) {
51-
filter.where = {
52-
and: [
53-
{
54-
deleted: false,
55-
} as Condition<T>,
56-
{
57-
or: (filter.where as OrClause<T>).or,
58-
},
59-
],
60-
};
61-
} else {
62-
filter = filter ?? {};
63-
filter.where = filter.where ?? {};
64-
(filter.where as Condition<T>).deleted = false;
65-
}
37+
filter = produceSoftDeleteFilter(filter);
6638

6739
// Now call super
6840
return super.find(filter, options);
@@ -78,34 +50,7 @@ export abstract class SoftCrudRepository<
7850
options?: Options,
7951
): Promise<(T & Relations) | null> {
8052
// Filter out soft deleted entries
81-
if (
82-
filter?.where &&
83-
(filter.where as AndClause<T>).and &&
84-
(filter.where as AndClause<T>).and.length > 0
85-
) {
86-
(filter.where as AndClause<T>).and.push({
87-
deleted: false,
88-
} as Condition<T>);
89-
} else if (
90-
filter?.where &&
91-
(filter.where as OrClause<T>).or &&
92-
(filter.where as OrClause<T>).or.length > 0
93-
) {
94-
filter.where = {
95-
and: [
96-
{
97-
deleted: false,
98-
} as Condition<T>,
99-
{
100-
or: (filter.where as OrClause<T>).or,
101-
},
102-
],
103-
};
104-
} else {
105-
filter = filter ?? {};
106-
filter.where = filter.where ?? {};
107-
(filter.where as Condition<T>).deleted = false;
108-
}
53+
filter = produceSoftDeleteFilter(filter);
10954

11055
// Now call super
11156
return super.findOne(filter, options);
@@ -125,38 +70,9 @@ export abstract class SoftCrudRepository<
12570
options?: Options,
12671
): Promise<T & Relations> {
12772
// Filter out soft deleted entries
128-
if (
129-
filter?.where &&
130-
(filter.where as AndClause<T>).and &&
131-
(filter.where as AndClause<T>).and.length > 0
132-
) {
133-
(filter.where as AndClause<T>).and.push({
134-
deleted: false,
135-
id: id,
136-
} as Condition<T>);
137-
} else if (
138-
filter?.where &&
139-
(filter.where as OrClause<T>).or &&
140-
(filter.where as OrClause<T>).or.length > 0
141-
) {
142-
filter.where = {
143-
and: [
144-
{
145-
deleted: false,
146-
id: id,
147-
} as Condition<T>,
148-
{
149-
or: (filter.where as OrClause<T>).or,
150-
},
151-
],
152-
};
153-
} else {
154-
filter = filter ?? {};
155-
filter.where = {
156-
deleted: false,
157-
id: id,
158-
} as Condition<T>;
159-
}
73+
filter = produceSoftDeleteFilter(filter, {
74+
id,
75+
});
16076

16177
//As parent method findById have filter: FilterExcludingWhere<T>
16278
//so we need add check here.
@@ -194,67 +110,15 @@ export abstract class SoftCrudRepository<
194110
options?: Options,
195111
): Promise<Count> {
196112
// Filter out soft deleted entries
197-
if (
198-
where &&
199-
(where as AndClause<T>).and &&
200-
(where as AndClause<T>).and.length > 0
201-
) {
202-
(where as AndClause<T>).and.push({
203-
deleted: false,
204-
} as Condition<T>);
205-
} else if (
206-
where &&
207-
(where as OrClause<T>).or &&
208-
(where as OrClause<T>).or.length > 0
209-
) {
210-
where = {
211-
and: [
212-
{
213-
deleted: false,
214-
} as Condition<T>,
215-
{
216-
or: (where as OrClause<T>).or,
217-
},
218-
],
219-
};
220-
} else {
221-
where = where ?? {};
222-
(where as Condition<T>).deleted = false;
223-
}
113+
where = produceSoftDeleteWhere(where);
224114

225115
// Now call super
226116
return super.updateAll(data, where, options);
227117
}
228118

229119
count(where?: Where<T>, options?: Options): Promise<Count> {
230120
// Filter out soft deleted entries
231-
if (
232-
where &&
233-
(where as AndClause<T>).and &&
234-
(where as AndClause<T>).and.length > 0
235-
) {
236-
(where as AndClause<T>).and.push({
237-
deleted: false,
238-
} as Condition<T>);
239-
} else if (
240-
where &&
241-
(where as OrClause<T>).or &&
242-
(where as OrClause<T>).or.length > 0
243-
) {
244-
where = {
245-
and: [
246-
{
247-
deleted: false,
248-
} as Condition<T>,
249-
{
250-
or: (where as OrClause<T>).or,
251-
},
252-
],
253-
};
254-
} else {
255-
where = where ?? {};
256-
(where as Condition<T>).deleted = false;
257-
}
121+
where = produceSoftDeleteWhere(where);
258122

259123
// Now call super
260124
return super.count(where, options);

0 commit comments

Comments
 (0)
Please sign in to comment.