decide.nolog.cz/app/serializers/application.js

71 lines
2.1 KiB
JavaScript
Raw Normal View History

import classic from 'ember-classic-decorator';
import { inject as service } from '@ember/service';
import RESTSerializer from '@ember-data/serializer/rest';
2018-12-29 01:27:37 +01:00
import { isEmpty } from '@ember/utils';
2014-10-30 21:44:22 +01:00
/*
* extends DS.RESTSerializer to implement encryption
2016-01-28 23:48:14 +01:00
*
* By default every attribute hash is encrypted using SJCL.
* This is configurable by options parameter of DS.attr().
*
* Options:
* - encrypted (boolean)
* If false the attribute won't be encrypted.
* - includePlainOnCreate (string)
* If set the attribute will be included plain (not encrypted) when
* recorde is created. Value is the attributes name used.
*/
@classic
export default class ApplicationSerializer extends RESTSerializer {
isNewSerializerAPI = true;
2016-08-12 13:33:03 +02:00
@service
encryption;
/*
* implement decryption
*/
2016-01-28 23:48:14 +01:00
normalize(modelClass, resourceHash, prop) {
// run before serialization of attribute hash
modelClass.eachAttribute(function (key, attributes) {
if (attributes.options.encrypted !== false) {
if (
typeof resourceHash[key] !== 'undefined' &&
resourceHash[key] !== null
) {
2018-12-29 20:35:04 +01:00
resourceHash[key] = this.encryption.decrypt(resourceHash[key]);
}
}
}, this);
2015-10-25 16:46:11 +01:00
// run legacy support transformation specified in model serializer
if (typeof this.legacySupport === 'function') {
resourceHash = this.legacySupport(resourceHash);
}
2016-01-28 23:48:14 +01:00
return super.normalize(modelClass, resourceHash, prop);
}
/*
* implement encryption
*/
2016-01-28 23:48:14 +01:00
serializeAttribute(snapshot, json, key, attribute) {
super.serializeAttribute(snapshot, json, key, attribute);
// map includePlainOnCreate after serialization of attribute hash
// but before encryption so we can just use the serialized hash
if (
2018-12-29 01:27:37 +01:00
!isEmpty(attribute.options.includePlainOnCreate) &&
typeof attribute.options.includePlainOnCreate === 'string'
) {
json[attribute.options.includePlainOnCreate] = json[key];
}
// encrypt after serialization of attribute hash
if (attribute.options.encrypted !== false) {
2018-12-29 20:35:04 +01:00
json[key] = this.encryption.encrypt(json[key]);
}
}
}