@kavist/arjuna
Version:
Node.js Boilerplate, revisited
116 lines (98 loc) • 2.76 kB
JavaScript
;
const sequelize = require('sequelize');
const { omit: _omit, merge: _merge } = require('lodash');
class SqlModel
{
static ORM = sequelize;
constructor(params)
{
if (this.constructor === SqlModel) {
throw new Error("Cannot construct abstract instances directly");
}
if (!params || !params.connection || !params.tableName || !params.schema) {
throw new Error("Invalid params");
}
this.orm = sequelize;
this.connection = params.connection;
this.tableName = params.tableName;
this.schema = params.schema;
this.option = SqlModel.getOption({
tableName: this.tableName,
option: params.option
});
this.model = SqlModel.createSqlModel({
connection: this.connection,
tableName: this.tableName,
schema: this.schema,
option: this.option,
});
this.protecteds = params.protecteds || [];
SqlModel.registerDefaultStaticFunctions({
model: this.model,
protecteds: this.protecteds
});
}
instance()
{
return this.model;
}
static createSqlModel(params)
{
if (!params || !params.connection || !params.tableName ||
!params.schema || !params.option) {
throw new Error('Invalid params');
}
return params.connection.define(
params.tableName,
params.schema,
params.option
);
}
static registerDefaultStaticFunctions(params)
{
if (!params || !params.model) {
throw new Error('Invalid params');
}
if (params.protecteds && !Array.isArray(params.protecteds)) {
throw new Error('Invalid params');
}
/**
* hide protected field from being exposed
*/
SqlModel.registerStaticFunctions({
model: params.model,
functionName: 'toPublicJSON',
functionCallback: function() {
let values = Object.assign({}, this.get());
return _omit(values, params.protecteds);
}
});
}
static registerStaticFunctions(params)
{
if (!params || !params.model || !params.functionName || !params.functionCallback) {
throw new Error('Invalid params');
}
if (typeof params.functionName !== "string") {
throw new Error('Invalid params');
}
if (typeof params.functionCallback !== "function") {
throw new Error('Invalid params');
}
params.model.prototype[params.functionName] = params.functionCallback;
}
static getOption(params)
{
if (!params || !params.tableName) {
throw new Error('Invalid params');
}
return _merge({
tableName: params.tableName,
freezeTableName: true,
timestamps: true,
createdAt: 'created_at',
updatedAt: 'updated_at',
}, params.option);
}
}
module.exports = SqlModel;