Automated model registration
This commit is contained in:
@@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
53
src/database/AuracleDatabaseDriver.ts
Normal file
53
src/database/AuracleDatabaseDriver.ts
Normal 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()
|
||||
})
|
||||
@@ -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()
|
||||
37
src/database/models/index.js
Normal file
37
src/database/models/index.js
Normal 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;
|
||||
@@ -1,6 +1,6 @@
|
||||
import { DataTypes, Model, Optional } from "sequelize";
|
||||
|
||||
import { AuracleDatabaseDriver } from "../../common/classes/AuracleDatabaseDriver";
|
||||
import { AuracleDatabaseDriver } from "../../AuracleDatabaseDriver";
|
||||
|
||||
interface IngredientAttributes {
|
||||
id: number
|
||||
@@ -1,6 +1,6 @@
|
||||
import { DataTypes, Model, Optional } from "sequelize";
|
||||
|
||||
import { AuracleDatabaseDriver } from "../../common/classes/AuracleDatabaseDriver";
|
||||
import { AuracleDatabaseDriver } from "../../AuracleDatabaseDriver";
|
||||
|
||||
interface MetaSchoolAttributes {
|
||||
id: number
|
||||
@@ -1,6 +1,6 @@
|
||||
import { DataTypes, Model, Optional } from "sequelize";
|
||||
|
||||
import { AuracleDatabaseDriver } from "../../common/classes/AuracleDatabaseDriver";
|
||||
import { AuracleDatabaseDriver } from "../../AuracleDatabaseDriver";
|
||||
|
||||
interface SchoolAttributes {
|
||||
id: number
|
||||
@@ -1,6 +1,6 @@
|
||||
import { DataTypes, Model, Optional } from "sequelize";
|
||||
|
||||
import { AuracleDatabaseDriver } from "../../common/classes/AuracleDatabaseDriver";
|
||||
import { AuracleDatabaseDriver } from "../../AuracleDatabaseDriver";
|
||||
|
||||
interface SpellAttributes {
|
||||
id: number
|
||||
@@ -1,6 +1,6 @@
|
||||
import { DataTypes, Model, Optional } from "sequelize";
|
||||
|
||||
import { AuracleDatabaseDriver } from "../../common/classes/AuracleDatabaseDriver";
|
||||
import { AuracleDatabaseDriver } from "../../AuracleDatabaseDriver";
|
||||
|
||||
interface PermissionAttributes {
|
||||
id: number
|
||||
@@ -1,6 +1,6 @@
|
||||
import { DataTypes, Model, Optional } from "sequelize";
|
||||
|
||||
import { AuracleDatabaseDriver } from "../../common/classes/AuracleDatabaseDriver";
|
||||
import { AuracleDatabaseDriver } from "../../AuracleDatabaseDriver";
|
||||
|
||||
interface RoleAttributes {
|
||||
id: number
|
||||
@@ -1,6 +1,6 @@
|
||||
import { DataTypes, Model, Optional } from "sequelize";
|
||||
|
||||
import { AuracleDatabaseDriver } from "../../common/classes/AuracleDatabaseDriver";
|
||||
import { AuracleDatabaseDriver } from "../../AuracleDatabaseDriver";
|
||||
|
||||
interface UserAttributes {
|
||||
id: number
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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()
|
||||
})
|
||||
}
|
||||
Reference in New Issue
Block a user