@forestadmin/datasource-sequelize 1.0.0-beta.11 → 1.0.0-beta.12
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/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
# @forestadmin/datasource-sequelize [1.0.0-beta.12](https://github.com/ForestAdmin/agent-nodejs/compare/@forestadmin/datasource-sequelize@1.0.0-beta.11...@forestadmin/datasource-sequelize@1.0.0-beta.12) (2022-04-26)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Bug Fixes
|
|
5
|
+
|
|
6
|
+
* **datasource sequelize:** build a correct where clause when there is relation on delete and update ([#242](https://github.com/ForestAdmin/agent-nodejs/issues/242)) ([75061d4](https://github.com/ForestAdmin/agent-nodejs/commit/75061d447878cd8f32f1fd5bcc245a2791ba0b0a))
|
|
7
|
+
|
|
1
8
|
# @forestadmin/datasource-sequelize [1.0.0-beta.11](https://github.com/ForestAdmin/agent-nodejs/compare/@forestadmin/datasource-sequelize@1.0.0-beta.10...@forestadmin/datasource-sequelize@1.0.0-beta.11) (2022-04-26)
|
|
2
9
|
|
|
3
10
|
|
package/dist/collection.js
CHANGED
|
@@ -47,13 +47,13 @@ class SequelizeCollection extends datasource_toolkit_1.BaseCollection {
|
|
|
47
47
|
}
|
|
48
48
|
async update(caller, filter, patch) {
|
|
49
49
|
await this.model.update(patch, {
|
|
50
|
-
where: query_converter_1.default.
|
|
50
|
+
where: await query_converter_1.default.getWhereFromConditionTreeToByPassInclude(this.model, filter.conditionTree),
|
|
51
51
|
fields: Object.keys(patch),
|
|
52
52
|
});
|
|
53
53
|
}
|
|
54
54
|
async delete(caller, filter) {
|
|
55
55
|
await this.model.destroy({
|
|
56
|
-
where: query_converter_1.default.
|
|
56
|
+
where: await query_converter_1.default.getWhereFromConditionTreeToByPassInclude(this.model, filter.conditionTree),
|
|
57
57
|
});
|
|
58
58
|
}
|
|
59
59
|
async aggregate(caller, filter, aggregation, limit) {
|
|
@@ -90,4 +90,4 @@ class SequelizeCollection extends datasource_toolkit_1.BaseCollection {
|
|
|
90
90
|
}
|
|
91
91
|
}
|
|
92
92
|
exports.default = SequelizeCollection;
|
|
93
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
93
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9jb2xsZWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEseUNBQWdGO0FBRWhGLHdFQVd5QztBQUV6QyxzRUFBbUQ7QUFDbkQsd0hBQTBFO0FBQzFFLDhFQUFxRDtBQUVyRCxNQUFxQixtQkFBb0IsU0FBUSxtQ0FBYztJQUs3RCxZQUNFLElBQVksRUFDWixVQUFzQjtJQUN0Qiw4REFBOEQ7SUFDOUQsS0FBNkIsRUFDN0IsTUFBZTtRQUVmLEtBQUssQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFFeEIsSUFBSSxDQUFDLEtBQUs7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLGdDQUFnQyxDQUFDLENBQUM7UUFFOUQsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUkscUJBQWdCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXpELE1BQU0sV0FBVyxHQUFHLDhDQUFjLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFL0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbkMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVELEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBYyxFQUFFLElBQWtCO1FBQzdDLE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFbEQsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDNUQs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
|
|
@@ -3,6 +3,7 @@ import { IncludeOptions, ModelDefined, OrderItem, WhereOptions } from 'sequelize
|
|
|
3
3
|
export default class QueryConverter {
|
|
4
4
|
private static asArray;
|
|
5
5
|
private static makeWhereClause;
|
|
6
|
+
static getWhereFromConditionTreeToByPassInclude(model: ModelDefined<any, any>, conditionTree?: ConditionTree): Promise<WhereOptions>;
|
|
6
7
|
static getWhereFromConditionTree(model: ModelDefined<any, any>, conditionTree?: ConditionTree): WhereOptions;
|
|
7
8
|
private static computeIncludeFromProjection;
|
|
8
9
|
static getIncludeFromProjection(projection: Projection): IncludeOptions[];
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const datasource_toolkit_1 = require("@forestadmin/datasource-toolkit");
|
|
3
4
|
const sequelize_1 = require("sequelize");
|
|
4
5
|
class QueryConverter {
|
|
5
6
|
static asArray(value) {
|
|
@@ -47,6 +48,29 @@ class QueryConverter {
|
|
|
47
48
|
throw new Error(`Unsupported operator: "${operator}".`);
|
|
48
49
|
}
|
|
49
50
|
}
|
|
51
|
+
/*
|
|
52
|
+
* Delete and update sequelize methods does not provide the include options.
|
|
53
|
+
* This method is developed to by pass this problem.
|
|
54
|
+
*/
|
|
55
|
+
static async getWhereFromConditionTreeToByPassInclude(
|
|
56
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
57
|
+
model, conditionTree) {
|
|
58
|
+
const include = conditionTree
|
|
59
|
+
? QueryConverter.getIncludeFromProjection(conditionTree.projection)
|
|
60
|
+
: [];
|
|
61
|
+
const whereOptions = QueryConverter.getWhereFromConditionTree(model, conditionTree);
|
|
62
|
+
if (include.length === 0) {
|
|
63
|
+
return whereOptions;
|
|
64
|
+
}
|
|
65
|
+
const keys = [...model.primaryKeyAttributes];
|
|
66
|
+
const records = await model.findAll({ attributes: keys, where: whereOptions, include });
|
|
67
|
+
const conditions = records.map(record => {
|
|
68
|
+
const equals = keys.map(pk => new datasource_toolkit_1.ConditionTreeLeaf(pk, 'Equal', record.get(pk)));
|
|
69
|
+
return datasource_toolkit_1.ConditionTreeFactory.intersect(...equals);
|
|
70
|
+
});
|
|
71
|
+
const union = datasource_toolkit_1.ConditionTreeFactory.union(...conditions);
|
|
72
|
+
return QueryConverter.getWhereFromConditionTree(model, union);
|
|
73
|
+
}
|
|
50
74
|
static getWhereFromConditionTree(
|
|
51
75
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
52
76
|
model, conditionTree) {
|
|
@@ -109,4 +133,4 @@ class QueryConverter {
|
|
|
109
133
|
}
|
|
110
134
|
}
|
|
111
135
|
exports.default = QueryConverter;
|
|
112
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
136
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktY29udmVydGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL3F1ZXJ5LWNvbnZlcnRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHdFQVF5QztBQUN6Qyx5Q0FXbUI7QUFHbkIsTUFBcUIsY0FBYztJQUN6QixNQUFNLENBQUMsT0FBTyxDQUFDLEtBQWM7UUFDbkMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1lBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRTFDLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVPLE1BQU0sQ0FBQyxlQUFlLENBQzVCLFFBQWtCLEVBQ2xCLEtBQWE7SUFDYiw4REFBOEQ7SUFDOUQsS0FBVztRQUVYLElBQUksUUFBUSxLQUFLLElBQUk7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLDBCQUEwQixDQUFDLENBQUM7UUFFbkUsUUFBUSxRQUFRLEVBQUU7WUFDaEIsS0FBSyxPQUFPO2dCQUNWLE9BQU87b0JBQ0wsQ0FBQyxjQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQWUsRUFBRSxFQUFFLENBQUMsY0FBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDO2lCQUNqRixDQUFDO1lBQ0osS0FBSyxVQUFVO2dCQUNiLE9BQU8sSUFBQSxpQkFBSyxFQUFDLElBQUEsY0FBRSxFQUFDLE9BQU8sRUFBRSxJQUFBLGVBQUcsRUFBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUNsRixLQUFLLFVBQVU7Z0JBQ2IsT0FBTyxJQUFBLGlCQUFLLEVBQUMsSUFBQSxjQUFFLEVBQUMsT0FBTyxFQUFFLElBQUEsZUFBRyxFQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsTUFB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
|