Просмотр исходного кода

chore: revert the parameter "isPartial" to the ModelDataTransformer

e22m4u 1 год назад
Родитель
Сommit
e81d5e2a1d

+ 2 - 2
src/adapter/decorator/data-transformation-decorator.js

@@ -41,13 +41,13 @@ export class DataTransformationDecorator extends Service {
 
     const patch = adapter.patch;
     adapter.patch = function (modelName, modelData, where) {
-      modelData = transformer.transform(modelName, modelData);
+      modelData = transformer.transform(modelName, modelData, true);
       return patch.call(this, modelName, modelData, where);
     };
 
     const patchById = adapter.patchById;
     adapter.patchById = function (modelName, id, modelData, filter) {
-      modelData = transformer.transform(modelName, modelData);
+      modelData = transformer.transform(modelName, modelData, true);
       return patchById.call(this, modelName, id, modelData, filter);
     };
   }

+ 2 - 2
src/adapter/decorator/data-transformation-decorator.spec.js

@@ -80,7 +80,7 @@ describe('DataTransformationDecorator', function () {
     const res = await A.patch('model', modelData);
     expect(res).to.be.eql(transformedData);
     expect(V.transform).to.be.called.once;
-    expect(V.transform).to.be.called.with.exactly('model', modelData);
+    expect(V.transform).to.be.called.with.exactly('model', modelData, true);
   });
 
   it('overrides the "patchById" method and transforms a given data', async function () {
@@ -90,6 +90,6 @@ describe('DataTransformationDecorator', function () {
     const res = await A.patchById('model', 1, modelData);
     expect(res).to.be.eql(transformedData);
     expect(V.transform).to.be.called.once;
-    expect(V.transform).to.be.called.with.exactly('model', modelData);
+    expect(V.transform).to.be.called.with.exactly('model', modelData, true);
   });
 });

+ 3 - 2
src/definition/model/model-data-transformer.js

@@ -15,9 +15,10 @@ export class ModelDataTransformer extends Service {
    *
    * @param {string} modelName
    * @param {object} modelData
+   * @param {boolean} isPartial
    * @returns {object}
    */
-  transform(modelName, modelData) {
+  transform(modelName, modelData, isPartial = false) {
     if (!isPureObject(modelData))
       throw new InvalidArgumentError(
         'The data of the model %v should be an Object, but %v given.',
@@ -30,7 +31,7 @@ export class ModelDataTransformer extends Service {
       modelDefinitionUtils.getPropertiesDefinitionInBaseModelHierarchy(
         modelName,
       );
-    const propNames = Object.keys(propDefs);
+    const propNames = Object.keys(isPartial ? modelData : propDefs);
     const transformedData = cloneDeep(modelData);
     propNames.forEach(propName => {
       const propDef = propDefs[propName];

+ 62 - 0
src/definition/model/model-data-transformer.spec.js

@@ -145,6 +145,26 @@ describe('ModelDataTransformer', function () {
         expect(res1).to.be.eql({foo: undefined});
         expect(res2).to.be.eql({foo: null});
       });
+
+      it('the parameter "isPartial" prevents to transform values of not provided properties', function () {
+        const schema = new Schema();
+        const myTransformer = () => 'transformed';
+        schema
+          .getService(PropertyTransformerRegistry)
+          .addTransformer('myTransformer', myTransformer);
+        schema.defineModel({
+          name: 'model',
+          properties: {
+            foo: {
+              type: DataType.STRING,
+              transform: 'myTransformer',
+            },
+          },
+        });
+        const T = schema.getService(ModelDataTransformer);
+        const res = T.transform('model', {}, true);
+        expect(res).to.be.eql({});
+      });
     });
 
     describe('the option "transform" with an array value', function () {
@@ -276,6 +296,26 @@ describe('ModelDataTransformer', function () {
         expect(res1).to.be.eql({foo: undefined});
         expect(res2).to.be.eql({foo: null});
       });
+
+      it('the parameter "isPartial" prevents to transform values of not provided properties', function () {
+        const schema = new Schema();
+        const myTransformer = () => 'transformed';
+        schema
+          .getService(PropertyTransformerRegistry)
+          .addTransformer('myTransformer', myTransformer);
+        schema.defineModel({
+          name: 'model',
+          properties: {
+            foo: {
+              type: DataType.STRING,
+              transform: ['myTransformer'],
+            },
+          },
+        });
+        const T = schema.getService(ModelDataTransformer);
+        const res = T.transform('model', {}, true);
+        expect(res).to.be.eql({});
+      });
     });
 
     describe('the option "transform" with an object value', function () {
@@ -422,6 +462,28 @@ describe('ModelDataTransformer', function () {
         expect(res1).to.be.eql({foo: undefined});
         expect(res2).to.be.eql({foo: null});
       });
+
+      it('the parameter "isPartial" prevents to transform values of not provided properties', function () {
+        const schema = new Schema();
+        const myTransformer = () => 'transformed';
+        schema
+          .getService(PropertyTransformerRegistry)
+          .addTransformer('myTransformer', myTransformer);
+        schema.defineModel({
+          name: 'model',
+          properties: {
+            foo: {
+              type: DataType.STRING,
+              transform: {
+                myTransformer: true,
+              },
+            },
+          },
+        });
+        const T = schema.getService(ModelDataTransformer);
+        const res = T.transform('model', {}, true);
+        expect(res).to.be.eql({});
+      });
     });
 
     it('the option "transform" requires a non-empty String, an Array or an Object', function () {