From 546e8a1eedfdbe13168f91f3830cda9c64f34f3f Mon Sep 17 00:00:00 2001 From: Alexis <35.alexis.pele@gmail.com> Date: Mon, 19 Jul 2021 21:26:37 +0200 Subject: [PATCH] Implemented models and cleaned some code --- src/common/database/index.ts | 45 ++++++++++ src/common/database/models/index.ts | 23 +++++ .../database/models/spells/Ingredient.ts | 54 ++++++++++++ .../database/models/spells/MetaSchool.ts | 54 ++++++++++++ src/common/database/models/spells/School.ts | 54 ++++++++++++ src/common/database/models/spells/Spell.ts | 87 +++++++++++++++++++ .../database/models/users/Permission.ts | 39 +++++++++ src/common/database/models/users/Role.ts | 46 ++++++++++ src/common/database/models/users/User.ts | 69 +++++++++++++++ src/database/bookshelf.js | 14 --- src/main.ts | 7 +- 11 files changed, 475 insertions(+), 17 deletions(-) create mode 100644 src/common/database/index.ts create mode 100644 src/common/database/models/index.ts create mode 100644 src/common/database/models/spells/Ingredient.ts create mode 100644 src/common/database/models/spells/MetaSchool.ts create mode 100644 src/common/database/models/spells/School.ts create mode 100644 src/common/database/models/spells/Spell.ts create mode 100644 src/common/database/models/users/Permission.ts create mode 100644 src/common/database/models/users/Role.ts create mode 100644 src/common/database/models/users/User.ts delete mode 100644 src/database/bookshelf.js diff --git a/src/common/database/index.ts b/src/common/database/index.ts new file mode 100644 index 0000000..b310462 --- /dev/null +++ b/src/common/database/index.ts @@ -0,0 +1,45 @@ +import { Model, ModelOptions, Options, Sequelize } from 'sequelize' +import registerModels from './models' + +const tablePrefix = 'au_' + +/** + * Registers the options to create the sequelize instance + */ +const driverOptions: Options = { + /** + * Access to database + */ + database: process.env.DB_NAME, + username: process.env.DB_USER, + password: process.env.DB_PASSWORD, + host: process.env.DB_HOST, + dialect: 'mariadb', + logging: false, + + /** + * Sequelize Hooks + * Docs : https://sequelize.org/master/manual/hooks.html + */ + hooks: { + beforeDefine: (model: ModelOptions>) => { + model.tableName = tablePrefix + model.name.plural + } + } +} +// 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/common/database/models/index.ts b/src/common/database/models/index.ts new file mode 100644 index 0000000..338432e --- /dev/null +++ b/src/common/database/models/index.ts @@ -0,0 +1,23 @@ +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() + }) +} diff --git a/src/common/database/models/spells/Ingredient.ts b/src/common/database/models/spells/Ingredient.ts new file mode 100644 index 0000000..d76e1f9 --- /dev/null +++ b/src/common/database/models/spells/Ingredient.ts @@ -0,0 +1,54 @@ +import { DataTypes, Model, Optional } from "sequelize"; + +import { AuracleDatabaseDriver } from "../../"; + +interface IngredientAttributes { + id: number + name: string + description: string + + published: boolean +} + +interface IngredientCreationAttributes extends Optional { } + +class Ingredient extends Model implements IngredientAttributes { + public id!: number + public name!: string + public description!: string + + public published: boolean + + public readonly createdAt!: Date; + public readonly updatedAt!: Date; +} + +export default () => { + Ingredient.init( + { + id: { + type: DataTypes.INTEGER.UNSIGNED, + autoIncrement: true, + primaryKey: true + }, + name: { + type: DataTypes.STRING, + allowNull: false, + unique: true, + }, + description: { + type: DataTypes.STRING, + allowNull: false, + }, + + published: { + type: DataTypes.BOOLEAN, + defaultValue: false + } + }, + { + tableName: 'ingredient', + sequelize: AuracleDatabaseDriver, + } + ) +} diff --git a/src/common/database/models/spells/MetaSchool.ts b/src/common/database/models/spells/MetaSchool.ts new file mode 100644 index 0000000..90052c7 --- /dev/null +++ b/src/common/database/models/spells/MetaSchool.ts @@ -0,0 +1,54 @@ +import { DataTypes, Model, Optional } from "sequelize"; + +import { AuracleDatabaseDriver } from "../../"; + +interface MetaSchoolAttributes { + id: number + name: string + description: string + + published: boolean +} + +interface MetaSchoolCreationAttributes extends Optional { } + +class MetaSchool extends Model implements MetaSchoolAttributes { + public id!: number + public name!: string + public description!: string + + public published: boolean + + public readonly createdAt!: Date; + public readonly updatedAt!: Date; +} + +export default () => { + MetaSchool.init( + { + id: { + type: DataTypes.INTEGER.UNSIGNED, + autoIncrement: true, + primaryKey: true + }, + name: { + type: DataTypes.STRING, + allowNull: false, + unique: true, + }, + description: { + type: DataTypes.STRING, + allowNull: false, + }, + + published: { + type: DataTypes.BOOLEAN, + defaultValue: false + } + }, + { + tableName: 'meta-school', + sequelize: AuracleDatabaseDriver, + } + ) +} diff --git a/src/common/database/models/spells/School.ts b/src/common/database/models/spells/School.ts new file mode 100644 index 0000000..ef8d55a --- /dev/null +++ b/src/common/database/models/spells/School.ts @@ -0,0 +1,54 @@ +import { DataTypes, Model, Optional } from "sequelize"; + +import { AuracleDatabaseDriver } from "../../"; + +interface SchoolAttributes { + id: number + name: string + description: string + + published: boolean +} + +interface SchoolCreationAttributes extends Optional { } + +class School extends Model implements SchoolAttributes { + public id!: number + public name!: string + public description!: string + + public published: boolean + + public readonly createdAt!: Date; + public readonly updatedAt!: Date; +} + +export default () => { + School.init( + { + id: { + type: DataTypes.INTEGER.UNSIGNED, + autoIncrement: true, + primaryKey: true + }, + name: { + type: DataTypes.STRING, + allowNull: false, + unique: true, + }, + description: { + type: DataTypes.STRING, + allowNull: false, + }, + + published: { + type: DataTypes.BOOLEAN, + defaultValue: false + } + }, + { + tableName: 'school', + sequelize: AuracleDatabaseDriver, + } + ) +} diff --git a/src/common/database/models/spells/Spell.ts b/src/common/database/models/spells/Spell.ts new file mode 100644 index 0000000..c861c38 --- /dev/null +++ b/src/common/database/models/spells/Spell.ts @@ -0,0 +1,87 @@ +import { DataTypes, Model, Optional } from "sequelize"; + +import { AuracleDatabaseDriver } from "../../"; + +interface SpellAttributes { + id: number + name: string + description: string + + level: number + charge: number + cost: string + isRitual: boolean + + published: boolean + public: boolean +} + +interface SpellCreationAttributes extends Optional { } + +class Spell extends Model implements SpellAttributes { + public id!: number + public name!: string + public description!: string + + public level: number + public charge: number + public cost: string + public isRitual: boolean + + public published: boolean + public public: boolean + + public readonly createdAt!: Date; + public readonly updatedAt!: Date; +} + +export default () => { + Spell.init( + { + id: { + type: DataTypes.INTEGER.UNSIGNED, + autoIncrement: true, + primaryKey: true + }, + name: { + type: DataTypes.STRING, + allowNull: false, + unique: true, + }, + description: { + type: DataTypes.STRING, + allowNull: false, + }, + + level: { + type: DataTypes.INTEGER, + defaultValue: 0 + }, + charge: { + type: DataTypes.INTEGER, + defaultValue: 0 + }, + cost: { + type: DataTypes.STRING, + defaultValue: '0' + }, + isRitual: { + type: DataTypes.BOOLEAN, + defaultValue: false + }, + + published: { + type: DataTypes.BOOLEAN, + defaultValue: false + }, + public: { + type: DataTypes.BOOLEAN, + defaultValue: false + }, + }, + { + tableName: 'spell', + sequelize: AuracleDatabaseDriver, + } + ) +} diff --git a/src/common/database/models/users/Permission.ts b/src/common/database/models/users/Permission.ts new file mode 100644 index 0000000..e141ec0 --- /dev/null +++ b/src/common/database/models/users/Permission.ts @@ -0,0 +1,39 @@ +import { DataTypes, Model, Optional } from "sequelize"; + +import { AuracleDatabaseDriver } from "../../"; + +interface PermissionAttributes { + id: number + slug: string +} + +interface PermissionCreationAttributes extends Optional { } + +class Permission extends Model implements PermissionAttributes { + public id!: number + public slug!: string + + public readonly createdAt!: Date; + public readonly updatedAt!: Date; +} + +export default () => { + Permission.init( + { + id: { + type: DataTypes.INTEGER.UNSIGNED, + autoIncrement: true, + primaryKey: true + }, + slug: { + type: DataTypes.STRING, + allowNull: false, + unique: true + }, + }, + { + tableName: 'permission', + sequelize: AuracleDatabaseDriver, + } + ) +} diff --git a/src/common/database/models/users/Role.ts b/src/common/database/models/users/Role.ts new file mode 100644 index 0000000..f80a4b2 --- /dev/null +++ b/src/common/database/models/users/Role.ts @@ -0,0 +1,46 @@ +import { DataTypes, Model, Optional } from "sequelize"; + +import { AuracleDatabaseDriver } from "../../"; + +interface RoleAttributes { + id: number + name: string + description: string +} + +interface RoleCreationAttributes extends Optional { } + +class Role extends Model implements RoleAttributes { + public id!: number + public name!: string + public description!: string + + public readonly createdAt!: Date; + public readonly updatedAt!: Date; +} + +export default () => { + Role.init( + { + id: { + type: DataTypes.INTEGER.UNSIGNED, + autoIncrement: true, + primaryKey: true + }, + name: { + type: DataTypes.STRING, + allowNull: false, + unique: true + }, + description: { + type: DataTypes.STRING, + allowNull: false, + unique: true + }, + }, + { + tableName: 'role', + sequelize: AuracleDatabaseDriver, + } + ) +} diff --git a/src/common/database/models/users/User.ts b/src/common/database/models/users/User.ts new file mode 100644 index 0000000..ebb2732 --- /dev/null +++ b/src/common/database/models/users/User.ts @@ -0,0 +1,69 @@ +import { DataTypes, Model, Optional } from "sequelize"; + +import { AuracleDatabaseDriver } from "../../"; + +interface UserAttributes { + id: number + mail: string + password: string + + name: string + avatar: string + gender: string + verified: boolean +} + +interface UserCreationAttributes extends Optional { } + +class User extends Model implements UserAttributes { + public id!: number + public readonly mail!: string + public readonly password!: string + + public name!: string + public avatar: string + public gender: string + public verified: boolean + + public readonly createdAt!: Date; + public readonly updatedAt!: Date; +} + +export default () => { + User.init( + { + id: { + type: DataTypes.INTEGER.UNSIGNED, + autoIncrement: true, + primaryKey: true + }, + mail: { + type: DataTypes.STRING, + allowNull: false, + unique: true, + }, + password: { + type: DataTypes.STRING, + allowNull: false, + }, + + name: { + type: DataTypes.STRING, + allowNull: false, + }, + avatar: { + type: DataTypes.STRING, + }, + gender: { + type: DataTypes.STRING, + }, + verified: { + type: DataTypes.BOOLEAN, + }, + }, + { + tableName: 'user', + sequelize: AuracleDatabaseDriver, + } + ) +} diff --git a/src/database/bookshelf.js b/src/database/bookshelf.js deleted file mode 100644 index 6d02f74..0000000 --- a/src/database/bookshelf.js +++ /dev/null @@ -1,14 +0,0 @@ -// Setting up the database connection -const knex = require('knex')({ - client: "mysql", - connection: { - host: process.env.DB_HOST, - user: process.env.DB_USER, - password: process.env.DB_PASSWORD, - database: process.env.DB_DATABASE, - charset: "utf8" - }, -}); -const bookshelf = require('bookshelf')(knex); - -module.exports = { bookshelf }; \ No newline at end of file diff --git a/src/main.ts b/src/main.ts index 9c2363f..05038ac 100644 --- a/src/main.ts +++ b/src/main.ts @@ -4,11 +4,13 @@ dotenv.config(); // Dependencies import morgan from 'morgan'; import helmet from 'helmet'; - import express from 'express' import { AuracleApi } from './common/classes/AuracleApi' +// Database +import { AuracleDatabaseDriver } from './common/database'; + const port = Number(process.env.API_PORT); const app = new AuracleApi({ @@ -19,11 +21,10 @@ const app = new AuracleApi({ morgan('dev'), helmet() ], + database: AuracleDatabaseDriver }); app.listen() - -process.on('SIGINT', () => app.close()); // const routes = require('./routes');