import { inject as service } from '@ember/service'; import Controller from '@ember/controller'; import { getOwner } from '@ember/application'; import { get, action } from '@ember/object'; import transitionable from 'consul-ui/utils/routing/transitionable'; export default class ApplicationController extends Controller { @service('router') router; @service('store') store; @service('feedback') feedback; // TODO: We currently do this in the controller instead of the router // as the nspace and dc variables aren't available directly on the Route // look to see if we can move this up there so we can empty the Controller // out again @action reauthorize(e) { // TODO: For the moment e isn't a real event // it has data which is potentially the token // and type which is the logout/authorize/use action // used for the feedback service. this.feedback.execute( () => { // TODO: Currently we clear cache from the ember-data store // ideally this would be a static method of the abstract Repository class // once we move to proper classes for services take another look at this. this.store.clear(); // const params = {}; if (e.data) { const token = e.data; // TODO: Do I actually need to check to see if nspaces are enabled here? if (typeof this.nspace !== 'undefined') { const nspace = get(token, 'Namespace') || this.nspace.Name; // you potentially have a new namespace // if you do redirect to it if (nspace !== this.nspace.Name) { params.nspace = `~${nspace}`; } } } const container = getOwner(this); const routeName = this.router.currentRoute.name; const route = container.lookup(`route:${routeName}`); // Refresh the application route as everything including the main nav needs refreshing return container .lookup('route:application') .refresh() .promise.catch(function(e) { // passthrough // if you are on an error page a refresh of the application route will reject // thats ok as we then transition to the actual route you were trying // to get to originally anyway }) .then(res => { // Use transitionable if we need to change a section of the URL // or routeName and currentRouteName aren't equal (i.e. error page) if ( routeName !== this.router.currentRouteName || typeof params.nspace !== 'undefined' ) { return route.transitionTo( ...transitionable(this.router.currentRoute, params, container) ); } else { return res; } }); }, e.type, function(type, e) { return type; }, {} ); } }