Automated model registration
This commit is contained in:
@@ -54,7 +54,6 @@
|
|||||||
"eslint-plugin-import": "^2.23.4",
|
"eslint-plugin-import": "^2.23.4",
|
||||||
"mariadb": "^2.5.4",
|
"mariadb": "^2.5.4",
|
||||||
"sequelize": "^6.6.5",
|
"sequelize": "^6.6.5",
|
||||||
"sequelize-cli": "^6.2.0",
|
|
||||||
"ts-node": "^10.1.0",
|
"ts-node": "^10.1.0",
|
||||||
"typescript": "^4.3.5"
|
"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 { Model, ModelOptions, Options } from "sequelize/types"
|
||||||
import registerModels from '../../models'
|
|
||||||
|
|
||||||
const tablePrefix = 'au_'
|
const tablePrefix = 'au_'
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Registers the options to create the sequelize instance
|
* Registers the options to create the sequelize instance
|
||||||
*/
|
*/
|
||||||
const driverOptions: Options = {
|
export const dbConfig: Options = {
|
||||||
/**
|
/**
|
||||||
* Access to database
|
* 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 { DataTypes, Model, Optional } from "sequelize";
|
||||||
|
|
||||||
import { AuracleDatabaseDriver } from "../../common/classes/AuracleDatabaseDriver";
|
import { AuracleDatabaseDriver } from "../../AuracleDatabaseDriver";
|
||||||
|
|
||||||
interface IngredientAttributes {
|
interface IngredientAttributes {
|
||||||
id: number
|
id: number
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
import { DataTypes, Model, Optional } from "sequelize";
|
import { DataTypes, Model, Optional } from "sequelize";
|
||||||
|
|
||||||
import { AuracleDatabaseDriver } from "../../common/classes/AuracleDatabaseDriver";
|
import { AuracleDatabaseDriver } from "../../AuracleDatabaseDriver";
|
||||||
|
|
||||||
interface MetaSchoolAttributes {
|
interface MetaSchoolAttributes {
|
||||||
id: number
|
id: number
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
import { DataTypes, Model, Optional } from "sequelize";
|
import { DataTypes, Model, Optional } from "sequelize";
|
||||||
|
|
||||||
import { AuracleDatabaseDriver } from "../../common/classes/AuracleDatabaseDriver";
|
import { AuracleDatabaseDriver } from "../../AuracleDatabaseDriver";
|
||||||
|
|
||||||
interface SchoolAttributes {
|
interface SchoolAttributes {
|
||||||
id: number
|
id: number
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
import { DataTypes, Model, Optional } from "sequelize";
|
import { DataTypes, Model, Optional } from "sequelize";
|
||||||
|
|
||||||
import { AuracleDatabaseDriver } from "../../common/classes/AuracleDatabaseDriver";
|
import { AuracleDatabaseDriver } from "../../AuracleDatabaseDriver";
|
||||||
|
|
||||||
interface SpellAttributes {
|
interface SpellAttributes {
|
||||||
id: number
|
id: number
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
import { DataTypes, Model, Optional } from "sequelize";
|
import { DataTypes, Model, Optional } from "sequelize";
|
||||||
|
|
||||||
import { AuracleDatabaseDriver } from "../../common/classes/AuracleDatabaseDriver";
|
import { AuracleDatabaseDriver } from "../../AuracleDatabaseDriver";
|
||||||
|
|
||||||
interface PermissionAttributes {
|
interface PermissionAttributes {
|
||||||
id: number
|
id: number
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
import { DataTypes, Model, Optional } from "sequelize";
|
import { DataTypes, Model, Optional } from "sequelize";
|
||||||
|
|
||||||
import { AuracleDatabaseDriver } from "../../common/classes/AuracleDatabaseDriver";
|
import { AuracleDatabaseDriver } from "../../AuracleDatabaseDriver";
|
||||||
|
|
||||||
interface RoleAttributes {
|
interface RoleAttributes {
|
||||||
id: number
|
id: number
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
import { DataTypes, Model, Optional } from "sequelize";
|
import { DataTypes, Model, Optional } from "sequelize";
|
||||||
|
|
||||||
import { AuracleDatabaseDriver } from "../../common/classes/AuracleDatabaseDriver";
|
import { AuracleDatabaseDriver } from "../../AuracleDatabaseDriver";
|
||||||
|
|
||||||
interface UserAttributes {
|
interface UserAttributes {
|
||||||
id: number
|
id: number
|
||||||
@@ -12,7 +12,7 @@ import helmet from 'helmet';
|
|||||||
import express from 'express'
|
import express from 'express'
|
||||||
|
|
||||||
import { AuracleApi } from './common/classes/AuracleApi'
|
import { AuracleApi } from './common/classes/AuracleApi'
|
||||||
import { AuracleDatabaseDriver } from './common/classes/AuracleDatabaseDriver'
|
import { AuracleDatabaseDriver } from './database/AuracleDatabaseDriver'
|
||||||
|
|
||||||
const apiPort = process.env.API_PORT
|
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