Skip to content

Commit

Permalink
feat(Serializer): adds dynamic mask support
Browse files Browse the repository at this point in the history
  • Loading branch information
iobaixas committed Oct 23, 2015
1 parent 9db02ba commit 51905cb
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 5 deletions.
11 changes: 6 additions & 5 deletions src/module/serializer.js
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,10 @@ RMModule.factory('RMSerializer', ['$injector', 'inflector', '$filter', 'RMUtils'
mappings = {},
vol = {};

function isMasked(_name, _mask) {
function isMasked(_name, _mask, _ctx) {
if(typeof _mask === 'function') return _mask(_name);
var mask = masks[_name];
if(typeof mask === 'function') mask = mask.call(_ctx); // dynamic mask
return (mask && (mask === true || mask.indexOf(_mask) !== -1));
}

Expand All @@ -45,7 +46,7 @@ RMModule.factory('RMSerializer', ['$injector', 'inflector', '$filter', 'RMUtils'
if(maps) {
for(i = 0, l = maps.length; i < l; i++) {
fullName = prefix + maps[i].path;
if(isMasked(fullName, _mask)) continue;
if(isMasked(fullName, _mask, _ctx)) continue;

if(maps[i].map) {
value = extract(_from, maps[i].map);
Expand Down Expand Up @@ -81,7 +82,7 @@ RMModule.factory('RMSerializer', ['$injector', 'inflector', '$filter', 'RMUtils'

fullName = prefix + decodedName;
// prevent masked or already mapped properties to be set
if(mapped[fullName] || isMasked(fullName, _mask)) continue;
if(mapped[fullName] || isMasked(fullName, _mask, _ctx)) continue;

value = decodeProp(_from[key], fullName, _mask, _ctx);
if(value !== undefined) _to[decodedName] = value; // ignore value if filter returns undefined
Expand Down Expand Up @@ -119,7 +120,7 @@ RMModule.factory('RMSerializer', ['$injector', 'inflector', '$filter', 'RMUtils'
if(_from.hasOwnProperty(key) && key[0] !== '$') {
fullName = prefix + key;
// prevent masked or already mapped properties to be copied
if(mapped[fullName] || isMasked(fullName, _mask)) continue;
if(mapped[fullName] || isMasked(fullName, _mask, _ctx)) continue;

value = encodeProp(_from[key], fullName, _mask, _ctx);
if(value !== undefined) {
Expand All @@ -136,7 +137,7 @@ RMModule.factory('RMSerializer', ['$injector', 'inflector', '$filter', 'RMUtils'
if(maps) {
for(var i = 0, l = maps.length; i < l; i++) {
fullName = prefix + maps[i].path;
if(isMasked(fullName, _mask)) continue;
if(isMasked(fullName, _mask, _ctx)) continue;

value = _from[maps[i].path];
if(!maps[i].forced && value === undefined) continue;
Expand Down
14 changes: 14 additions & 0 deletions test/serializer-spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,20 @@ describe('Restmod serializer', function() {
raw = serializer.encode(result, 'U');
expect(raw.brand).toBeUndefined();
});

it('should mask a property using dynamic options if funtion is provided', function() {
serializer.dsl().attrMask('brand', function() {
return this.loadBrand ? '' : 'R';
});

var result = {};
serializer.decode(result, { brand: 'Canyon' }, 'R');
expect(result.brand).toBeUndefined();
result.loadBrand = true;

serializer.decode(result, { brand: 'Canyon' }, 'R');
expect(result.brand).toEqual('Canyon');
});
});

describe('attrDecoder', function() {
Expand Down

0 comments on commit 51905cb

Please sign in to comment.