diff --git a/addons/api/mirage/config.js b/addons/api/mirage/config.js index 2fd0d4ea1..538df19de 100644 --- a/addons/api/mirage/config.js +++ b/addons/api/mirage/config.js @@ -60,7 +60,17 @@ export default function () { this.post('/auth-methods'); this.get('/auth-methods/:id'); this.patch('/auth-methods/:id'); - this.del('/auth-methods/:id'); + this.del('/auth-methods/:id', ({ authMethods }, { params: { id } }) => { + const authMethod = authMethods.find(id); + const scope = authMethod.scope; + authMethod.destroy(); + // If the primary auth method is deleted, the associated scope's + // primary_auth_method_id field should be set to null. + if (scope.primary_auth_method_id === id) { + scope.update({ primary_auth_method_id: null }); + } + return new Response(204); + }); // Auth Method Accounts this.get( diff --git a/ui/admin/app/controllers/scopes/scope/auth-methods/index.js b/ui/admin/app/controllers/scopes/scope/auth-methods/index.js index c51e1d044..60ae5951c 100644 --- a/ui/admin/app/controllers/scopes/scope/auth-methods/index.js +++ b/ui/admin/app/controllers/scopes/scope/auth-methods/index.js @@ -1,7 +1,13 @@ import Controller from '@ember/controller'; export default class ScopesScopeAuthMethodsIndexController extends Controller { + // =attributes + + /** + * True if the current scope has a primary auth method set. + * @type {boolean} + */ get hasPrimaryAuthMethod() { - return this.model.filterBy('isPrimary'); + return this.scopeModel.primary_auth_method_id; } } diff --git a/ui/admin/app/routes/scopes/scope/auth-methods.js b/ui/admin/app/routes/scopes/scope/auth-methods.js index 81b4347da..fe2f7905b 100644 --- a/ui/admin/app/routes/scopes/scope/auth-methods.js +++ b/ui/admin/app/routes/scopes/scope/auth-methods.js @@ -71,7 +71,11 @@ export default class ScopesScopeAuthMethodsRoute extends Route { @notifyError(({ message }) => message, { catch: true }) @notifySuccess('notifications.delete-success') async delete(authMethod) { + const scopeModel = this.modelFor('scopes.scope'); await authMethod.destroyRecord(); + // Reload the scope, since this is where the primary_auth_method_id is + // stored. An auth method deletion could affect this field. + await scopeModel.reload(); await this.replaceWith('scopes.scope.auth-methods'); this.refresh(); } diff --git a/ui/admin/app/routes/scopes/scope/auth-methods/index.js b/ui/admin/app/routes/scopes/scope/auth-methods/index.js index a7e38aa5a..913b4f8ff 100644 --- a/ui/admin/app/routes/scopes/scope/auth-methods/index.js +++ b/ui/admin/app/routes/scopes/scope/auth-methods/index.js @@ -1,3 +1,15 @@ import Route from '@ember/routing/route'; -export default class ScopesScopeAuthMethodsIndexRoute extends Route {} +export default class ScopesScopeAuthMethodsIndexRoute extends Route { + // =methods + + /** + * Adds the scope to the controller context. + * @param {Controller} controller + */ + setupController(controller) { + super.setupController(...arguments); + const scopeModel = this.modelFor('scopes.scope'); + controller.scopeModel = scopeModel; + } +}