diff --git a/addons/api/addon/models/account.js b/addons/api/addon/models/account.js index 874b88ec4..b28558732 100644 --- a/addons/api/addon/models/account.js +++ b/addons/api/addon/models/account.js @@ -31,4 +31,28 @@ export default class AccountModel extends GeneratedAccountModel { }, }); } + + /** + * Update account password via the `change-password` method. + * See serializer and adapter for more information. + * @param {string} currentPassword + * @param {string} newPassword + * @param {object} options + * @param {object} options.adapterOptions + * @return {Promise} + */ + changePassword(currentPassword, newPassword, options = { adapterOptions: {} }) { + const defaultAdapterOptions = { + method: 'change-password', + currentPassword, + newPassword, + }; + return this.save({ + ...options, + adapterOptions: { + ...defaultAdapterOptions, + ...options.adapterOptions, + }, + }); + } } diff --git a/addons/api/addon/serializers/account.js b/addons/api/addon/serializers/account.js index a24def72e..416bc488e 100644 --- a/addons/api/addon/serializers/account.js +++ b/addons/api/addon/serializers/account.js @@ -20,6 +20,11 @@ export default class AccountSerializer extends ApplicationSerializer { if (snapshot?.adapterOptions?.method === 'set-password') { serialized = this.serializeForSetPassword(snapshot, password); } + if (snapshot?.adapterOptions?.method === 'change-password') { + const { currentPassword, newPassword } = snapshot?.adapterOptions; + serialized = + this.serializeForChangePassword(snapshot, currentPassword, newPassword); + } return serialized; } @@ -35,4 +40,19 @@ export default class AccountSerializer extends ApplicationSerializer { password, }; } + + /** + * Returns a payload containing current and new passwords. + * @param {Snapshot} snapshot + * @param {string} current_password + * @param {string} new_password + * @return {object} + */ + serializeForChangePassword(snapshot, current_password, new_password) { + return { + version: snapshot.attr('version'), + current_password, + new_password, + }; + } } diff --git a/addons/api/tests/unit/serializers/account-test.js b/addons/api/tests/unit/serializers/account-test.js index a94bf28f6..4d5646e08 100644 --- a/addons/api/tests/unit/serializers/account-test.js +++ b/addons/api/tests/unit/serializers/account-test.js @@ -94,4 +94,32 @@ module('Unit | Serializer | account', function (hooks) { version: 1, }); }); + + test('it serializes a custom payload when `adapterOptions.method` is set to `change-password`', function (assert) { + assert.expect(1); + const store = this.owner.lookup('service:store'); + const serializer = store.serializerFor('account'); + const record = store.createRecord('account', { + type: 'password', + name: 'Name', + description: 'Description', + attributes: { + login_name: 'Login Name', + }, + auth_method_id: '1', + version: 1, + }); + const snapshot = record._createSnapshot(); + snapshot.adapterOptions = { + method: 'change-password', + currentPassword: 'Current', + newPassword: 'New', + }; + const serializedRecord = serializer.serialize(snapshot); + assert.deepEqual(serializedRecord, { + current_password: 'Current', + new_password: 'New', + version: 1, + }); + }); });