diff --git a/addons/api/addon/generated/models/auth-method.js b/addons/api/addon/generated/models/auth-method.js index 995e65efd..7dd5805c0 100644 --- a/addons/api/addon/generated/models/auth-method.js +++ b/addons/api/addon/generated/models/auth-method.js @@ -39,4 +39,9 @@ export default class GeneratedAuthMethodModel extends BaseModel { }) disabled; + @attr('number', { + description: 'Current version number of this resource.', + }) + version; + } diff --git a/addons/api/addon/generated/models/group.js b/addons/api/addon/generated/models/group.js index bce0d1076..e8c442e1b 100644 --- a/addons/api/addon/generated/models/group.js +++ b/addons/api/addon/generated/models/group.js @@ -33,4 +33,10 @@ export default class GeneratedGroupModel extends BaseModel { description: 'Whether the resource is disabled', }) disabled; + + @attr('number', { + description: 'Current version number of this resource.', + }) + version; + } diff --git a/addons/api/addon/generated/models/host-catalog.js b/addons/api/addon/generated/models/host-catalog.js index 4a8166e3c..7207048c2 100644 --- a/addons/api/addon/generated/models/host-catalog.js +++ b/addons/api/addon/generated/models/host-catalog.js @@ -38,4 +38,9 @@ export default class GeneratedHostCatalogModel extends BaseModel { description: 'Attributes specific to the catalog type' }) attributes; + @attr('number', { + description: 'Current version number of this resource.', + }) + version; + } diff --git a/addons/api/addon/generated/models/scope.js b/addons/api/addon/generated/models/scope.js index a7448b034..3c3731b3d 100644 --- a/addons/api/addon/generated/models/scope.js +++ b/addons/api/addon/generated/models/scope.js @@ -34,4 +34,9 @@ export default class GeneratedScopeModel extends BaseModel { }) updated_time; + @attr('number', { + description: 'Current version number of this resource.', + }) + version; + } diff --git a/addons/api/addon/generated/models/user.js b/addons/api/addon/generated/models/user.js index 98fff7c32..433faeceb 100644 --- a/addons/api/addon/generated/models/user.js +++ b/addons/api/addon/generated/models/user.js @@ -33,4 +33,9 @@ export default class GeneratedUserModel extends BaseModel { description: 'Whether the resource is disabled', }) disabled; + + @attr('number', { + description: 'Current version number of this resource.', + }) + version; } diff --git a/addons/api/addon/serializers/application.js b/addons/api/addon/serializers/application.js index c839eb78c..bfe422161 100644 --- a/addons/api/addon/serializers/application.js +++ b/addons/api/addon/serializers/application.js @@ -40,6 +40,10 @@ export default class ApplicationSerializer extends RESTSerializer { let value = super.serializeAttribute(...arguments); // Do not serialize read-only attributes. if (options.readOnly) delete json[key]; + // Version is sent only if it has a non-nullish value + if (key === 'version') { + if (json[key] === null || json[key] === undefined) delete json[key]; + } // Do not serialize `disabled` fields. // TODO: disabled is temporarily disabled if (key === 'disabled') delete json[key]; diff --git a/addons/api/tests/unit/serializers/application-test.js b/addons/api/tests/unit/serializers/application-test.js index 4769cfa3f..c067939b9 100644 --- a/addons/api/tests/unit/serializers/application-test.js +++ b/addons/api/tests/unit/serializers/application-test.js @@ -29,6 +29,28 @@ module('Unit | Serializer | application', function (hooks) { }); }); + test('it serializes non-nullish version fields', function (assert) { + assert.expect(2); + const store = this.owner.lookup('service:store'); + const record = store.createRecord('user', { + name: 'User', + description: 'Description', + version: null + }); + let serializedRecord = record.serialize(); + assert.deepEqual(serializedRecord, { + name: 'User', + description: 'Description' + }); + record.version = 1; + serializedRecord = record.serialize(); + assert.deepEqual(serializedRecord, { + name: 'User', + description: 'Description', + version: 1 + }); + }); + test('it normalizes array records from an `items` root key', function (assert) { assert.expect(1); const store = this.owner.lookup('service:store');