Files
Fleetbase-Mirror-Repo/console/app/controllers/install.js

103 lines
2.9 KiB
JavaScript

import Controller from '@ember/controller';
import { tracked } from '@glimmer/tracking';
import { inject as service } from '@ember/service';
import { action } from '@ember/object';
import { task } from 'ember-concurrency-decorators';
export default class InstallController extends Controller {
@service fetch;
@service notifications;
@service router;
@tracked error;
@tracked steps = [
{ task: 'createdb', name: 'Create Database', status: 'pending' },
{ task: 'migrate', name: 'Run Migrations', status: 'pending' },
{ task: 'seed', name: 'Seed Database', status: 'pending' },
];
@action updateTask(task, properties = {}) {
const steps = [...this.steps];
const index = steps.findIndex((step) => step.task === task);
if (index > -1) {
steps[index] = { ...steps[index], ...properties };
}
this.steps = [...steps];
}
@action startInstall() {
this.install.perform();
}
@action reset(options = {}) {
const install = options.install === true;
this.steps.forEach((step) => {
this.updateTask(step.task, { status: 'pending' });
});
if (install) {
this.install.perform();
}
}
@action onInstallCompleted() {
const isCompleted = this.steps.every(({ status }) => status === 'completed');
if (isCompleted) {
this.notifications.success('Install completed successfully!');
return this.router.transitionTo('onboard');
}
}
@task({ enqueue: true, maxConcurrency: 1 }) *install() {
try {
yield this.createdb.perform();
yield this.migrate.perform();
yield this.seed.perform();
} catch (error) {
this.error = error;
return this.reset();
}
this.onInstallCompleted();
}
@task *createdb() {
this.updateTask('createdb', { status: 'in_progress' });
try {
yield this.fetch.post('installer/createdb');
this.updateTask('createdb', { status: 'completed' });
} catch (error) {
this.updateTask('createdb', { status: 'failed' });
throw error;
}
}
@task *migrate() {
this.updateTask('migrate', { status: 'in_progress' });
try {
yield this.fetch.post('installer/migrate');
this.updateTask('migrate', { status: 'completed' });
} catch (error) {
this.updateTask('migrate', { status: 'failed' });
throw error;
}
}
@task *seed() {
this.updateTask('seed', { status: 'in_progress' });
try {
yield this.fetch.post('installer/seed');
this.updateTask('seed', { status: 'completed' });
} catch (error) {
this.updateTask('seed', { status: 'failed' });
throw error;
}
}
}