@goatlab/fluent 0.6.24 → 0.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +17 -136
- package/dist/BaseConnector.d.ts +45 -75
- package/dist/BaseConnector.js +218 -317
- package/dist/Fluent.d.ts +2 -21
- package/dist/Fluent.js +0 -33
- package/dist/FluentEntity.d.ts +7 -0
- package/dist/FluentEntity.js +28 -0
- package/dist/TypeOrmConnector/TypeOrmConnector.d.ts +31 -24
- package/dist/TypeOrmConnector/TypeOrmConnector.js +599 -343
- package/dist/TypeOrmConnector/test/advanced/advancedTestSuite.js +182 -48
- package/dist/TypeOrmConnector/test/advanced/typeOrm.entity.d.ts +103 -3
- package/dist/TypeOrmConnector/test/advanced/typeOrm.entity.js +30 -13
- package/dist/TypeOrmConnector/test/advanced/typeOrm.mongo.repository.d.ts +5 -0
- package/dist/TypeOrmConnector/test/advanced/typeOrm.mongo.repository.js +17 -0
- package/dist/TypeOrmConnector/test/advanced/typeOrm.mysql.repository.d.ts +5 -0
- package/dist/TypeOrmConnector/test/advanced/typeOrm.mysql.repository.js +17 -0
- package/dist/TypeOrmConnector/test/advanced/typeOrm.repository.d.ts +3 -3
- package/dist/TypeOrmConnector/test/advanced/typeOrm.repository.js +8 -3
- package/dist/TypeOrmConnector/test/basic/basicTestSuite.d.ts +1 -1
- package/dist/TypeOrmConnector/test/basic/basicTestSuite.js +42 -16
- package/dist/TypeOrmConnector/test/basic/goat.entity.d.ts +43 -0
- package/dist/TypeOrmConnector/test/basic/goat.entity.js +19 -8
- package/dist/TypeOrmConnector/test/basic/goat.mongo.repository.d.ts +5 -0
- package/dist/TypeOrmConnector/test/basic/goat.mongo.repository.js +16 -0
- package/dist/TypeOrmConnector/test/basic/goat.mysql.repository.d.ts +5 -0
- package/dist/TypeOrmConnector/test/basic/goat.mysql.repository.js +16 -0
- package/dist/TypeOrmConnector/test/basic/goat.repository.d.ts +3 -4
- package/dist/TypeOrmConnector/test/basic/goat.repository.js +7 -3
- package/dist/TypeOrmConnector/test/dbEntities.d.ts +6 -6
- package/dist/TypeOrmConnector/test/docker/docker.d.ts +35 -0
- package/dist/TypeOrmConnector/test/docker/docker.js +149 -0
- package/dist/TypeOrmConnector/test/docker/mysql.d.ts +17 -0
- package/dist/TypeOrmConnector/test/docker/mysql.js +132 -0
- package/dist/TypeOrmConnector/test/mongo/car.mongo.repository.d.ts +8 -0
- package/dist/TypeOrmConnector/test/mongo/car.mongo.repository.js +23 -0
- package/dist/TypeOrmConnector/test/mongo/mongo.memory.d.ts +4 -0
- package/dist/TypeOrmConnector/test/mongo/mongo.memory.js +43 -0
- package/dist/TypeOrmConnector/test/mongo/mongoDatasource.d.ts +2 -0
- package/dist/TypeOrmConnector/test/mongo/mongoDatasource.js +12 -0
- package/dist/TypeOrmConnector/test/mongo/roles.mongo.repository.d.ts +8 -0
- package/dist/TypeOrmConnector/test/mongo/roles.mongo.repository.js +23 -0
- package/dist/TypeOrmConnector/test/mongo/roles_user.mongo.repository.d.ts +6 -0
- package/dist/TypeOrmConnector/test/mongo/roles_user.mongo.repository.js +17 -0
- package/dist/TypeOrmConnector/test/mongo/user.mongo.repository.d.ts +10 -0
- package/dist/TypeOrmConnector/test/mongo/user.mongo.repository.js +31 -0
- package/dist/TypeOrmConnector/test/mysql/car.mysql.repository.d.ts +6 -0
- package/dist/TypeOrmConnector/test/mysql/car.mysql.repository.js +17 -0
- package/dist/TypeOrmConnector/test/mysql/mysqlDataSource.d.ts +2 -0
- package/dist/TypeOrmConnector/test/mysql/mysqlDataSource.js +16 -0
- package/dist/TypeOrmConnector/test/mysql/roles.mysql.repository.d.ts +8 -0
- package/dist/TypeOrmConnector/test/mysql/roles.mysql.repository.js +23 -0
- package/dist/TypeOrmConnector/test/mysql/roles_user.mysql.repository.d.ts +6 -0
- package/dist/TypeOrmConnector/test/mysql/roles_user.mysql.repository.js +17 -0
- package/dist/TypeOrmConnector/test/mysql/user.mysql.repository.d.ts +10 -0
- package/dist/TypeOrmConnector/test/mysql/user.mysql.repository.js +32 -0
- package/dist/TypeOrmConnector/test/relations/car/car.entity.d.ts +1 -0
- package/dist/TypeOrmConnector/test/relations/car/car.entity.js +13 -5
- package/dist/TypeOrmConnector/test/relations/car/car.repositoryTypeOrm.d.ts +3 -3
- package/dist/TypeOrmConnector/test/relations/car/car.repositoryTypeOrm.js +11 -4
- package/dist/TypeOrmConnector/test/relations/car/car.schema.d.ts +38 -0
- package/dist/TypeOrmConnector/test/relations/car/car.schema.js +14 -0
- package/dist/TypeOrmConnector/test/relations/relationsTestsSuite.js +85 -32
- package/dist/TypeOrmConnector/test/relations/roles/role.schema.d.ts +35 -0
- package/dist/TypeOrmConnector/test/relations/roles/role.schema.js +16 -0
- package/dist/TypeOrmConnector/test/relations/roles/roles.entity.js +4 -4
- package/dist/TypeOrmConnector/test/relations/roles/roles.repositoryTypeOrm.d.ts +3 -3
- package/dist/TypeOrmConnector/test/relations/roles/roles.repositoryTypeOrm.js +12 -4
- package/dist/TypeOrmConnector/test/relations/roles/roles_user.entity.d.ts +2 -2
- package/dist/TypeOrmConnector/test/relations/roles/roles_user.entity.js +4 -4
- package/dist/TypeOrmConnector/test/relations/roles/roles_user.schema.d.ts +15 -0
- package/dist/TypeOrmConnector/test/relations/roles/roles_user.schema.js +9 -0
- package/dist/TypeOrmConnector/test/relations/roles/roles_users.repositoryTypeOrm.d.ts +3 -3
- package/dist/TypeOrmConnector/test/relations/roles/roles_users.repositoryTypeOrm.js +8 -3
- package/dist/TypeOrmConnector/test/relations/user/user.entity.js +10 -10
- package/dist/TypeOrmConnector/test/relations/user/user.repositoryTypeOrm.d.ts +3 -3
- package/dist/TypeOrmConnector/test/relations/user/user.repositoryTypeOrm.js +17 -5
- package/dist/TypeOrmConnector/test/relations/user/user.schema.d.ts +150 -0
- package/dist/TypeOrmConnector/test/relations/user/user.schema.js +18 -0
- package/dist/TypeOrmConnector/test/{memoryDataSource.d.ts → sqlite/memoryDataSource.d.ts} +0 -0
- package/dist/TypeOrmConnector/test/{memoryDataSource.js → sqlite/memoryDataSource.js} +1 -1
- package/dist/core/Loopback/build-schema.js +1 -3
- package/dist/core/Loopback/json-to-schema.js +6 -6
- package/dist/core/Loopback/mapValues.d.ts +2 -0
- package/dist/core/Loopback/mapValues.js +835 -0
- package/dist/core/Loopback/query.js +6 -4
- package/dist/core/Loopback/type-resolver.d.ts +1 -1
- package/dist/core/Nestjs/applyDecorators.d.ts +1 -1
- package/dist/core/Nestjs/types/common.js +3 -1
- package/dist/core/Nestjs/types/decorators/apply-is-optional.decorator.d.ts +1 -1
- package/dist/core/Nestjs/types/decorators/create-property.decorator.js +9 -4
- package/dist/core/Nestjs/types/decorators/field.decorator.d.ts +1 -1
- package/dist/core/Nestjs/types/decorators/field.decorator.js +6 -6
- package/dist/core/Nestjs/types/lazy-metadata.storage.js +3 -3
- package/dist/core/Nestjs/types/omit-type.js +6 -2
- package/dist/core/Nestjs/types/reflection.utils.d.ts +1 -1
- package/dist/core/Nestjs/types/reflection.utils.js +9 -2
- package/dist/core/Nestjs/types/type-metadata.storage.js +4 -4
- package/dist/core/Nestjs/types/utils/get-fields-and-decorator.util.d.ts +1 -11
- package/dist/core/Nestjs/types/utils/mapped-types.utils.js +2 -2
- package/dist/decorators.d.ts +25 -21
- package/dist/decorators.js +76 -70
- package/dist/index.d.ts +6 -7
- package/dist/index.js +5 -7
- package/dist/loadRelations.js +108 -68
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/types.d.ts +104 -55
- package/dist/types.js +20 -0
- package/package.json +11 -102
- package/dist/TypeOrmConnector/TypeOrmMongoConnector._bypass.d.ts +0 -1
- package/dist/TypeOrmConnector/TypeOrmMongoConnector._bypass.js +0 -52
- package/dist/TypeOrmConnector/TypeOrmMysqlConnector._bypass.d.ts +0 -1
- package/dist/TypeOrmConnector/TypeOrmMysqlConnector._bypass.js +0 -55
- package/dist/TypeOrmConnector/test/basic/goat.dto.d.ts +0 -8
- package/dist/TypeOrmConnector/test/basic/goat.dto.js +0 -18
- package/dist/TypeOrmConnector/test/relations/car/car.dto.d.ts +0 -5
- package/dist/TypeOrmConnector/test/relations/car/car.dto.js +0 -12
- package/dist/TypeOrmConnector/test/relations/roles/role.dto.d.ts +0 -5
- package/dist/TypeOrmConnector/test/relations/roles/role.dto.js +0 -12
- package/dist/TypeOrmConnector/test/relations/roles/roles_user.dto.d.ts +0 -5
- package/dist/TypeOrmConnector/test/relations/roles/roles_user.dto.js +0 -12
- package/dist/TypeOrmConnector/test/relations/user/user.dto.d.ts +0 -5
- package/dist/TypeOrmConnector/test/relations/user/user.dto.js +0 -12
- package/dist/core/dtos/access.dto.d.ts +0 -4
- package/dist/core/dtos/access.dto.js +0 -21
- package/dist/core/dtos/pagination.dto.d.ts +0 -13
- package/dist/core/dtos/pagination.dto.js +0 -62
|
@@ -1,22 +1,23 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.TypeOrmConnector = exports.
|
|
3
|
+
exports.TypeOrmConnector = exports.getRelationsFromModelGenerator = void 0;
|
|
4
|
+
const types_1 = require("./../types");
|
|
4
5
|
const typeorm_1 = require("typeorm");
|
|
5
|
-
const mongodb_1 = require("mongodb");
|
|
6
6
|
const js_utils_1 = require("@goatlab/js-utils");
|
|
7
|
-
const loadRelations_1 = require("../loadRelations");
|
|
8
7
|
const BaseConnector_1 = require("../BaseConnector");
|
|
9
8
|
const outputKeys_1 = require("../outputKeys");
|
|
10
9
|
const generatorDatasource_1 = require("../generatorDatasource");
|
|
11
|
-
const
|
|
10
|
+
const getRelationsFromModelGenerator = (typeOrmRepo) => {
|
|
12
11
|
const relations = {};
|
|
13
12
|
for (const relation of typeOrmRepo.metadata.relations) {
|
|
13
|
+
const pPath = relation.inverseRelation?.joinColumns[0];
|
|
14
14
|
relations[relation.propertyName] = {
|
|
15
15
|
isOneToMany: relation.isOneToMany,
|
|
16
16
|
isManyToOne: relation.isManyToOne,
|
|
17
17
|
isManyToMany: relation.isManyToMany,
|
|
18
|
-
|
|
19
|
-
|
|
18
|
+
inverseSidePropertyRelationPath: relation.inverseSidePropertyPath,
|
|
19
|
+
inverseSidePropertyPath: pPath?.propertyPath,
|
|
20
|
+
propertyName: relation.propertyName,
|
|
20
21
|
entityName: relation.inverseEntityMetadata.name,
|
|
21
22
|
tableName: relation.inverseEntityMetadata.tableName,
|
|
22
23
|
targetClass: relation.inverseEntityMetadata.target,
|
|
@@ -28,489 +29,744 @@ const getRelations = typeOrmRepo => {
|
|
|
28
29
|
relations
|
|
29
30
|
};
|
|
30
31
|
};
|
|
31
|
-
exports.
|
|
32
|
+
exports.getRelationsFromModelGenerator = getRelationsFromModelGenerator;
|
|
32
33
|
class TypeOrmConnector extends BaseConnector_1.BaseConnector {
|
|
33
|
-
constructor(entity, dataSource,
|
|
34
|
+
constructor({ entity, dataSource, inputSchema, outputSchema }) {
|
|
34
35
|
super();
|
|
35
36
|
this.dataSource = dataSource;
|
|
36
|
-
this.
|
|
37
|
+
this.inputSchema = inputSchema;
|
|
38
|
+
this.outputSchema =
|
|
39
|
+
outputSchema || inputSchema;
|
|
40
|
+
this.entity = entity;
|
|
37
41
|
this.repository = this.dataSource.getRepository(entity);
|
|
38
|
-
const relationShipBuilder = generatorDatasource_1.modelGeneratorDataSource.getRepository(entity);
|
|
39
|
-
const { relations } = (0, exports.getRelations)(relationShipBuilder);
|
|
40
|
-
this.modelRelations = relations;
|
|
41
|
-
this.outputKeys = (0, outputKeys_1.getOutputKeys)(relationShipBuilder) || [];
|
|
42
42
|
this.isMongoDB =
|
|
43
43
|
this.repository.metadata.connection.driver.options.type === 'mongodb';
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
const query = this.getGeneratedQuery();
|
|
47
|
-
const result = await this.repository.find(query);
|
|
48
|
-
let data = this.jsApplySelect(result);
|
|
49
|
-
data = await (0, loadRelations_1.loadRelations)({
|
|
50
|
-
data,
|
|
51
|
-
relations: this.relations,
|
|
52
|
-
modelRelations: this.modelRelations,
|
|
53
|
-
dataSource: this.dataSource,
|
|
54
|
-
provider: 'typeorm',
|
|
55
|
-
self: this
|
|
56
|
-
});
|
|
57
|
-
this.reset();
|
|
58
|
-
return data;
|
|
59
|
-
}
|
|
60
|
-
async getPaginated() {
|
|
61
|
-
const response = await this.get();
|
|
62
|
-
const results = {
|
|
63
|
-
current_page: response[0].meta.currentPage,
|
|
64
|
-
data: response[0].data,
|
|
65
|
-
first_page_url: response[0].meta.firstPageUrl,
|
|
66
|
-
next_page_url: response[0].meta.nextPageUrl,
|
|
67
|
-
path: response[0].meta.path,
|
|
68
|
-
per_page: response[0].meta.itemsPerPage,
|
|
69
|
-
prev_page_url: response[0].meta.previousPageUrl,
|
|
70
|
-
total: response[0].meta.totalItemCount
|
|
71
|
-
};
|
|
72
|
-
if (results && results.data && this.selectArray.length > 0) {
|
|
73
|
-
results.data = this.jsApplySelect(results.data);
|
|
74
|
-
return results;
|
|
75
|
-
}
|
|
76
|
-
return results;
|
|
77
|
-
}
|
|
78
|
-
async all() {
|
|
79
|
-
return this.get();
|
|
80
|
-
}
|
|
81
|
-
async find(filter = {}) {
|
|
82
|
-
const stringFilter = filter;
|
|
83
|
-
let parsedFilter = {};
|
|
84
|
-
try {
|
|
85
|
-
parsedFilter = JSON.parse(stringFilter);
|
|
86
|
-
}
|
|
87
|
-
catch (error) {
|
|
88
|
-
parsedFilter = {};
|
|
89
|
-
}
|
|
90
|
-
this.selectArray = (parsedFilter && parsedFilter.fields) || [];
|
|
91
|
-
this.whereArray =
|
|
92
|
-
(parsedFilter && parsedFilter.where && parsedFilter.where.and) || [];
|
|
93
|
-
this.orWhereArray =
|
|
94
|
-
(parsedFilter && parsedFilter.where && parsedFilter.where.or) || [];
|
|
95
|
-
this.limit((parsedFilter && (parsedFilter.limit || parsedFilter.take)) || 100);
|
|
96
|
-
this.offset((parsedFilter && (parsedFilter.offset || parsedFilter.skip)) || 0);
|
|
97
|
-
if (parsedFilter && parsedFilter.order) {
|
|
98
|
-
const orderB = [
|
|
99
|
-
parsedFilter.order.field,
|
|
100
|
-
parsedFilter.order.asc ? 'asc' : 'desc',
|
|
101
|
-
parsedFilter.order.type || 'string'
|
|
102
|
-
];
|
|
103
|
-
this.chainReference.push({ method: 'orderBy', orderB });
|
|
104
|
-
this.orderByArray = orderB;
|
|
105
|
-
}
|
|
106
|
-
return this.get();
|
|
107
|
-
}
|
|
108
|
-
async paginate(paginator) {
|
|
109
|
-
if (!paginator) {
|
|
110
|
-
throw new Error('Paginator cannot be empty');
|
|
44
|
+
if (this.isMongoDB) {
|
|
45
|
+
this.repository = this.dataSource.getMongoRepository(entity);
|
|
111
46
|
}
|
|
112
|
-
|
|
113
|
-
const
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
raw() {
|
|
117
|
-
return this.repository;
|
|
47
|
+
const relationShipBuilder = generatorDatasource_1.modelGeneratorDataSource.getRepository(entity);
|
|
48
|
+
const { relations } = (0, exports.getRelationsFromModelGenerator)(relationShipBuilder);
|
|
49
|
+
this.modelRelations = relations;
|
|
50
|
+
this.outputKeys = (0, outputKeys_1.getOutputKeys)(relationShipBuilder) || [];
|
|
118
51
|
}
|
|
119
52
|
async insert(data) {
|
|
120
|
-
const
|
|
121
|
-
|
|
122
|
-
this.
|
|
123
|
-
|
|
53
|
+
const validatedData = this.inputSchema.parse(data);
|
|
54
|
+
let datum = await this.repository.save(validatedData);
|
|
55
|
+
if (this.isMongoDB) {
|
|
56
|
+
datum['id'] = datum['id'].toString();
|
|
57
|
+
}
|
|
58
|
+
return this.outputSchema.parse(this.clearEmpties(js_utils_1.Objects.deleteNulls(datum)));
|
|
124
59
|
}
|
|
125
60
|
async insertMany(data) {
|
|
126
|
-
const
|
|
61
|
+
const validatedData = this.inputSchema.array().parse(data);
|
|
62
|
+
const inserted = await this.repository.save(validatedData, {
|
|
127
63
|
chunk: data.length / 300
|
|
128
64
|
});
|
|
129
|
-
this.
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
}
|
|
133
|
-
async updateById(id, data) {
|
|
134
|
-
const parsedId = this.isMongoDB
|
|
135
|
-
? new mongodb_1.ObjectId(id)
|
|
136
|
-
: id;
|
|
137
|
-
const dataToInsert = this.outputKeys.includes('updated')
|
|
138
|
-
? {
|
|
139
|
-
...data,
|
|
140
|
-
...{ updated: new Date() }
|
|
65
|
+
return this.outputSchema.array().parse(inserted.map(d => {
|
|
66
|
+
if (this.isMongoDB) {
|
|
67
|
+
d['id'] = d['id'].toString();
|
|
141
68
|
}
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
const dbResult = await this.repository.findBy({
|
|
145
|
-
id: (0, typeorm_1.In)([parsedId])
|
|
146
|
-
});
|
|
147
|
-
const result = this.jsApplySelect(dbResult);
|
|
148
|
-
this.reset();
|
|
149
|
-
return result[0];
|
|
69
|
+
return this.clearEmpties(js_utils_1.Objects.deleteNulls(d));
|
|
70
|
+
}));
|
|
150
71
|
}
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
? new mongodb_1.ObjectId(id)
|
|
154
|
-
: id;
|
|
155
|
-
const value = await this.repository.findOneOrFail({
|
|
156
|
-
where: { id: parsedId }
|
|
157
|
-
});
|
|
158
|
-
const flatValue = js_utils_1.Objects.flatten(JSON.parse(JSON.stringify(value)));
|
|
159
|
-
Object.keys(flatValue).forEach(key => {
|
|
160
|
-
flatValue[key] = null;
|
|
161
|
-
});
|
|
162
|
-
const nullObject = js_utils_1.Objects.nest(flatValue);
|
|
163
|
-
const newValue = { ...nullObject, ...data };
|
|
164
|
-
delete newValue._id;
|
|
165
|
-
delete newValue.id;
|
|
166
|
-
delete newValue.created;
|
|
167
|
-
delete newValue.updated;
|
|
168
|
-
const dataToInsert = this.outputKeys.includes('updated')
|
|
169
|
-
? {
|
|
170
|
-
...data,
|
|
171
|
-
...{ updated: new Date() }
|
|
172
|
-
}
|
|
173
|
-
: data;
|
|
174
|
-
await this.repository.update(id, dataToInsert);
|
|
175
|
-
const val = await this.repository.findOneOrFail({
|
|
176
|
-
where: {
|
|
177
|
-
id: parsedId
|
|
178
|
-
}
|
|
179
|
-
});
|
|
180
|
-
const returnValue = this.jsApplySelect([val]);
|
|
181
|
-
this.reset();
|
|
182
|
-
return returnValue[0];
|
|
183
|
-
}
|
|
184
|
-
async clear({ sure }) {
|
|
185
|
-
if (!sure || sure !== true) {
|
|
186
|
-
throw new Error('Clear() method will delete everything!, you must set the "sure" parameter "clear({sure:true})" to continue');
|
|
187
|
-
}
|
|
188
|
-
await this.repository.clear();
|
|
189
|
-
this.reset();
|
|
190
|
-
return true;
|
|
191
|
-
}
|
|
192
|
-
async deleteById(id) {
|
|
193
|
-
const parsedId = this.isMongoDB
|
|
194
|
-
? new mongodb_1.ObjectId(id)
|
|
195
|
-
: id;
|
|
196
|
-
await this.repository.delete(parsedId);
|
|
197
|
-
this.reset();
|
|
198
|
-
return id;
|
|
72
|
+
raw() {
|
|
73
|
+
return this.repository;
|
|
199
74
|
}
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
? new mongodb_1.ObjectId(id)
|
|
203
|
-
: id;
|
|
204
|
-
const data = await this.repository.findBy({
|
|
205
|
-
id: (0, typeorm_1.In)([parsedId])
|
|
206
|
-
});
|
|
207
|
-
const result = this.jsApplySelect(data);
|
|
208
|
-
this.reset();
|
|
209
|
-
return result[0];
|
|
75
|
+
mongoRaw() {
|
|
76
|
+
return this.repository;
|
|
210
77
|
}
|
|
211
|
-
async
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
78
|
+
async findMany(query) {
|
|
79
|
+
if (this.isMongoDB && query?.include) {
|
|
80
|
+
const mongoRelationResult = this.customMongoRelatedSearch(query);
|
|
81
|
+
return mongoRelationResult;
|
|
215
82
|
}
|
|
216
|
-
const
|
|
217
|
-
|
|
83
|
+
const generatedQuery = this.generateTypeOrmQuery(query);
|
|
84
|
+
let [found, count] = await this.repository.findAndCount(generatedQuery);
|
|
85
|
+
found.map(d => {
|
|
86
|
+
if (this.isMongoDB) {
|
|
87
|
+
d['id'] = d['id'].toString();
|
|
88
|
+
}
|
|
89
|
+
this.clearEmpties(js_utils_1.Objects.deleteNulls(d));
|
|
218
90
|
});
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
91
|
+
if (query?.paginated) {
|
|
92
|
+
const paginationInfo = {
|
|
93
|
+
total: count,
|
|
94
|
+
perPage: query.paginated.perPage,
|
|
95
|
+
currentPage: query.paginated.page,
|
|
96
|
+
nextPage: query.paginated.page + 1,
|
|
97
|
+
firstPage: 1,
|
|
98
|
+
lastPage: Math.ceil(count / query.paginated.perPage),
|
|
99
|
+
prevPage: query.paginated.page === 1 ? null : query.paginated.page - 1,
|
|
100
|
+
from: (query.paginated.page - 1) * query.paginated.perPage + 1,
|
|
101
|
+
to: query.paginated.perPage * query.paginated.page,
|
|
102
|
+
data: found
|
|
103
|
+
};
|
|
104
|
+
return paginationInfo;
|
|
226
105
|
}
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
getPaginatorLimit(filter) {
|
|
230
|
-
if (this.paginator && this.paginator.perPage) {
|
|
231
|
-
return { ...filter, limit: this.paginator.perPage };
|
|
106
|
+
if (query?.select) {
|
|
107
|
+
return found;
|
|
232
108
|
}
|
|
233
|
-
return
|
|
109
|
+
return this.outputSchema?.array().parse(found);
|
|
234
110
|
}
|
|
235
|
-
|
|
236
|
-
const
|
|
237
|
-
|
|
238
|
-
if (
|
|
239
|
-
|
|
111
|
+
getMongoSelect(select) {
|
|
112
|
+
const selected = js_utils_1.Objects.flatten(select || {});
|
|
113
|
+
for (const k of Object.keys(selected)) {
|
|
114
|
+
if (k === 'id') {
|
|
115
|
+
delete selected[k];
|
|
116
|
+
selected['_id'] = 1;
|
|
117
|
+
continue;
|
|
240
118
|
}
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
119
|
+
const containsId = k.lastIndexOf('.id');
|
|
120
|
+
if (containsId >= 0 && containsId + 3 === k.length) {
|
|
121
|
+
selected[`${k.replace('.id', '')}._id`] = 1;
|
|
122
|
+
delete selected[k];
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
selected[k] = 1;
|
|
126
|
+
}
|
|
127
|
+
return selected;
|
|
128
|
+
}
|
|
129
|
+
getMongoLookup(include) {
|
|
130
|
+
if (!include) {
|
|
131
|
+
return [];
|
|
132
|
+
}
|
|
133
|
+
const lookUps = [];
|
|
134
|
+
for (const relation of Object.keys(include)) {
|
|
135
|
+
if (this.modelRelations[relation]) {
|
|
136
|
+
const dbRelation = this.modelRelations[relation];
|
|
137
|
+
if (dbRelation.isManyToOne) {
|
|
138
|
+
const localField = dbRelation.joinColumns[0].propertyPath;
|
|
139
|
+
lookUps.push({
|
|
140
|
+
$addFields: {
|
|
141
|
+
[`${localField}_object`]: { $toObjectId: `$${localField}` }
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
lookUps.push({ $addFields: { id: { $toString: '$_id' } } });
|
|
145
|
+
lookUps.push({
|
|
146
|
+
$lookup: {
|
|
147
|
+
from: dbRelation.tableName,
|
|
148
|
+
localField: `${localField}_object`,
|
|
149
|
+
foreignField: '_id',
|
|
150
|
+
as: dbRelation.propertyName,
|
|
151
|
+
pipeline: [
|
|
152
|
+
{ $addFields: { id: { $toString: '$_id' } } }
|
|
153
|
+
]
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
lookUps.push({ $unwind: `$${dbRelation.propertyName}` });
|
|
157
|
+
}
|
|
158
|
+
if (dbRelation.isOneToMany) {
|
|
159
|
+
lookUps.push({ $addFields: { string_id: { $toString: '$_id' } } });
|
|
160
|
+
lookUps.push({ $addFields: { id: { $toString: '$_id' } } });
|
|
161
|
+
lookUps.push({
|
|
162
|
+
$lookup: {
|
|
163
|
+
from: dbRelation.tableName,
|
|
164
|
+
localField: 'string_id',
|
|
165
|
+
foreignField: dbRelation.inverseSidePropertyPath,
|
|
166
|
+
as: dbRelation.propertyName,
|
|
167
|
+
pipeline: [
|
|
168
|
+
{ $addFields: { id: { $toString: '$_id' } } }
|
|
169
|
+
]
|
|
170
|
+
}
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
if (dbRelation.isManyToMany) {
|
|
174
|
+
const relatedTableName = dbRelation.tableName;
|
|
175
|
+
const pivotTableName = dbRelation.joinColumns[0].relationMetadata.joinTableName;
|
|
176
|
+
const pivotForeignField = dbRelation.joinColumns[0].propertyPath;
|
|
177
|
+
const inverseForeignField = dbRelation.inverseJoinColumns[0].propertyPath;
|
|
178
|
+
if (!relatedTableName ||
|
|
179
|
+
!pivotTableName ||
|
|
180
|
+
!pivotForeignField ||
|
|
181
|
+
!inverseForeignField) {
|
|
182
|
+
throw new Error(`Your many to many relation is not properly set up. Please check both your models and schema for relation: ${relation}`);
|
|
248
183
|
}
|
|
249
|
-
|
|
184
|
+
lookUps.push({ $addFields: { id: { $toString: '$_id' } } });
|
|
185
|
+
lookUps.push({
|
|
186
|
+
$addFields: { parent_string_id: { $toString: '$_id' } }
|
|
187
|
+
});
|
|
188
|
+
lookUps.push({
|
|
189
|
+
$lookup: {
|
|
190
|
+
from: pivotTableName,
|
|
191
|
+
localField: 'parent_string_id',
|
|
192
|
+
foreignField: pivotForeignField,
|
|
193
|
+
as: dbRelation.propertyName,
|
|
194
|
+
pipeline: [
|
|
195
|
+
{ $addFields: { id: { $toString: '$_id' } } },
|
|
196
|
+
{
|
|
197
|
+
$addFields: {
|
|
198
|
+
[`${inverseForeignField}_object`]: {
|
|
199
|
+
$toObjectId: `$${inverseForeignField}`
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
},
|
|
203
|
+
{
|
|
204
|
+
$lookup: {
|
|
205
|
+
from: relatedTableName,
|
|
206
|
+
localField: `${inverseForeignField}_object`,
|
|
207
|
+
foreignField: '_id',
|
|
208
|
+
pipeline: [
|
|
209
|
+
{ $addFields: { id: { $toString: '$_id' } } }
|
|
210
|
+
],
|
|
211
|
+
as: dbRelation.propertyName
|
|
212
|
+
}
|
|
213
|
+
},
|
|
214
|
+
{ $unwind: `$${dbRelation.propertyName}` },
|
|
215
|
+
{
|
|
216
|
+
$project: {
|
|
217
|
+
[dbRelation.propertyName]: `$${dbRelation.propertyName}`,
|
|
218
|
+
pivot: '$$ROOT'
|
|
219
|
+
}
|
|
220
|
+
},
|
|
221
|
+
{
|
|
222
|
+
$replaceRoot: {
|
|
223
|
+
newRoot: {
|
|
224
|
+
$mergeObjects: ['$$ROOT', `$${dbRelation.propertyName}`]
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
},
|
|
228
|
+
{ $project: { [dbRelation.propertyName]: 0 } }
|
|
229
|
+
]
|
|
230
|
+
}
|
|
231
|
+
});
|
|
232
|
+
}
|
|
250
233
|
}
|
|
251
|
-
|
|
252
|
-
|
|
234
|
+
}
|
|
235
|
+
return lookUps;
|
|
236
|
+
}
|
|
237
|
+
async customMongoRelatedSearch(query) {
|
|
238
|
+
const where = this.getTypeOrmMongoWhere(query?.where);
|
|
239
|
+
const selected = this.getMongoSelect(query?.select);
|
|
240
|
+
const lookups = this.getMongoLookup(query?.include);
|
|
241
|
+
const aggregate = [
|
|
242
|
+
{
|
|
243
|
+
$match: where
|
|
253
244
|
}
|
|
254
|
-
|
|
255
|
-
|
|
245
|
+
];
|
|
246
|
+
if (query?.limit) {
|
|
247
|
+
aggregate.push({ $limit: query.limit });
|
|
248
|
+
}
|
|
249
|
+
for (const lookup of lookups) {
|
|
250
|
+
aggregate.push(lookup);
|
|
251
|
+
}
|
|
252
|
+
if (selected && Object.keys(selected).length) {
|
|
253
|
+
aggregate.push({
|
|
254
|
+
$project: selected
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
let raw = await this.mongoRaw().aggregate(aggregate).toArray();
|
|
258
|
+
return this.outputSchema?.array().parse(raw);
|
|
256
259
|
}
|
|
257
|
-
|
|
260
|
+
generateTypeOrmQuery(query) {
|
|
258
261
|
let filter = {};
|
|
259
|
-
filter = this.isMongoDB
|
|
260
|
-
? this.
|
|
261
|
-
: this.
|
|
262
|
-
filter =
|
|
263
|
-
filter =
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
const page = this.getPage();
|
|
268
|
-
const populate = this.getPopulate();
|
|
269
|
-
if (this.rawQuery) {
|
|
270
|
-
filter.relations = populate || this.rawQuery.populate;
|
|
271
|
-
filter.take = filter.take || this.rawQuery.limit;
|
|
272
|
-
filter.skip = filter.skip || this.rawQuery.skip;
|
|
273
|
-
filter.order = filter.order || this.rawQuery.order;
|
|
274
|
-
filter.select = { ...filter.select, ...this.rawQuery.fields };
|
|
275
|
-
filter.where = { ...this.rawQuery.where };
|
|
262
|
+
filter.where = this.isMongoDB
|
|
263
|
+
? this.getTypeOrmMongoWhere(query?.where)
|
|
264
|
+
: this.getTypeOrmWhere(query?.where);
|
|
265
|
+
filter.take = query?.limit;
|
|
266
|
+
filter.skip = query?.offset;
|
|
267
|
+
if (query?.paginated) {
|
|
268
|
+
filter.take = query.paginated.perPage;
|
|
269
|
+
filter.skip = (query.paginated?.page - 1) * query?.paginated.perPage;
|
|
276
270
|
}
|
|
271
|
+
filter.select = js_utils_1.Objects.flatten(query?.select || {});
|
|
272
|
+
filter.order = this.getOrderBy(query?.orderBy);
|
|
273
|
+
filter.relations = query?.include;
|
|
277
274
|
return filter;
|
|
278
275
|
}
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
if (this.relationQuery && this.relationQuery.data) {
|
|
283
|
-
const ids = this.relationQuery.data.map(d => d.id);
|
|
284
|
-
andFilters.push([
|
|
285
|
-
this.relationQuery.relation.inverseSidePropertyPath,
|
|
286
|
-
'in',
|
|
287
|
-
ids
|
|
288
|
-
]);
|
|
289
|
-
}
|
|
290
|
-
if (!andFilters || andFilters.length === 0) {
|
|
291
|
-
return filters;
|
|
276
|
+
getTypeOrmWhere(where) {
|
|
277
|
+
if (!where || Object.keys(where).length === 0) {
|
|
278
|
+
return {};
|
|
292
279
|
}
|
|
293
280
|
const Filters = { where: [{}] };
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
281
|
+
const orConditions = this.extractConditions(where['OR']);
|
|
282
|
+
const andConditions = this.extractConditions(where['AND']);
|
|
283
|
+
const copy = js_utils_1.Objects.clone(where);
|
|
284
|
+
if (!!copy['AND']) {
|
|
285
|
+
delete copy['AND'];
|
|
286
|
+
}
|
|
287
|
+
if (!!copy['OR']) {
|
|
288
|
+
delete copy['OR'];
|
|
289
|
+
}
|
|
290
|
+
const rootLevelConditions = this.extractConditions([copy]);
|
|
291
|
+
for (const condition of andConditions) {
|
|
292
|
+
const { element, operator, value } = condition;
|
|
298
293
|
switch (operator) {
|
|
299
|
-
case
|
|
294
|
+
case types_1.LogicOperator.equals:
|
|
300
295
|
Filters.where[0] = js_utils_1.Objects.nest({
|
|
301
296
|
...Filters.where[0],
|
|
302
297
|
...{ [element]: (0, typeorm_1.Equal)(value) }
|
|
303
298
|
});
|
|
304
299
|
break;
|
|
305
|
-
case
|
|
300
|
+
case types_1.LogicOperator.isNot:
|
|
306
301
|
Filters.where[0] = js_utils_1.Objects.nest({
|
|
307
302
|
...Filters.where[0],
|
|
308
303
|
...{ [element]: (0, typeorm_1.Not)((0, typeorm_1.Equal)(value)) }
|
|
309
304
|
});
|
|
310
305
|
break;
|
|
311
|
-
case
|
|
306
|
+
case types_1.LogicOperator.greaterThan:
|
|
312
307
|
Filters.where[0] = js_utils_1.Objects.nest({
|
|
313
308
|
...Filters.where[0],
|
|
314
309
|
...{ [element]: (0, typeorm_1.MoreThan)(value) }
|
|
315
310
|
});
|
|
316
311
|
break;
|
|
317
|
-
case
|
|
312
|
+
case types_1.LogicOperator.greaterOrEqualThan:
|
|
318
313
|
Filters.where[0] = js_utils_1.Objects.nest({
|
|
319
314
|
...Filters.where[0],
|
|
320
315
|
...{ [element]: (0, typeorm_1.MoreThanOrEqual)(value) }
|
|
321
316
|
});
|
|
322
317
|
break;
|
|
323
|
-
case
|
|
318
|
+
case types_1.LogicOperator.lessThan:
|
|
324
319
|
Filters.where[0] = js_utils_1.Objects.nest({
|
|
325
320
|
...Filters.where[0],
|
|
326
321
|
...{ [element]: (0, typeorm_1.LessThan)(value) }
|
|
327
322
|
});
|
|
328
323
|
break;
|
|
329
|
-
case
|
|
324
|
+
case types_1.LogicOperator.lessOrEqualThan:
|
|
330
325
|
Filters.where[0] = js_utils_1.Objects.nest({
|
|
331
326
|
...Filters.where[0],
|
|
332
327
|
...{ [element]: (0, typeorm_1.LessThanOrEqual)(value) }
|
|
333
328
|
});
|
|
334
329
|
break;
|
|
335
|
-
case
|
|
330
|
+
case types_1.LogicOperator.in:
|
|
336
331
|
Filters.where[0] = js_utils_1.Objects.nest({
|
|
337
332
|
...Filters.where[0],
|
|
338
333
|
...{ [element]: (0, typeorm_1.In)(value) }
|
|
339
334
|
});
|
|
340
335
|
break;
|
|
341
|
-
case
|
|
336
|
+
case types_1.LogicOperator.notIn:
|
|
342
337
|
Filters.where[0] = js_utils_1.Objects.nest({
|
|
343
338
|
...Filters.where[0],
|
|
344
339
|
...{ [element]: (0, typeorm_1.Not)((0, typeorm_1.In)(value)) }
|
|
345
340
|
});
|
|
346
341
|
break;
|
|
347
|
-
case
|
|
342
|
+
case types_1.LogicOperator.exists:
|
|
348
343
|
Filters.where[0] = js_utils_1.Objects.nest({
|
|
349
344
|
...Filters.where[0],
|
|
350
345
|
...{ [element]: (0, typeorm_1.Not)((0, typeorm_1.IsNull)()) }
|
|
351
346
|
});
|
|
352
347
|
break;
|
|
353
|
-
case
|
|
348
|
+
case types_1.LogicOperator.notExists:
|
|
354
349
|
Filters.where[0] = js_utils_1.Objects.nest({
|
|
355
350
|
...Filters.where[0],
|
|
356
351
|
...{ [element]: (0, typeorm_1.IsNull)() }
|
|
357
352
|
});
|
|
358
353
|
break;
|
|
359
|
-
case
|
|
354
|
+
case types_1.LogicOperator.regexp:
|
|
360
355
|
Filters.where[0] = js_utils_1.Objects.nest({
|
|
361
356
|
...Filters.where[0],
|
|
362
357
|
...{ [element]: (0, typeorm_1.Like)(value) }
|
|
363
358
|
});
|
|
364
359
|
break;
|
|
365
360
|
}
|
|
366
|
-
}
|
|
367
|
-
|
|
368
|
-
const element = condition
|
|
369
|
-
|
|
370
|
-
|
|
361
|
+
}
|
|
362
|
+
for (const condition of rootLevelConditions) {
|
|
363
|
+
const { element, operator, value } = condition;
|
|
364
|
+
switch (operator) {
|
|
365
|
+
case types_1.LogicOperator.equals:
|
|
366
|
+
Filters.where[0] = js_utils_1.Objects.nest({
|
|
367
|
+
...Filters.where[0],
|
|
368
|
+
...{ [element]: (0, typeorm_1.Equal)(value) }
|
|
369
|
+
});
|
|
370
|
+
break;
|
|
371
|
+
case types_1.LogicOperator.isNot:
|
|
372
|
+
Filters.where[0] = js_utils_1.Objects.nest({
|
|
373
|
+
...Filters.where[0],
|
|
374
|
+
...{ [element]: (0, typeorm_1.Not)((0, typeorm_1.Equal)(value)) }
|
|
375
|
+
});
|
|
376
|
+
break;
|
|
377
|
+
case types_1.LogicOperator.greaterThan:
|
|
378
|
+
Filters.where[0] = js_utils_1.Objects.nest({
|
|
379
|
+
...Filters.where[0],
|
|
380
|
+
...{ [element]: (0, typeorm_1.MoreThan)(value) }
|
|
381
|
+
});
|
|
382
|
+
break;
|
|
383
|
+
case types_1.LogicOperator.greaterOrEqualThan:
|
|
384
|
+
Filters.where[0] = js_utils_1.Objects.nest({
|
|
385
|
+
...Filters.where[0],
|
|
386
|
+
...{ [element]: (0, typeorm_1.MoreThanOrEqual)(value) }
|
|
387
|
+
});
|
|
388
|
+
break;
|
|
389
|
+
case types_1.LogicOperator.lessThan:
|
|
390
|
+
Filters.where[0] = js_utils_1.Objects.nest({
|
|
391
|
+
...Filters.where[0],
|
|
392
|
+
...{ [element]: (0, typeorm_1.LessThan)(value) }
|
|
393
|
+
});
|
|
394
|
+
break;
|
|
395
|
+
case types_1.LogicOperator.lessOrEqualThan:
|
|
396
|
+
Filters.where[0] = js_utils_1.Objects.nest({
|
|
397
|
+
...Filters.where[0],
|
|
398
|
+
...{ [element]: (0, typeorm_1.LessThanOrEqual)(value) }
|
|
399
|
+
});
|
|
400
|
+
break;
|
|
401
|
+
case types_1.LogicOperator.in:
|
|
402
|
+
Filters.where[0] = js_utils_1.Objects.nest({
|
|
403
|
+
...Filters.where[0],
|
|
404
|
+
...{ [element]: (0, typeorm_1.In)(value) }
|
|
405
|
+
});
|
|
406
|
+
break;
|
|
407
|
+
case types_1.LogicOperator.notIn:
|
|
408
|
+
Filters.where[0] = js_utils_1.Objects.nest({
|
|
409
|
+
...Filters.where[0],
|
|
410
|
+
...{ [element]: (0, typeorm_1.Not)((0, typeorm_1.In)(value)) }
|
|
411
|
+
});
|
|
412
|
+
break;
|
|
413
|
+
case types_1.LogicOperator.exists:
|
|
414
|
+
Filters.where[0] = js_utils_1.Objects.nest({
|
|
415
|
+
...Filters.where[0],
|
|
416
|
+
...{ [element]: (0, typeorm_1.Not)((0, typeorm_1.IsNull)()) }
|
|
417
|
+
});
|
|
418
|
+
break;
|
|
419
|
+
case types_1.LogicOperator.notExists:
|
|
420
|
+
Filters.where[0] = js_utils_1.Objects.nest({
|
|
421
|
+
...Filters.where[0],
|
|
422
|
+
...{ [element]: (0, typeorm_1.IsNull)() }
|
|
423
|
+
});
|
|
424
|
+
break;
|
|
425
|
+
case types_1.LogicOperator.regexp:
|
|
426
|
+
Filters.where[0] = js_utils_1.Objects.nest({
|
|
427
|
+
...Filters.where[0],
|
|
428
|
+
...{ [element]: (0, typeorm_1.Like)(value) }
|
|
429
|
+
});
|
|
430
|
+
break;
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
for (const condition of orConditions) {
|
|
434
|
+
const { element, operator, value } = condition;
|
|
371
435
|
switch (operator) {
|
|
372
|
-
case
|
|
436
|
+
case types_1.LogicOperator.equals:
|
|
373
437
|
Filters.where.push({ [element]: (0, typeorm_1.Equal)(value) });
|
|
374
438
|
break;
|
|
375
|
-
case
|
|
439
|
+
case types_1.LogicOperator.isNot:
|
|
376
440
|
Filters.where.push({ [element]: (0, typeorm_1.Not)((0, typeorm_1.Equal)(value)) });
|
|
377
441
|
break;
|
|
378
|
-
case
|
|
442
|
+
case types_1.LogicOperator.greaterThan:
|
|
379
443
|
Filters.where.push({ [element]: (0, typeorm_1.MoreThan)(value) });
|
|
380
444
|
break;
|
|
381
|
-
case
|
|
382
|
-
Filters.where.push(
|
|
445
|
+
case types_1.LogicOperator.greaterOrEqualThan:
|
|
446
|
+
Filters.where.push({ [element]: (0, typeorm_1.MoreThanOrEqual)(value) });
|
|
383
447
|
break;
|
|
384
|
-
case
|
|
448
|
+
case types_1.LogicOperator.lessThan:
|
|
385
449
|
Filters.where.push({ [element]: (0, typeorm_1.LessThan)(value) });
|
|
386
450
|
break;
|
|
387
|
-
case
|
|
451
|
+
case types_1.LogicOperator.lessOrEqualThan:
|
|
388
452
|
Filters.where.push({ [element]: (0, typeorm_1.LessThanOrEqual)(value) });
|
|
389
453
|
break;
|
|
390
|
-
case
|
|
454
|
+
case types_1.LogicOperator.in:
|
|
391
455
|
Filters.where.push({ [element]: (0, typeorm_1.In)(value) });
|
|
392
456
|
break;
|
|
393
|
-
case
|
|
457
|
+
case types_1.LogicOperator.notIn:
|
|
394
458
|
Filters.where.push({ [element]: (0, typeorm_1.Not)((0, typeorm_1.In)(value)) });
|
|
395
459
|
break;
|
|
396
|
-
case
|
|
460
|
+
case types_1.LogicOperator.exists:
|
|
397
461
|
Filters.where.push({ [element]: (0, typeorm_1.Not)((0, typeorm_1.IsNull)()) });
|
|
398
462
|
break;
|
|
399
|
-
case
|
|
463
|
+
case types_1.LogicOperator.notExists:
|
|
400
464
|
Filters.where.push({ [element]: (0, typeorm_1.IsNull)() });
|
|
401
465
|
break;
|
|
402
|
-
case
|
|
466
|
+
case types_1.LogicOperator.regexp:
|
|
403
467
|
Filters.where.push({ [element]: (0, typeorm_1.Like)(value) });
|
|
404
468
|
break;
|
|
405
469
|
}
|
|
406
|
-
}
|
|
407
|
-
|
|
470
|
+
}
|
|
471
|
+
const filtered = this.clearEmpties(Filters.where);
|
|
472
|
+
return filtered;
|
|
408
473
|
}
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
474
|
+
getTypeOrmMongoWhere(where) {
|
|
475
|
+
if (!where || Object.keys(where).length === 0) {
|
|
476
|
+
return {};
|
|
477
|
+
}
|
|
478
|
+
const Filters = {
|
|
479
|
+
where: { $or: [{ $and: [] }] }
|
|
480
|
+
};
|
|
481
|
+
const orConditions = this.extractConditions(where['OR']);
|
|
482
|
+
const andConditions = this.extractConditions(where['AND']);
|
|
483
|
+
const copy = js_utils_1.Objects.clone(where);
|
|
484
|
+
if (!!copy['AND']) {
|
|
485
|
+
delete copy['AND'];
|
|
419
486
|
}
|
|
420
|
-
if (
|
|
421
|
-
|
|
487
|
+
if (!!copy['OR']) {
|
|
488
|
+
delete copy['OR'];
|
|
422
489
|
}
|
|
423
|
-
const
|
|
424
|
-
|
|
425
|
-
let element = condition
|
|
426
|
-
const operator = condition[1];
|
|
427
|
-
let value = condition[2];
|
|
490
|
+
const rootLevelConditions = this.extractConditions([copy]);
|
|
491
|
+
for (const condition of andConditions) {
|
|
492
|
+
let { element, operator, value } = condition;
|
|
428
493
|
if (element === 'id') {
|
|
429
494
|
element = '_id';
|
|
430
|
-
value = Array.isArray(value)
|
|
495
|
+
value = (Array.isArray(value)
|
|
431
496
|
? value.map(v => js_utils_1.Ids.objectID(v))
|
|
432
|
-
: js_utils_1.Ids.objectID(value);
|
|
497
|
+
: js_utils_1.Ids.objectID(value));
|
|
433
498
|
}
|
|
434
499
|
switch (operator) {
|
|
435
|
-
case
|
|
436
|
-
Filters.where.$and.push({ [element]: { $eq: value } });
|
|
500
|
+
case types_1.LogicOperator.equals:
|
|
501
|
+
Filters.where.$or[0].$and.push({ [element]: { $eq: value } });
|
|
437
502
|
break;
|
|
438
|
-
case
|
|
439
|
-
Filters.where.$and.push({ [element]: { $neq: value } });
|
|
503
|
+
case types_1.LogicOperator.isNot:
|
|
504
|
+
Filters.where.$or[0].$and.push({ [element]: { $neq: value } });
|
|
440
505
|
break;
|
|
441
|
-
case
|
|
442
|
-
Filters.where.$and.push({ [element]: { $gt: value } });
|
|
506
|
+
case types_1.LogicOperator.greaterThan:
|
|
507
|
+
Filters.where.$or[0].$and.push({ [element]: { $gt: value } });
|
|
443
508
|
break;
|
|
444
|
-
case
|
|
445
|
-
Filters.where.$and.push({ [element]: { $gte: value } });
|
|
509
|
+
case types_1.LogicOperator.greaterOrEqualThan:
|
|
510
|
+
Filters.where.$or[0].$and.push({ [element]: { $gte: value } });
|
|
446
511
|
break;
|
|
447
|
-
case
|
|
448
|
-
Filters.where.$and.push({ [element]: { $lt: value } });
|
|
512
|
+
case types_1.LogicOperator.lessThan:
|
|
513
|
+
Filters.where.$or[0].$and.push({ [element]: { $lt: value } });
|
|
449
514
|
break;
|
|
450
|
-
case
|
|
451
|
-
Filters.where.$and.push({ [element]: { $lte: value } });
|
|
515
|
+
case types_1.LogicOperator.lessOrEqualThan:
|
|
516
|
+
Filters.where.$or[0].$and.push({ [element]: { $lte: value } });
|
|
452
517
|
break;
|
|
453
|
-
case
|
|
454
|
-
Filters.where.$and.push({ [element]: { $in: value } });
|
|
518
|
+
case types_1.LogicOperator.in:
|
|
519
|
+
Filters.where.$or[0].$and.push({ [element]: { $in: value } });
|
|
455
520
|
break;
|
|
456
|
-
case
|
|
457
|
-
Filters.where.$and.push({
|
|
521
|
+
case types_1.LogicOperator.notIn:
|
|
522
|
+
Filters.where.$or[0].$and.push({
|
|
458
523
|
[element]: { $not: { $in: value } }
|
|
459
524
|
});
|
|
460
525
|
break;
|
|
461
|
-
case
|
|
462
|
-
Filters.where.$and.push({ [element]: { $exists: true } });
|
|
526
|
+
case types_1.LogicOperator.exists:
|
|
527
|
+
Filters.where.$or[0].$and.push({ [element]: { $exists: true } });
|
|
463
528
|
break;
|
|
464
|
-
case
|
|
465
|
-
Filters.where.$and.push({ [element]: { $exists: false } });
|
|
529
|
+
case types_1.LogicOperator.notExists:
|
|
530
|
+
Filters.where.$or[0].$and.push({ [element]: { $exists: false } });
|
|
466
531
|
break;
|
|
467
|
-
case
|
|
468
|
-
Filters.where.$and.push({ [element]: { $regex: value } });
|
|
532
|
+
case types_1.LogicOperator.regexp:
|
|
533
|
+
Filters.where.$or[0].$and.push({ [element]: { $regex: value } });
|
|
469
534
|
break;
|
|
470
535
|
}
|
|
471
|
-
});
|
|
472
|
-
return Filters;
|
|
473
|
-
}
|
|
474
|
-
getOrderBy(filter) {
|
|
475
|
-
if (!this.orderByArray || this.orderByArray.length === 0) {
|
|
476
|
-
return filter;
|
|
477
536
|
}
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
537
|
+
for (const condition of rootLevelConditions) {
|
|
538
|
+
let { element, operator, value } = condition;
|
|
539
|
+
if (element === 'id') {
|
|
540
|
+
element = '_id';
|
|
541
|
+
value = (Array.isArray(value)
|
|
542
|
+
? value.map(v => js_utils_1.Ids.objectID(v))
|
|
543
|
+
: js_utils_1.Ids.objectID(value));
|
|
482
544
|
}
|
|
483
|
-
|
|
545
|
+
switch (operator) {
|
|
546
|
+
case types_1.LogicOperator.equals:
|
|
547
|
+
Filters.where.$or[0].$and.push({ [element]: { $eq: value } });
|
|
548
|
+
break;
|
|
549
|
+
case types_1.LogicOperator.isNot:
|
|
550
|
+
Filters.where.$or[0].$and.push({ [element]: { $neq: value } });
|
|
551
|
+
break;
|
|
552
|
+
case types_1.LogicOperator.greaterThan:
|
|
553
|
+
Filters.where.$or[0].$and.push({ [element]: { $gt: value } });
|
|
554
|
+
break;
|
|
555
|
+
case types_1.LogicOperator.greaterOrEqualThan:
|
|
556
|
+
Filters.where.$or[0].$and.push({ [element]: { $gte: value } });
|
|
557
|
+
break;
|
|
558
|
+
case types_1.LogicOperator.lessThan:
|
|
559
|
+
Filters.where.$or[0].$and.push({ [element]: { $lt: value } });
|
|
560
|
+
break;
|
|
561
|
+
case types_1.LogicOperator.lessOrEqualThan:
|
|
562
|
+
Filters.where.$or[0].$and.push({ [element]: { $lte: value } });
|
|
563
|
+
break;
|
|
564
|
+
case types_1.LogicOperator.in:
|
|
565
|
+
Filters.where.$or[0].$and.push({ [element]: { $in: value } });
|
|
566
|
+
break;
|
|
567
|
+
case types_1.LogicOperator.notIn:
|
|
568
|
+
Filters.where.$or[0].$and.push({
|
|
569
|
+
[element]: { $not: { $in: value } }
|
|
570
|
+
});
|
|
571
|
+
break;
|
|
572
|
+
case types_1.LogicOperator.exists:
|
|
573
|
+
Filters.where.$or[0].$and.push({ [element]: { $exists: true } });
|
|
574
|
+
break;
|
|
575
|
+
case types_1.LogicOperator.notExists:
|
|
576
|
+
Filters.where.$or[0].$and.push({ [element]: { $exists: false } });
|
|
577
|
+
break;
|
|
578
|
+
case types_1.LogicOperator.regexp:
|
|
579
|
+
Filters.where.$or[0].$and.push({ [element]: { $regex: value } });
|
|
580
|
+
break;
|
|
581
|
+
}
|
|
582
|
+
}
|
|
583
|
+
for (const condition of orConditions) {
|
|
584
|
+
let { element, operator, value } = condition;
|
|
585
|
+
if (element === 'id') {
|
|
586
|
+
element = '_id';
|
|
587
|
+
value = (Array.isArray(value)
|
|
588
|
+
? value.map(v => js_utils_1.Ids.objectID(v))
|
|
589
|
+
: js_utils_1.Ids.objectID(value));
|
|
590
|
+
}
|
|
591
|
+
switch (operator) {
|
|
592
|
+
case types_1.LogicOperator.equals:
|
|
593
|
+
Filters.where.$or.push({ [element]: { $eq: value } });
|
|
594
|
+
break;
|
|
595
|
+
case types_1.LogicOperator.isNot:
|
|
596
|
+
Filters.where.$or.push({ [element]: { $neq: value } });
|
|
597
|
+
break;
|
|
598
|
+
case types_1.LogicOperator.greaterThan:
|
|
599
|
+
Filters.where.$or.push({ [element]: { $gt: value } });
|
|
600
|
+
break;
|
|
601
|
+
case types_1.LogicOperator.greaterOrEqualThan:
|
|
602
|
+
Filters.where.$or.push({ [element]: { $gte: value } });
|
|
603
|
+
break;
|
|
604
|
+
case types_1.LogicOperator.lessThan:
|
|
605
|
+
Filters.where.$or.push({ [element]: { $lt: value } });
|
|
606
|
+
break;
|
|
607
|
+
case types_1.LogicOperator.lessOrEqualThan:
|
|
608
|
+
Filters.where.$or.push({ [element]: { $lte: value } });
|
|
609
|
+
break;
|
|
610
|
+
case types_1.LogicOperator.in:
|
|
611
|
+
Filters.where.$or.push({ [element]: { $in: value } });
|
|
612
|
+
break;
|
|
613
|
+
case types_1.LogicOperator.notIn:
|
|
614
|
+
Filters.where.$or.push({
|
|
615
|
+
[element]: { $not: { $in: value } }
|
|
616
|
+
});
|
|
617
|
+
break;
|
|
618
|
+
case types_1.LogicOperator.exists:
|
|
619
|
+
Filters.where.$or.push({ [element]: { $exists: true } });
|
|
620
|
+
break;
|
|
621
|
+
case types_1.LogicOperator.notExists:
|
|
622
|
+
Filters.where.$or.push({ [element]: { $exists: false } });
|
|
623
|
+
break;
|
|
624
|
+
case types_1.LogicOperator.regexp:
|
|
625
|
+
Filters.where.$or.push({ [element]: { $regex: value } });
|
|
626
|
+
break;
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
const filtered = this.clearEmpties(Filters.where);
|
|
630
|
+
return filtered;
|
|
484
631
|
}
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
632
|
+
async updateById(id, data) {
|
|
633
|
+
const parsedId = this.isMongoDB
|
|
634
|
+
? js_utils_1.Ids.objectID(id)
|
|
635
|
+
: id;
|
|
636
|
+
const idFieldName = this.isMongoDB ? '_id' : 'id';
|
|
637
|
+
const dataToInsert = this.outputKeys.includes('updated')
|
|
638
|
+
? {
|
|
639
|
+
...data,
|
|
640
|
+
...{ updated: new Date() }
|
|
641
|
+
}
|
|
642
|
+
: data;
|
|
643
|
+
const validatedData = this.inputSchema.parse(dataToInsert);
|
|
644
|
+
const updateResults = await this.repository.update(id, validatedData);
|
|
645
|
+
if (updateResults.affected === 0) {
|
|
646
|
+
throw new Error('No rows where affected');
|
|
488
647
|
}
|
|
489
|
-
|
|
648
|
+
const dbResult = await this.repository.findOneOrFail({
|
|
649
|
+
where: {
|
|
650
|
+
[idFieldName]: parsedId
|
|
651
|
+
}
|
|
652
|
+
});
|
|
653
|
+
if (this.isMongoDB) {
|
|
654
|
+
dbResult['id'] = dbResult['id'].toString();
|
|
655
|
+
}
|
|
656
|
+
return this.outputSchema?.parse(this.clearEmpties(js_utils_1.Objects.deleteNulls(dbResult)));
|
|
490
657
|
}
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
658
|
+
async replaceById(id, data) {
|
|
659
|
+
const parsedId = this.isMongoDB
|
|
660
|
+
? js_utils_1.Ids.objectID(id)
|
|
661
|
+
: id;
|
|
662
|
+
const idFieldName = this.isMongoDB ? '_id' : 'id';
|
|
663
|
+
const value = await this.repository.findOneOrFail({
|
|
664
|
+
where: {
|
|
665
|
+
[idFieldName]: parsedId
|
|
666
|
+
}
|
|
667
|
+
});
|
|
668
|
+
const flatValue = js_utils_1.Objects.flatten(JSON.parse(JSON.stringify(value)));
|
|
669
|
+
Object.keys(flatValue).forEach(key => {
|
|
670
|
+
flatValue[key] = null;
|
|
671
|
+
});
|
|
672
|
+
const nullObject = js_utils_1.Objects.nest(flatValue);
|
|
673
|
+
const newValue = { ...nullObject, ...data };
|
|
674
|
+
delete newValue._id;
|
|
675
|
+
delete newValue.id;
|
|
676
|
+
delete newValue.created;
|
|
677
|
+
delete newValue.updated;
|
|
678
|
+
const dataToInsert = this.outputKeys.includes('updated')
|
|
679
|
+
? {
|
|
680
|
+
...data,
|
|
681
|
+
...{ updated: new Date() }
|
|
682
|
+
}
|
|
683
|
+
: data;
|
|
684
|
+
const validatedData = this.inputSchema.parse(dataToInsert);
|
|
685
|
+
const updateResults = await this.repository.update(id, validatedData);
|
|
686
|
+
if (updateResults.affected === 0) {
|
|
687
|
+
throw new Error('No rows where affected');
|
|
688
|
+
}
|
|
689
|
+
const val = await this.repository.findOneOrFail({
|
|
690
|
+
where: {
|
|
691
|
+
[idFieldName]: parsedId
|
|
692
|
+
}
|
|
693
|
+
});
|
|
694
|
+
if (this.isMongoDB) {
|
|
695
|
+
val['id'] = val['id'].toString();
|
|
494
696
|
}
|
|
495
|
-
return
|
|
697
|
+
return this.outputSchema.parse(this.clearEmpties(js_utils_1.Objects.deleteNulls(val)));
|
|
496
698
|
}
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
699
|
+
async clear() {
|
|
700
|
+
await this.repository.clear();
|
|
701
|
+
return true;
|
|
702
|
+
}
|
|
703
|
+
loadFirst(query) {
|
|
704
|
+
const detachedClass = Object.assign(Object.create(Object.getPrototypeOf(this)), this);
|
|
705
|
+
detachedClass.setRelatedQuery({
|
|
706
|
+
entity: this.entity,
|
|
707
|
+
repository: this,
|
|
708
|
+
query
|
|
709
|
+
});
|
|
710
|
+
return detachedClass;
|
|
711
|
+
}
|
|
712
|
+
loadById(id) {
|
|
713
|
+
const newInstance = this.clone();
|
|
714
|
+
newInstance.setRelatedQuery({
|
|
715
|
+
entity: this.entity,
|
|
716
|
+
repository: this,
|
|
717
|
+
query: {
|
|
718
|
+
where: {
|
|
719
|
+
id
|
|
720
|
+
}
|
|
721
|
+
}
|
|
722
|
+
});
|
|
723
|
+
return newInstance;
|
|
724
|
+
}
|
|
725
|
+
async requireById(id, q) {
|
|
726
|
+
const found = await this.findByIds([id], {
|
|
727
|
+
select: q?.select,
|
|
728
|
+
include: q?.include,
|
|
729
|
+
limit: 1
|
|
730
|
+
});
|
|
731
|
+
found.map(d => {
|
|
732
|
+
if (this.isMongoDB) {
|
|
733
|
+
d['id'] = d['id'].toString();
|
|
734
|
+
}
|
|
735
|
+
this.clearEmpties(js_utils_1.Objects.deleteNulls(d));
|
|
736
|
+
});
|
|
737
|
+
if (!found[0]) {
|
|
738
|
+
throw new Error(`Object ${id} not found`);
|
|
501
739
|
}
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
740
|
+
return this.outputSchema?.parse(found[0]);
|
|
741
|
+
}
|
|
742
|
+
clone() {
|
|
743
|
+
return new this.constructor();
|
|
744
|
+
}
|
|
745
|
+
async findByIds(ids, q) {
|
|
746
|
+
let data = await this.findMany({
|
|
747
|
+
where: {
|
|
748
|
+
id: {
|
|
749
|
+
in: ids
|
|
750
|
+
}
|
|
751
|
+
},
|
|
752
|
+
limit: q?.limit,
|
|
753
|
+
select: q?.select,
|
|
754
|
+
include: q?.include
|
|
506
755
|
});
|
|
507
|
-
|
|
508
|
-
|
|
756
|
+
return this.outputSchema?.array().parse(data);
|
|
757
|
+
}
|
|
758
|
+
getOrderBy(orderBy) {
|
|
759
|
+
if (!orderBy || orderBy.length === 0) {
|
|
760
|
+
return {};
|
|
509
761
|
}
|
|
510
|
-
|
|
511
|
-
|
|
762
|
+
const order = {};
|
|
763
|
+
for (const orderElement of orderBy) {
|
|
764
|
+
const flattenOrder = js_utils_1.Objects.flatten(orderElement);
|
|
765
|
+
for (const k of Object.keys(flattenOrder)) {
|
|
766
|
+
order[k] = flattenOrder[k];
|
|
767
|
+
}
|
|
512
768
|
}
|
|
513
|
-
return
|
|
769
|
+
return js_utils_1.Objects.nest(order);
|
|
514
770
|
}
|
|
515
771
|
}
|
|
516
772
|
exports.TypeOrmConnector = TypeOrmConnector;
|