Automated model registration

This commit is contained in:
Alexis
2021-07-20 22:03:20 +02:00
parent c03a5d62ec
commit 4be8a25370
17 changed files with 101 additions and 52 deletions

View File

@@ -54,7 +54,6 @@
"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"
}

View File

@@ -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()
})

View File

@@ -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()

View File

@@ -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;

View File

@@ -1,6 +1,6 @@
import { DataTypes, Model, Optional } from "sequelize";
import { AuracleDatabaseDriver } from "../../common/classes/AuracleDatabaseDriver";
import { AuracleDatabaseDriver } from "../../AuracleDatabaseDriver";
interface IngredientAttributes {
id: number

View File

@@ -1,6 +1,6 @@
import { DataTypes, Model, Optional } from "sequelize";
import { AuracleDatabaseDriver } from "../../common/classes/AuracleDatabaseDriver";
import { AuracleDatabaseDriver } from "../../AuracleDatabaseDriver";
interface MetaSchoolAttributes {
id: number

View File

@@ -1,6 +1,6 @@
import { DataTypes, Model, Optional } from "sequelize";
import { AuracleDatabaseDriver } from "../../common/classes/AuracleDatabaseDriver";
import { AuracleDatabaseDriver } from "../../AuracleDatabaseDriver";
interface SchoolAttributes {
id: number

View File

@@ -1,6 +1,6 @@
import { DataTypes, Model, Optional } from "sequelize";
import { AuracleDatabaseDriver } from "../../common/classes/AuracleDatabaseDriver";
import { AuracleDatabaseDriver } from "../../AuracleDatabaseDriver";
interface SpellAttributes {
id: number

View File

@@ -1,6 +1,6 @@
import { DataTypes, Model, Optional } from "sequelize";
import { AuracleDatabaseDriver } from "../../common/classes/AuracleDatabaseDriver";
import { AuracleDatabaseDriver } from "../../AuracleDatabaseDriver";
interface PermissionAttributes {
id: number

View File

@@ -1,6 +1,6 @@
import { DataTypes, Model, Optional } from "sequelize";
import { AuracleDatabaseDriver } from "../../common/classes/AuracleDatabaseDriver";
import { AuracleDatabaseDriver } from "../../AuracleDatabaseDriver";
interface RoleAttributes {
id: number

View File

@@ -1,6 +1,6 @@
import { DataTypes, Model, Optional } from "sequelize";
import { AuracleDatabaseDriver } from "../../common/classes/AuracleDatabaseDriver";
import { AuracleDatabaseDriver } from "../../AuracleDatabaseDriver";
interface UserAttributes {
id: number

View File

@@ -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

View File

@@ -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()
})
}