DiscordTickets/src/database/index.js
2021-02-20 17:09:08 +00:00

122 lines
2.4 KiB
JavaScript

const {
Sequelize,
DataTypes
} = require('sequelize');
const { path } = require('../utils/fs');
const config = require('../../user/config');
const types = require('./dialects');
const supported = Object.keys(types);
module.exports = async (log) => {
const {
DB_TYPE,
DB_HOST,
DB_USER,
DB_PASS,
DB_NAME,
DB_TABLE_PREFIX
} = process.env;
let type = (DB_TYPE || 'sqlite').toLowerCase();
if (!supported.includes(type)) {
log.error(new Error(`DB_TYPE (${type}) is not a valid type`));
return process.exit();
}
try {
types[type].packages.forEach(pkg => require(pkg));
} catch {
let required = types[type].packages.map(i => `"${i}"`).join(' and ');
log.error(new Error(`Please install the package(s) for your selected database type: ${required}`));
return process.exit();
}
let sequelize;
if (type === 'sqlite') {
log.info('Using SQLite storage');
sequelize = new Sequelize({
dialect: types[type].dialect,
storage: path('./user/database.sqlite'),
logging: log.debug
});
} else {
log.info(`Connecting to ${types[type].name} database...`);
sequelize = new Sequelize(DB_NAME, DB_USER, DB_PASS, {
dialect: types[type].dialect,
host: DB_HOST,
logging: log.debug
});
}
try {
await sequelize.authenticate();
log.success('Connected to database successfully');
} catch (error) {
log.warn('Unable to connect to database');
log.error(error);
return process.exit();
}
const Guild = sequelize.define('Guild', {
id: {
type: DataTypes.CHAR(18),
primaryKey: true,
allowNull: false,
},
colour: {
type: DataTypes.STRING,
defaultValue: config.defaults.colour
},
locale: {
type: DataTypes.STRING,
defaultValue: config.defaults.locale
}
}, {
tableName: DB_TABLE_PREFIX + 'guilds'
});
const Ticket = sequelize.define('Ticket', {
id: {
type: DataTypes.CHAR(18),
primaryKey: true,
allowNull: false,
},
guild: {
type: DataTypes.STRING,
allowNull: false,
references: {
model: Guild,
key: 'id'
},
}
}, {
tableName: DB_TABLE_PREFIX + 'tickets'
});
// eslint-disable-next-line no-unused-vars
const Message = sequelize.define('Message', {
id: {
type: DataTypes.CHAR(18),
primaryKey: true,
allowNull: false,
},
ticket: {
type: DataTypes.STRING,
allowNull: false,
references: {
model: Ticket,
key: 'id'
},
}
}, {
tableName: DB_TABLE_PREFIX + 'messages'
});
sequelize.sync();
return sequelize;
};