From 4be8a2537071d4d1720db0bcc0c7d317a217ac19 Mon Sep 17 00:00:00 2001 From: Alexis <35.alexis.pele@gmail.com> Date: Tue, 20 Jul 2021 22:03:20 +0200 Subject: [PATCH] Automated model registration --- package.json | 3 +- src/database/AuracleDatabaseDriver.ts | 53 ++++++++++++++++++ .../config/index.ts} | 21 +------ .../migrations/data/ingredient.ods | Bin src/{ => database}/migrations/data/school.ods | Bin src/{ => database}/migrations/data/spell.ods | Bin .../migrations/data/variable.ods | Bin src/database/models/index.js | 37 ++++++++++++ .../models/spells/Ingredient.ts | 2 +- .../models/spells/MetaSchool.ts | 2 +- src/{ => database}/models/spells/School.ts | 2 +- src/{ => database}/models/spells/Spell.ts | 2 +- src/{ => database}/models/users/Permission.ts | 2 +- src/{ => database}/models/users/Role.ts | 2 +- src/{ => database}/models/users/User.ts | 2 +- src/main.ts | 2 +- src/models/index.ts | 23 -------- 17 files changed, 101 insertions(+), 52 deletions(-) create mode 100644 src/database/AuracleDatabaseDriver.ts rename src/{common/classes/AuracleDatabaseDriver.ts => database/config/index.ts} (55%) rename src/{ => database}/migrations/data/ingredient.ods (100%) rename src/{ => database}/migrations/data/school.ods (100%) rename src/{ => database}/migrations/data/spell.ods (100%) rename src/{ => database}/migrations/data/variable.ods (100%) create mode 100644 src/database/models/index.js rename src/{ => database}/models/spells/Ingredient.ts (93%) rename src/{ => database}/models/spells/MetaSchool.ts (93%) rename src/{ => database}/models/spells/School.ts (93%) rename src/{ => database}/models/spells/Spell.ts (96%) rename src/{ => database}/models/users/Permission.ts (91%) rename src/{ => database}/models/users/Role.ts (92%) rename src/{ => database}/models/users/User.ts (94%) delete mode 100644 src/models/index.ts diff --git a/package.json b/package.json index a990ccf..ebfa081 100644 --- a/package.json +++ b/package.json @@ -54,8 +54,7 @@ "eslint-plugin-import": "^2.23.4", "mariadb": "^2.5.4", "sequelize": "^6.6.5", - "sequelize-cli": "^6.2.0", "ts-node": "^10.1.0", "typescript": "^4.3.5" } -} +} \ No newline at end of file diff --git a/src/database/AuracleDatabaseDriver.ts b/src/database/AuracleDatabaseDriver.ts new file mode 100644 index 0000000..d72bf39 --- /dev/null +++ b/src/database/AuracleDatabaseDriver.ts @@ -0,0 +1,53 @@ +import { Sequelize } from 'sequelize' +import * as fs from 'fs' +import { dbConfig } from './config' + +export let AuracleDatabaseDriver: Sequelize; + +// Creates the sequelize instance +AuracleDatabaseDriver = new Sequelize(dbConfig) + +/** + * If the environement is production... + */ +if (process.env.NODE_ENV != 'production') { + AuracleDatabaseDriver.sync({ + force: true + }) +} + +/** + * Fetches all Typescript files from a given directory + * + * @param dir The folder to scan where the models are located + * @param acc (Optional) The array to start + * @returns All .ts files within the dir + */ +export const fetchAllTypescriptFiles = (dir: string, acc: string[] = []): string[] => { + fs.readdirSync(dir) + .forEach(file => { + + const fileIsTypescript = ( + (file.split('.').pop() === 'ts') + ) + const fileIsFolder = (file.indexOf('.') === -1) + + if (fileIsFolder) { + fetchAllTypescriptFiles(`${dir}/${file}`, acc) + } + + if (fileIsTypescript) { + acc.push(`${dir}/${file}`) + } + }) + + return acc +} + +const modelDir = __dirname + '/models' +const models = fetchAllTypescriptFiles(modelDir) + +models.forEach(modelPath => { + const registerModel = require(modelPath).default as Function + registerModel() +}) diff --git a/src/common/classes/AuracleDatabaseDriver.ts b/src/database/config/index.ts similarity index 55% rename from src/common/classes/AuracleDatabaseDriver.ts rename to src/database/config/index.ts index 930ce61..5963622 100644 --- a/src/common/classes/AuracleDatabaseDriver.ts +++ b/src/database/config/index.ts @@ -1,12 +1,11 @@ -import { Model, ModelOptions, Options, Sequelize } from 'sequelize' -import registerModels from '../../models' +import { Model, ModelOptions, Options } from "sequelize/types" const tablePrefix = 'au_' /** * Registers the options to create the sequelize instance */ -const driverOptions: Options = { +export const dbConfig: Options = { /** * Access to database */ @@ -27,19 +26,3 @@ const driverOptions: Options = { } } } -// Creates the sequelize instance -export const AuracleDatabaseDriver = new Sequelize(driverOptions) - -/** - * If the environement is production... - */ -if (process.env.NODE_ENV != 'production') { - AuracleDatabaseDriver.sync({ - force: true - }) -} - -/** - * Registers models presents in the /models folder - */ -registerModels() diff --git a/src/migrations/data/ingredient.ods b/src/database/migrations/data/ingredient.ods similarity index 100% rename from src/migrations/data/ingredient.ods rename to src/database/migrations/data/ingredient.ods diff --git a/src/migrations/data/school.ods b/src/database/migrations/data/school.ods similarity index 100% rename from src/migrations/data/school.ods rename to src/database/migrations/data/school.ods diff --git a/src/migrations/data/spell.ods b/src/database/migrations/data/spell.ods similarity index 100% rename from src/migrations/data/spell.ods rename to src/database/migrations/data/spell.ods diff --git a/src/migrations/data/variable.ods b/src/database/migrations/data/variable.ods similarity index 100% rename from src/migrations/data/variable.ods rename to src/database/migrations/data/variable.ods diff --git a/src/database/models/index.js b/src/database/models/index.js new file mode 100644 index 0000000..33f09e7 --- /dev/null +++ b/src/database/models/index.js @@ -0,0 +1,37 @@ +'use strict'; + +const fs = require('fs'); +const path = require('path'); +const Sequelize = require('sequelize'); +const basename = path.basename(__filename); +const env = process.env.NODE_ENV || 'development'; +const config = require(__dirname + '/../config/config.json')[env]; +const db = {}; + +let sequelize; +if (config.use_env_variable) { + sequelize = new Sequelize(process.env[config.use_env_variable], config); +} else { + sequelize = new Sequelize(config.database, config.username, config.password, config); +} + +fs + .readdirSync(__dirname) + .filter(file => { + return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js'); + }) + .forEach(file => { + const model = require(path.join(__dirname, file))(sequelize, Sequelize.DataTypes); + db[model.name] = model; + }); + +Object.keys(db).forEach(modelName => { + if (db[modelName].associate) { + db[modelName].associate(db); + } +}); + +db.sequelize = sequelize; +db.Sequelize = Sequelize; + +module.exports = db; diff --git a/src/models/spells/Ingredient.ts b/src/database/models/spells/Ingredient.ts similarity index 93% rename from src/models/spells/Ingredient.ts rename to src/database/models/spells/Ingredient.ts index f932eab..750a3bc 100644 --- a/src/models/spells/Ingredient.ts +++ b/src/database/models/spells/Ingredient.ts @@ -1,6 +1,6 @@ import { DataTypes, Model, Optional } from "sequelize"; -import { AuracleDatabaseDriver } from "../../common/classes/AuracleDatabaseDriver"; +import { AuracleDatabaseDriver } from "../../AuracleDatabaseDriver"; interface IngredientAttributes { id: number diff --git a/src/models/spells/MetaSchool.ts b/src/database/models/spells/MetaSchool.ts similarity index 93% rename from src/models/spells/MetaSchool.ts rename to src/database/models/spells/MetaSchool.ts index 37ce22b..cf6d99c 100644 --- a/src/models/spells/MetaSchool.ts +++ b/src/database/models/spells/MetaSchool.ts @@ -1,6 +1,6 @@ import { DataTypes, Model, Optional } from "sequelize"; -import { AuracleDatabaseDriver } from "../../common/classes/AuracleDatabaseDriver"; +import { AuracleDatabaseDriver } from "../../AuracleDatabaseDriver"; interface MetaSchoolAttributes { id: number diff --git a/src/models/spells/School.ts b/src/database/models/spells/School.ts similarity index 93% rename from src/models/spells/School.ts rename to src/database/models/spells/School.ts index 2396f14..4875f84 100644 --- a/src/models/spells/School.ts +++ b/src/database/models/spells/School.ts @@ -1,6 +1,6 @@ import { DataTypes, Model, Optional } from "sequelize"; -import { AuracleDatabaseDriver } from "../../common/classes/AuracleDatabaseDriver"; +import { AuracleDatabaseDriver } from "../../AuracleDatabaseDriver"; interface SchoolAttributes { id: number diff --git a/src/models/spells/Spell.ts b/src/database/models/spells/Spell.ts similarity index 96% rename from src/models/spells/Spell.ts rename to src/database/models/spells/Spell.ts index 463bfd2..bdc8e4a 100644 --- a/src/models/spells/Spell.ts +++ b/src/database/models/spells/Spell.ts @@ -1,6 +1,6 @@ import { DataTypes, Model, Optional } from "sequelize"; -import { AuracleDatabaseDriver } from "../../common/classes/AuracleDatabaseDriver"; +import { AuracleDatabaseDriver } from "../../AuracleDatabaseDriver"; interface SpellAttributes { id: number diff --git a/src/models/users/Permission.ts b/src/database/models/users/Permission.ts similarity index 91% rename from src/models/users/Permission.ts rename to src/database/models/users/Permission.ts index 9c7178f..2b1b4f6 100644 --- a/src/models/users/Permission.ts +++ b/src/database/models/users/Permission.ts @@ -1,6 +1,6 @@ import { DataTypes, Model, Optional } from "sequelize"; -import { AuracleDatabaseDriver } from "../../common/classes/AuracleDatabaseDriver"; +import { AuracleDatabaseDriver } from "../../AuracleDatabaseDriver"; interface PermissionAttributes { id: number diff --git a/src/models/users/Role.ts b/src/database/models/users/Role.ts similarity index 92% rename from src/models/users/Role.ts rename to src/database/models/users/Role.ts index a78135b..7e24f9b 100644 --- a/src/models/users/Role.ts +++ b/src/database/models/users/Role.ts @@ -1,6 +1,6 @@ import { DataTypes, Model, Optional } from "sequelize"; -import { AuracleDatabaseDriver } from "../../common/classes/AuracleDatabaseDriver"; +import { AuracleDatabaseDriver } from "../../AuracleDatabaseDriver"; interface RoleAttributes { id: number diff --git a/src/models/users/User.ts b/src/database/models/users/User.ts similarity index 94% rename from src/models/users/User.ts rename to src/database/models/users/User.ts index a92921a..7945c7f 100644 --- a/src/models/users/User.ts +++ b/src/database/models/users/User.ts @@ -1,6 +1,6 @@ import { DataTypes, Model, Optional } from "sequelize"; -import { AuracleDatabaseDriver } from "../../common/classes/AuracleDatabaseDriver"; +import { AuracleDatabaseDriver } from "../../AuracleDatabaseDriver"; interface UserAttributes { id: number diff --git a/src/main.ts b/src/main.ts index ea095bd..3dea8e6 100644 --- a/src/main.ts +++ b/src/main.ts @@ -12,7 +12,7 @@ import helmet from 'helmet'; import express from 'express' import { AuracleApi } from './common/classes/AuracleApi' -import { AuracleDatabaseDriver } from './common/classes/AuracleDatabaseDriver' +import { AuracleDatabaseDriver } from './database/AuracleDatabaseDriver' const apiPort = process.env.API_PORT diff --git a/src/models/index.ts b/src/models/index.ts deleted file mode 100644 index 338432e..0000000 --- a/src/models/index.ts +++ /dev/null @@ -1,23 +0,0 @@ -import registerUserModel from "./users/User" -import registerRoleModel from "./users/Role" -import registerPermissionModel from "./users/Permission" - -import registerSpellModel from "./spells/Spell" -import registerSchoolModel from "./spells/School" -import registerMetaSchoolModel from "./spells/MetaSchool" - -const models = [ - registerUserModel, - registerRoleModel, - registerPermissionModel, - - registerSpellModel, - registerSchoolModel, - registerMetaSchoolModel, -] - -export default () => { - models.forEach((registerModel) => { - registerModel() - }) -}