chore: tweak dynamic fields serialization

This commit is contained in:
Randall Morey committed 2022-01-20 16:47:46 -05:00
1 parent 10c364264c
commit 1889dd0090
3 files changed
+67 -37

No files matched your search

@@ -55,13 +55,16 @@ export default class GeneratedHostCatalogModel extends BaseModel {
})
plugin;
// AWS & Azure
@attr('boolean', {
isNestedAttribute: true,
description: '',
})
disable_credential_rotation;
// Azure specific
// AWS specific
@attr('string', {
isNestedAttribute: true,
description: '',
@@ -82,7 +85,8 @@ export default class GeneratedHostCatalogModel extends BaseModel {
})
secret_access_key;
// AWS specific
// Azure specific
@attr('string', {
isNestedAttribute: true,
description: '',
+32 -21
View File
@@ -1,41 +1,52 @@
import ApplicationSerializer from './application';
const fieldsByType = {
aws: [
'disable_credential_rotation',
'region',
'access_key_id',
'secret_access_key',
],
azure: [
'disable_credential_rotation',
'tenant_id',
'client_id',
'subscription_id',
'secret_id',
'secret_value',
],
};
export default class HostCatalogSerializer extends ApplicationSerializer {
// =methods
serialize(snapshot) {
const serialized = super.serialize(...arguments);
switch (snapshot.record.type) {
switch (snapshot.record.compositeType) {
case 'static':
return this.serializeStatic(...arguments);
case 'plugin':
return this.serializeDynamic(...arguments);
default:
return serialized;
}
}
serializeAttribute(snapshot, json, key, attribute) {
const value = super.serializeAttribute(...arguments);
const { isPlugin, compositeType } = snapshot.record;
const { options } = attribute;
// Nested conditionals for readability
// This deletes any fields that don't belong to the record type
if (isPlugin && options.isNestedAttribute && json.attributes) {
// The key must be included in the fieldsByType list above
if (!fieldsByType[compositeType].includes(key))
delete json.attributes[key];
}
return value;
}
serializeStatic() {
const serialized = super.serialize(...arguments);
// Delete unnecessary fields for static host-catalog
delete serialized.attributes;
return serialized;
}
serializeDynamic(snapshot) {
const { isAWS, isAzure } = snapshot.record;
const serialized = super.serialize(...arguments);
// Is a Aws plugin, delete all the Azure attributes
if (isAWS) {
delete serialized.attributes.region;
}
// Is an Azure plugin, delete all the Aws attributes
if (isAzure) {
delete serialized.attributes.tenant_id;
delete serialized.attributes.client_id;
delete serialized.attributes.subscription_id;
}
return serialized;
}
}
@@ -40,33 +40,37 @@ module('Unit | Serializer | host catalog', function (hooks) {
assert.deepEqual(serializedRecord, expectedResult);
});
test('it serializes an AWS plugin as expected, ignoring read-only and azure fields', async function (assert) {
test('it serializes an AWS plugin as expected, ignoring read-only and Azure fields', async function (assert) {
assert.expect(1);
const store = this.owner.lookup('service:store');
const serializer = store.serializerFor('host-catalog');
const record = store.createRecord('host-catalog', {
name: 'Aws',
compositeType: 'aws',
name: 'AWS',
description: 'this is a Aws plugin host-catalog',
type: 'plugin',
plugin: { name: 'aws' }, // Read-only field
disable_credential_rotation: true,
// these are AWS fields and should be included
region: 'spain',
access_key_id: 'foobars',
secret_access_key: 'testing',
// these are Azure fields and should be excluded
tenant_id: 'a1b2c3',
client_id: 'a1b2c3',
subscription_id: 'a1b2c3',
region: 'spain',
secret_id: 'a1b2c3', // Read-only field
secret_id: 'a1b2c3',
secret_value: 'a1b2c3',
});
const snapshot = record._createSnapshot();
const serializedRecord = serializer.serialize(snapshot);
const expectedResult = {
name: 'Aws',
name: 'AWS',
description: 'this is a Aws plugin host-catalog',
type: 'plugin',
attributes: {
disable_credential_rotation: true,
tenant_id: 'a1b2c3',
client_id: 'a1b2c3',
subscription_id: 'a1b2c3',
region: 'spain',
access_key_id: 'foobars',
secret_access_key: 'testing',
},
};
assert.deepEqual(serializedRecord, expectedResult);
@@ -77,13 +81,20 @@ module('Unit | Serializer | host catalog', function (hooks) {
const store = this.owner.lookup('service:store');
const serializer = store.serializerFor('host-catalog');
const record = store.createRecord('host-catalog', {
compositeType: 'azure',
name: 'Azure',
description: 'this is a Azure plugin host-catalog',
type: 'plugin',
plugin: { name: 'azure' }, // Read-only field
disable_credential_rotation: true,
// these are AWS fields and should be included
region: 'spain',
access_key_id: 'a1b2c3', // Read-only field
access_key_id: 'foobars',
secret_access_key: 'testing',
// these are Azure fields and should be excluded
tenant_id: 'a1b2c3',
client_id: 'a1b2c3',
subscription_id: 'a1b2c3',
secret_id: 'a1b2c3',
secret_value: 'a1b2c3',
});
const snapshot = record._createSnapshot();
const serializedRecord = serializer.serialize(snapshot);
@@ -93,7 +104,11 @@ module('Unit | Serializer | host catalog', function (hooks) {
type: 'plugin',
attributes: {
disable_credential_rotation: true,
region: 'spain',
tenant_id: 'a1b2c3',
client_id: 'a1b2c3',
subscription_id: 'a1b2c3',
secret_id: 'a1b2c3',
secret_value: 'a1b2c3',
},
};
assert.deepEqual(serializedRecord, expectedResult);