hexabot/api/src/seeder.ts

157 lines
5.3 KiB
TypeScript
Raw Normal View History

2024-09-10 09:50:11 +00:00
/*
* Copyright © 2024 Hexastack. All rights reserved.
*
* Licensed under the GNU Affero General Public License v3.0 (AGPLv3) with the following additional terms:
* 1. The name "Hexabot" is a trademark of Hexastack. You may not use this name in derivative works without express written permission.
* 2. All derivative works must include clear attribution to the original creator and software, Hexastack and Hexabot, in a prominent location (e.g., in the software's "About" section, documentation, and README file).
*/
import { INestApplicationContext } from '@nestjs/common';
import { CategorySeeder } from './chat/seeds/category.seed';
import { categoryModels } from './chat/seeds/category.seed-model';
import { ContextVarSeeder } from './chat/seeds/context-var.seed';
import { contextVarModels } from './chat/seeds/context-var.seed-model';
2024-09-22 11:51:56 +00:00
import { LanguageSeeder } from './i18n/seeds/language.seed';
import { languageModels } from './i18n/seeds/language.seed-model';
import { TranslationSeeder } from './i18n/seeds/translation.seed';
import { translationModels } from './i18n/seeds/translation.seed-model';
2024-09-10 09:50:11 +00:00
import { LoggerService } from './logger/logger.service';
import { NlpEntitySeeder } from './nlp/seeds/nlp-entity.seed';
import { nlpEntityModels } from './nlp/seeds/nlp-entity.seed-model';
import { NlpValueSeeder } from './nlp/seeds/nlp-value.seed';
import { nlpValueModels } from './nlp/seeds/nlp-value.seed-model';
import { SettingSeeder } from './setting/seeds/setting.seed';
import { settingModels } from './setting/seeds/setting.seed-model';
import { ModelSeeder } from './user/seeds/model.seed';
import { modelModels } from './user/seeds/model.seed-model';
import { PermissionSeeder } from './user/seeds/permission.seed';
import { permissionModels } from './user/seeds/permission.seed-model';
import { RoleSeeder } from './user/seeds/role.seed';
import { roleModels } from './user/seeds/role.seed-model';
import { UserSeeder } from './user/seeds/user.seed';
import { userModels } from './user/seeds/user.seed-model';
export async function seedDatabase(app: INestApplicationContext) {
const logger = app.get(LoggerService);
const modelSeeder = app.get(ModelSeeder);
const categorySeeder = app.get(CategorySeeder);
const contextVarSeeder = app.get(ContextVarSeeder);
const roleSeeder = app.get(RoleSeeder);
const settingSeeder = app.get(SettingSeeder);
const permissionSeeder = app.get(PermissionSeeder);
const userSeeder = app.get(UserSeeder);
2024-09-22 11:51:56 +00:00
const languageSeeder = app.get(LanguageSeeder);
2024-09-10 09:50:11 +00:00
const translationSeeder = app.get(TranslationSeeder);
const nlpEntitySeeder = app.get(NlpEntitySeeder);
const nlpValueSeeder = app.get(NlpValueSeeder);
const existingUsers = await userSeeder.findAll();
if (existingUsers.length > 0) {
logger.log('Database already seeded, aborting ...');
return;
}
// Seed models
try {
await modelSeeder.seed(modelModels);
} catch (e) {
logger.error('Unable to seed the database with models!');
throw e;
}
// Seed roles
try {
await roleSeeder.seed(roleModels);
} catch (e) {
logger.error('Unable to seed the database with roles!');
throw e;
}
const models = await modelSeeder.findAll();
const roles = await roleSeeder.findAll();
const adminRole = roles.find(({ name }) => name === 'admin');
const managerRole = roles.find(({ name }) => name === 'manager');
const managerModels = models.filter(
(model) => !['Role', 'User', 'Permission'].includes(model.name),
);
const roleModelsCombinations: [string, string][] = [
...models.map((model) => [model.id, adminRole.id]),
...managerModels.map((model) => [model.id, managerRole.id]),
] as [string, string][];
const permissionSeeds = roleModelsCombinations.reduce(
(acc, [modelId, roleId]) => {
return acc.concat(permissionModels(modelId, roleId));
},
[],
);
// Seed permissions
try {
await permissionSeeder.seed(permissionSeeds);
} catch (e) {
logger.error('Unable to seed the database with permissions!');
throw e;
}
if (adminRole) {
// Seed users
try {
await userSeeder.seed(userModels([adminRole.id]));
} catch (e) {
logger.error('Unable to seed the database with users!');
throw e;
}
// Seed users
try {
await settingSeeder.seed(settingModels);
} catch (e) {
logger.error('Unable to seed the database with settings!');
throw e;
}
}
// Seed categories
try {
await categorySeeder.seed(categoryModels);
} catch (e) {
logger.error('Unable to seed the database with categories!');
throw e;
}
// Seed context vars
try {
await contextVarSeeder.seed(contextVarModels);
} catch (e) {
logger.error('Unable to seed the database with context vars!');
throw e;
}
2024-09-22 11:51:56 +00:00
// Seed languages
try {
await languageSeeder.seed(languageModels);
} catch (e) {
logger.error('Unable to seed the database with languages!');
throw e;
}
2024-09-10 09:50:11 +00:00
// Seed translations
try {
await translationSeeder.seed(translationModels);
} catch (e) {
logger.error('Unable to seed the database with translations!');
throw e;
}
// Seed Nlp entities and values
try {
await nlpEntitySeeder.seed(nlpEntityModels);
await nlpValueSeeder.seed(nlpValueModels);
} catch (e) {
logger.error('Unable to seed the database with nlp entities!');
throw e;
}
}