DiscordTickets/src/database/index.js

334 lines
6.4 KiB
JavaScript
Raw Normal View History

2021-02-16 16:48:04 +02:00
const {
Sequelize,
DataTypes
} = require('sequelize');
const { path } = require('../utils/fs');
const config = require('../../user/config');
const types = require('./dialects');
2021-04-05 20:38:00 +03:00
module.exports = async (client) => {
2021-02-16 16:48:04 +02:00
const {
DB_TYPE,
DB_HOST,
DB_PORT,
2021-02-16 16:48:04 +02:00
DB_USER,
DB_PASS,
2021-02-17 00:34:20 +02:00
DB_NAME,
DB_TABLE_PREFIX
2021-02-16 16:48:04 +02:00
} = process.env;
let type = (DB_TYPE || 'sqlite').toLowerCase();
const supported = Object.keys(types);
2021-02-16 16:48:04 +02:00
if (!supported.includes(type)) {
2021-04-05 20:38:00 +03:00
client.log.error(new Error(`DB_TYPE (${type}) is not a valid type`));
2021-02-17 00:34:20 +02:00
return process.exit();
2021-02-16 16:48:04 +02:00
}
try {
types[type].packages.forEach(pkg => require(pkg));
} catch {
let required = types[type].packages.map(i => `"${i}"`).join(' and ');
2021-04-05 20:38:00 +03:00
client.log.error(new Error(`Please install the package(s) for your selected database type: ${required}`));
2021-02-17 00:34:20 +02:00
return process.exit();
2021-02-16 16:48:04 +02:00
}
let sequelize;
if (type === 'sqlite') {
2021-04-05 20:38:00 +03:00
client.log.info('Using SQLite storage');
2021-02-16 16:48:04 +02:00
sequelize = new Sequelize({
dialect: types[type].dialect,
storage: path('./user/database.sqlite'),
2021-04-05 20:38:00 +03:00
logging: text => client.log.debug(text)
2021-02-16 16:48:04 +02:00
});
} else {
2021-04-05 20:38:00 +03:00
client.log.info(`Connecting to ${types[type].name} database...`);
2021-02-16 16:48:04 +02:00
sequelize = new Sequelize(DB_NAME, DB_USER, DB_PASS, {
dialect: types[type].dialect,
host: DB_HOST,
port: DB_PORT,
2021-04-05 20:38:00 +03:00
logging: text => client.log.debug(text)
2021-02-16 16:48:04 +02:00
});
}
try {
await sequelize.authenticate();
2021-04-05 20:38:00 +03:00
client.log.success('Connected to database successfully');
2021-02-16 16:48:04 +02:00
} catch (error) {
2021-04-05 20:38:00 +03:00
client.log.warn('Failed to connect to database');
client.log.error(error);
2021-02-17 00:34:20 +02:00
return process.exit();
2021-02-16 16:48:04 +02:00
}
const Guild = sequelize.define('Guild', {
id: {
type: DataTypes.CHAR(18),
2021-02-17 00:34:20 +02:00
primaryKey: true,
allowNull: false,
2021-02-16 16:48:04 +02:00
},
2021-04-06 18:18:58 +03:00
colour: {
type: DataTypes.STRING,
2021-04-06 18:18:58 +03:00
defaultValue: config.defaults.colour
},
command_prefix: {
type: DataTypes.STRING,
defaultValue: config.defaults.command_prefix
},
2021-04-06 18:18:58 +03:00
error_colour: {
2021-02-20 19:09:08 +02:00
type: DataTypes.STRING,
2021-04-06 18:18:58 +03:00
defaultValue: 'RED'
2021-02-20 19:09:08 +02:00
},
2021-04-06 18:18:58 +03:00
footer: {
type: DataTypes.STRING,
2021-04-06 18:18:58 +03:00
defaultValue: 'Discord Tickets by eartharoid'
},
2021-04-06 18:18:58 +03:00
locale: {
type: DataTypes.STRING,
2021-04-06 18:18:58 +03:00
defaultValue: config.locale
},
2021-02-21 17:58:06 +02:00
log_messages: {
type: DataTypes.BOOLEAN,
defaultValue: config.defaults.log_messages
},
2021-04-06 18:18:58 +03:00
success_colour: {
2021-04-05 20:38:00 +03:00
type: DataTypes.STRING,
2021-04-06 18:18:58 +03:00
defaultValue: 'GREEN'
2021-04-05 20:38:00 +03:00
},
2021-02-16 16:48:04 +02:00
}, {
2021-02-17 00:34:20 +02:00
tableName: DB_TABLE_PREFIX + 'guilds'
2021-02-16 16:48:04 +02:00
});
2021-02-25 15:12:15 +02:00
const Category = sequelize.define('Category', {
id: {
type: DataTypes.CHAR(18),
primaryKey: true,
allowNull: false,
},
guild: {
type: DataTypes.CHAR(18),
2021-02-25 15:12:15 +02:00
allowNull: false,
references: {
model: Guild,
key: 'id'
},
2021-03-29 01:49:36 +03:00
unique: 'name-guild'
2021-02-25 15:12:15 +02:00
},
2021-03-29 01:49:36 +03:00
max_per_member: {
type: DataTypes.INTEGER,
defaultValue: 1
},
2021-04-06 18:18:58 +03:00
name: {
type: DataTypes.STRING,
allowNull: false,
unique: 'name-guild'
},
2021-03-29 01:49:36 +03:00
name_format: {
type: DataTypes.STRING,
allowNull: false,
defaultValue: config.defaults.name_format
2021-04-06 18:18:58 +03:00
},
opening_message: {
type: DataTypes.STRING,
defaultValue: config.defaults.opening_message,
},
require_topic: {
type: DataTypes.BOOLEAN,
defaultValue: true,
},
roles: {
type: DataTypes.JSON,
allowNull: false,
},
questions: {
type: DataTypes.JSON,
allowNull: true,
},
2021-02-25 15:12:15 +02:00
}, {
tableName: DB_TABLE_PREFIX + 'categories'
});
2021-02-16 16:48:04 +02:00
const Ticket = sequelize.define('Ticket', {
id: {
type: DataTypes.CHAR(18),
2021-02-17 00:34:20 +02:00
primaryKey: true,
allowNull: false,
2021-02-16 16:48:04 +02:00
},
2021-02-25 15:12:15 +02:00
category: {
type: DataTypes.CHAR(18),
2021-02-25 15:12:15 +02:00
allowNull: false,
references: {
model: Category,
key: 'id'
},
},
2021-04-06 18:18:58 +03:00
closed_by: {
type: DataTypes.CHAR(18),
2021-04-05 20:38:00 +03:00
allowNull: true,
},
creator: {
type: DataTypes.CHAR(18),
allowNull: false,
},
2021-04-06 18:18:58 +03:00
guild: {
type: DataTypes.CHAR(18),
allowNull: false,
references: {
model: Guild,
key: 'id'
},
unique: 'number-guild'
},
number: {
type: DataTypes.INTEGER,
allowNull: false,
unique: 'number-guild'
},
2021-03-29 01:49:36 +03:00
open: {
type: DataTypes.BOOLEAN,
defaultValue: true
2021-04-03 02:02:00 +03:00
},
2021-04-06 18:18:58 +03:00
topic: {
type: DataTypes.STRING,
2021-04-03 02:02:00 +03:00
allowNull: true,
2021-04-06 18:18:58 +03:00
},
2021-02-16 16:48:04 +02:00
}, {
2021-02-17 00:34:20 +02:00
tableName: DB_TABLE_PREFIX + 'tickets'
2021-02-16 16:48:04 +02:00
});
// eslint-disable-next-line no-unused-vars
const Message = sequelize.define('Message', {
id: {
type: DataTypes.CHAR(18),
2021-02-17 00:34:20 +02:00
primaryKey: true,
allowNull: false,
2021-02-16 16:48:04 +02:00
},
2021-04-06 18:18:58 +03:00
author: {
type: DataTypes.CHAR(18),
2021-02-16 16:48:04 +02:00
allowNull: false,
2021-02-21 17:58:06 +02:00
},
2021-04-06 18:18:58 +03:00
data: {
type: DataTypes.JSON,
2021-02-21 17:58:06 +02:00
allowNull: false,
},
2021-04-06 18:18:58 +03:00
deleted: {
2021-02-22 02:05:37 +02:00
type: DataTypes.BOOLEAN,
defaultValue: false,
},
2021-04-06 18:18:58 +03:00
edited: {
2021-02-22 02:05:37 +02:00
type: DataTypes.BOOLEAN,
defaultValue: false,
},
2021-04-06 18:18:58 +03:00
ticket: {
type: DataTypes.CHAR(18),
allowNull: false,
references: {
model: Ticket,
key: 'id'
},
2021-02-21 17:58:06 +02:00
},
2021-02-16 16:48:04 +02:00
}, {
2021-02-17 00:34:20 +02:00
tableName: DB_TABLE_PREFIX + 'messages'
2021-02-16 16:48:04 +02:00
});
2021-03-15 23:12:58 +02:00
// eslint-disable-next-line no-unused-vars
const UserEntity = sequelize.define('UserEntity', {
2021-04-06 18:18:58 +03:00
avatar: {
type: DataTypes.STRING,
allowNull: false,
},
bot: {
type: DataTypes.BOOLEAN,
defaultValue: false,
},
colour: {
type: DataTypes.CHAR(6),
allowNull: true,
},
discriminator: {
type: DataTypes.STRING,
allowNull: false,
},
display_name: {
type: DataTypes.STRING,
2021-03-15 23:12:58 +02:00
allowNull: false,
},
ticket: {
type: DataTypes.CHAR(18),
2021-03-15 23:12:58 +02:00
allowNull: false,
2021-03-29 01:49:36 +03:00
unique: 'id-ticket',
2021-03-15 23:12:58 +02:00
references: {
model: Ticket,
key: 'id'
2021-04-06 18:18:58 +03:00
},
},
user: {
type: DataTypes.CHAR(18),
allowNull: false,
unique: 'id-ticket'
},
username: {
type: DataTypes.STRING,
allowNull: false,
},
2021-03-15 23:12:58 +02:00
}, {
tableName: DB_TABLE_PREFIX + 'user_entities'
});
// eslint-disable-next-line no-unused-vars
const ChannelEntity = sequelize.define('ChannelEntity', {
channel: {
type: DataTypes.CHAR(18),
allowNull: false,
2021-03-29 01:49:36 +03:00
unique: 'id-ticket'
2021-03-15 23:12:58 +02:00
},
2021-04-06 18:18:58 +03:00
name: {
type: DataTypes.STRING,
allowNull: false,
},
2021-03-15 23:12:58 +02:00
ticket: {
type: DataTypes.CHAR(18),
2021-03-15 23:12:58 +02:00
allowNull: false,
2021-03-29 01:49:36 +03:00
unique: 'id-ticket',
2021-03-15 23:12:58 +02:00
references: {
model: Ticket,
key: 'id'
},
},
}, {
tableName: DB_TABLE_PREFIX + 'channel_entities'
});
// eslint-disable-next-line no-unused-vars
const RoleEntity = sequelize.define('RoleEntity', {
2021-04-06 18:18:58 +03:00
colour: {
type: DataTypes.CHAR(6),
defaultValue: '7289DA',
},
name: {
type: DataTypes.STRING,
allowNull: false,
},
2021-03-15 23:12:58 +02:00
role: {
type: DataTypes.CHAR(18),
allowNull: false,
2021-03-29 01:49:36 +03:00
unique: 'id-ticket'
2021-03-15 23:12:58 +02:00
},
ticket: {
type: DataTypes.CHAR(18),
2021-03-15 23:12:58 +02:00
allowNull: false,
2021-03-29 01:49:36 +03:00
unique: 'id-ticket',
2021-03-15 23:12:58 +02:00
references: {
model: Ticket,
key: 'id'
},
},
}, {
tableName: DB_TABLE_PREFIX + 'role_entities'
});
2021-02-16 16:48:04 +02:00
sequelize.sync();
2021-02-17 15:24:33 +02:00
return sequelize;
2021-02-16 16:48:04 +02:00
};