* feat: 🎸 Add migration check to delete index DB when updating ✅ Closes: https://hashicorp.atlassian.net/browse/ICU-13223
98 lines
2.8 KiB
JavaScript
98 lines
2.8 KiB
JavaScript
/**
|
|
* Copyright (c) HashiCorp, Inc.
|
|
* SPDX-License-Identifier: BUSL-1.1
|
|
*/
|
|
|
|
import Route from '@ember/routing/route';
|
|
import { inject as service } from '@ember/service';
|
|
import { action } from '@ember/object';
|
|
import { A } from '@ember/array';
|
|
import { formatDbName } from 'api/services/indexed-db';
|
|
|
|
/**
|
|
* Entry route for the application.
|
|
*/
|
|
export default class ApplicationRoute extends Route {
|
|
// =services
|
|
|
|
@service session;
|
|
@service confirm;
|
|
@service router;
|
|
@service intl;
|
|
@service features;
|
|
@service featureEdition;
|
|
@service indexedDb;
|
|
@service('browser/window') window;
|
|
|
|
// =attributes
|
|
|
|
routeIfUnauthenticated = 'index';
|
|
|
|
// =methods
|
|
|
|
constructor() {
|
|
super(...arguments);
|
|
/**
|
|
* If user attempts to navigate away from unsaved changes, the user is
|
|
* asked to confirm that they would like to discard the changes. If the
|
|
* user chooses discard, changes on the model are rolled back and the
|
|
* transition is retried. If the user cancels discard, the transition is
|
|
* aborted.
|
|
*/
|
|
this.router.on('routeWillChange', async (transition) => {
|
|
const fromName = transition?.from?.name;
|
|
const toName = transition?.to?.name;
|
|
const maybeModel =
|
|
transition?.data?.model ?? transition?.from?.attributes;
|
|
if (fromName !== toName && maybeModel?.hasDirtyAttributes) {
|
|
transition.abort();
|
|
try {
|
|
await this.confirm.confirm(this.intl.t('questions.abandon-confirm'), {
|
|
title: 'titles.abandon-confirm',
|
|
confirm: 'actions.discard',
|
|
});
|
|
maybeModel?.rollbackAttributes();
|
|
transition.retry();
|
|
} catch (e) {
|
|
// if user denies, do nothing
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
async beforeModel() {
|
|
this.intl.setLocale(['en-us']);
|
|
await this.session.setup();
|
|
const theme = this.session.get('data.theme');
|
|
/* eslint-disable-next-line ember/no-controller-access-in-routes */
|
|
const controller = this.controllerFor(this.routeName);
|
|
controller.toggleTheme(theme);
|
|
|
|
// Setup the DB from a successful authentication restoration
|
|
if (this.session.isAuthenticated) {
|
|
const userId = this.session.data?.authenticated?.user_id;
|
|
const hostUrl = this.window.location.host;
|
|
if (userId && hostUrl) {
|
|
await this.indexedDb.setup(formatDbName(userId, hostUrl));
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Invalidates the session if a 401 error occurs and returns false to
|
|
* prevent further error handling.
|
|
* Returns true in all other cases, allowing error handling to occur (such
|
|
* as displaying the `error.hbs` template, if one exists).
|
|
* @param {Error} e
|
|
*/
|
|
@action
|
|
error(e) {
|
|
const isUnauthenticated = A(e?.errors)?.[0]?.isUnauthenticated;
|
|
if (isUnauthenticated) {
|
|
this.session.invalidate();
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
}
|