tspace-sql
Version:
mysql & postgresql query builder object relational mapping
902 lines • 90 kB
JavaScript
"use strict";
var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
if (typeof b !== "function" && b !== null)
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __generator = (this && this.__generator) || function (thisArg, body) {
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (_) try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [op[0] & 2, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
};
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
if (ar || !(i in from)) {
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
ar[i] = from[i];
}
}
return to.concat(ar || Array.prototype.slice.call(from));
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
var AbstractModel_1 = __importDefault(require("./AbstractModel"));
var pluralize_1 = __importDefault(require("pluralize"));
var DB_1 = __importDefault(require("../orm/DB"));
var Model = /** @class */ (function (_super) {
__extends(Model, _super);
function Model() {
var _this = _super.call(this) || this;
_this.useTable = function (table) {
_this.TABLE_NAME = "`" + table + "`";
_this.SELECT = _this.CONSTANT.SELECT + " *";
_this.FROM = "" + _this.CONSTANT.FROM;
return _this;
};
_this._classToTableName = function (className, belongsTo) {
if (belongsTo === void 0) { belongsTo = false; }
if (className == null)
className = _this.constructor.name;
var tb = className.replace(/([A-Z])/g, function (str) { return '_' + str.toLowerCase(); }).slice(1);
if (belongsTo)
return tb;
return (0, pluralize_1.default)(tb);
};
_this._tableName = function () {
var tb = _this._classToTableName();
_this.SELECT = _this.CONSTANT.SELECT + " *";
_this.FROM = "" + _this.CONSTANT.FROM;
_this.TABLE_NAME = "`" + tb + "`";
};
_this._valueInRelationChild = function (data) {
var relation = data.relation;
var model = data.model.name;
var modelParent = data.modelParent.name;
var table = data.freezeTable ? data.freezeTable : _this._classToTableName(model);
var name = data.nameChild;
var as = data.as;
var select = data.select == null ? '*' : data.select;
var hidden = data.hidden == null ? '' : data.hidden.split(',');
if (!model || model == null)
throw new Error('Relationship model missing');
var patternId = _this._isPatternSnakeCase() ? '_id' : 'Id';
var pk = data.pk ? data.pk : 'id';
var fk = data.fk ? data.fk : _this._classToTableName(modelParent, true) + patternId;
if (data.pk == null && data.fk == null && relation === _this.RELATIONSHIP.belongsTo) {
fk = pk;
pk = _this._classToTableName(model, true) + patternId;
}
return { name: name, as: as, relation: relation, table: table, pk: pk, fk: fk, select: select, hidden: hidden, model: model };
};
_this._valueInRelation = function (data) {
var relation = data.relation;
var model = data.model.name;
var table = data.freezeTable ? data.freezeTable : _this._classToTableName(model);
var name = data.name;
var as = data.as;
var select = data.select == null ? '*' : data.select;
var hidden = data.hidden == null ? '' : data.hidden.split(',');
if (!model || model == null)
throw new Error('Relationship model missing');
var patternId = _this._isPatternSnakeCase() ? '_id' : 'Id';
var pk = data.pk ? data.pk : 'id';
var fk = data.fk ? data.fk : _this._classToTableName(null, true) + patternId;
if (data.pk == null && data.fk == null && relation === _this.RELATIONSHIP.belongsTo) {
fk = pk;
pk = _this._classToTableName(model, true) + patternId;
}
return { name: name, as: as, relation: relation, table: table, pk: pk, fk: fk, select: select, hidden: hidden, model: model };
};
_this._defaultScope = function (scopes) {
if (_this.SOFT_DELETE) {
var deletedAt = _this._isPatternSnakeCase() ? 'deleted_at' : 'deletedAt';
scopes.whereNull = {};
scopes.whereNull[deletedAt] = null;
}
for (var column in scopes.where) {
var value = scopes.where[column];
_this.where(column, '=', value);
}
for (var column in scopes.whereNot) {
var value = scopes.whereNot[column];
_this.where(column, '!=', value);
}
for (var column in scopes.whereNull) {
_this.whereNull(column);
}
for (var column in scopes.whereNotNull) {
_this.whereNotNull(column);
}
return _this;
};
_this._getSQLModel = function (_a) {
var _b = _a === void 0 ? {} : _a, _c = _b.disabled, disabled = _c === void 0 ? false : _c;
if (!disabled) {
_this._defaultScope(_this.DEFAULT_SCOPE);
}
if (_this.DEFAULT_ORDER_BY && !_this.ORDER_BY) {
_this.ORDER_BY = _this.CONSTANT.ORDER_BY + " " + _this.DEFAULT_ORDER_BY;
}
var arraySql = [
_this.UPDATE,
_this.INSERT,
_this.SELECT,
_this.FROM,
_this.TABLE_NAME,
_this.JOIN,
_this.WHERE,
_this.GROUP_BY,
_this.ORDER_BY,
_this.LIMIT
];
var filterSql = arraySql.filter(function (data) { return data !== '' || data == null; });
var sql = filterSql.join(' ');
return sql;
};
_this._exceptColumns = function () { return __awaiter(_this, void 0, void 0, function () {
var sql, rawColumns, columns, removeExcept;
var _this = this;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
sql = this.CONSTANT.SHOW + " " + this.CONSTANT.COLUMNS + " " + this.CONSTANT.FROM + " " + this.TABLE_NAME;
return [4 /*yield*/, this.queryStatement(sql)];
case 1:
rawColumns = _a.sent();
columns = rawColumns.map(function (column) { return column.Field; });
removeExcept = columns.filter(function (column) { return !_this.EXCEPT.includes(column); });
this.select(removeExcept.join(','));
return [2 /*return*/, this];
}
});
}); };
_this._showOnly = function (data) {
var result = [];
var hasNameRelation = _this.WITH.map(function (w) { var _a; return (_a = w.as) !== null && _a !== void 0 ? _a : w.name; });
data.forEach(function (d) {
var newData = {};
_this.ONLY.forEach(function (only) {
var _a;
if (d.hasOwnProperty(only))
newData = __assign(__assign({}, newData), (_a = {}, _a[only] = d[only], _a));
});
hasNameRelation.forEach(function (name) {
var _a;
return newData = __assign(__assign({}, newData), (_a = {}, _a[name] = d[name], _a));
});
result = __spreadArray(__spreadArray([], result, true), [newData], false);
});
return result;
};
_this._exec = function (sql, type) { return __awaiter(_this, void 0, void 0, function () {
var mains, emptyData, relations, _i, relations_1, relation, subs, childSubs, resultData, err_1;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
_a.trys.push([0, 10, , 11]);
return [4 /*yield*/, this.queryStatement(sql)];
case 1:
mains = _a.sent();
emptyData = this._returnEmpty(type, mains);
if (!mains.length)
return [2 /*return*/, emptyData];
relations = this.WITH;
if (!relations.length) return [3 /*break*/, 9];
_i = 0, relations_1 = relations;
_a.label = 2;
case 2:
if (!(_i < relations_1.length)) return [3 /*break*/, 9];
relation = relations_1[_i];
if (!(relation.relation === this.RELATIONSHIP.belongsToMany)) return [3 /*break*/, 4];
return [4 /*yield*/, this._belongsToMany(type, mains, relation)];
case 3:
mains = _a.sent();
return [3 /*break*/, 8];
case 4: return [4 /*yield*/, this._relation(mains, relation)];
case 5:
subs = _a.sent();
if (!(relation.child && subs.length)) return [3 /*break*/, 7];
return [4 /*yield*/, this._relationChild(subs, relation.child)];
case 6:
childSubs = _a.sent();
subs = this._relationFilterChild(subs, childSubs, relation.child);
_a.label = 7;
case 7:
mains = this._relationFilter(mains, subs, relation);
_a.label = 8;
case 8:
_i++;
return [3 /*break*/, 2];
case 9:
if (this.HIDDEN.length)
this._hiddenColumnModel(mains);
resultData = this._returnResult(type, mains);
return [2 /*return*/, resultData || emptyData];
case 10:
err_1 = _a.sent();
throw new Error(err_1.message);
case 11: return [2 /*return*/];
}
});
}); };
_this._execGroup = function (mains, type) {
if (type === void 0) { type = 'GET'; }
return __awaiter(_this, void 0, void 0, function () {
var emptyData, relations, _i, relations_2, relation, subs, childSubs, resultData, err_2;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
_a.trys.push([0, 7, , 8]);
emptyData = this._returnEmpty(type, mains);
if (!mains.length)
return [2 /*return*/, emptyData];
relations = this.WITH;
if (!relations.length) return [3 /*break*/, 6];
_i = 0, relations_2 = relations;
_a.label = 1;
case 1:
if (!(_i < relations_2.length)) return [3 /*break*/, 6];
relation = relations_2[_i];
if (relation.relation === this.RELATIONSHIP.belongsToMany)
return [2 /*return*/, this._belongsToMany(type, mains, relation)];
return [4 /*yield*/, this._relation(mains, relation)];
case 2:
subs = _a.sent();
if (!(relation.child && subs.length)) return [3 /*break*/, 4];
return [4 /*yield*/, this._relationChild(subs, relation.child)];
case 3:
childSubs = _a.sent();
subs = this._relationFilterChild(subs, childSubs, relation.child);
_a.label = 4;
case 4:
mains = this._relationFilter(mains, subs, relation);
_a.label = 5;
case 5:
_i++;
return [3 /*break*/, 1];
case 6:
if (this.HIDDEN.length)
this._hiddenColumnModel(mains);
resultData = this._returnResult(type, mains);
return [2 /*return*/, resultData || emptyData];
case 7:
err_2 = _a.sent();
throw new Error(err_2.message);
case 8: return [2 /*return*/];
}
});
});
};
_this._relationFilterChild = function (subs, childSubs, relations) {
var _loop_1 = function (relationChild) {
var _a = _this._valueInRelationChild(relationChild), name = _a.name, as = _a.as, relation = _a.relation, pk = _a.pk, fk = _a.fk;
subs.forEach(function (sub) {
if (relation === _this.RELATIONSHIP.hasOne || relation === _this.RELATIONSHIP.belongsTo)
sub[as !== null && as !== void 0 ? as : name] = null;
else
sub[as !== null && as !== void 0 ? as : name] = [];
if (childSubs.length) {
childSubs.forEach(function (child) {
if (child[fk] === sub[pk]) {
if (relation === _this.RELATIONSHIP.hasOne || relation === _this.RELATIONSHIP.belongsTo) {
sub[as !== null && as !== void 0 ? as : name] = sub[as !== null && as !== void 0 ? as : name] || child;
}
else {
if (sub[as !== null && as !== void 0 ? as : name] == null)
sub[as !== null && as !== void 0 ? as : name] = [];
sub[as !== null && as !== void 0 ? as : name].push(child);
}
}
});
}
});
};
for (var _i = 0, relations_3 = relations; _i < relations_3.length; _i++) {
var relationChild = relations_3[_i];
_loop_1(relationChild);
}
return subs;
};
_this._relationFilter = function (mains, subs, relations) {
var _a = _this._valueInRelation(relations), name = _a.name, as = _a.as, relation = _a.relation, pk = _a.pk, fk = _a.fk;
var keyRelation = as !== null && as !== void 0 ? as : name;
mains.forEach(function (main) {
if (relation === _this.RELATIONSHIP.hasOne || relation === _this.RELATIONSHIP.belongsTo)
main[keyRelation] = null;
else
main[keyRelation] = [];
if (subs.length) {
subs.forEach(function (sub) {
if (sub[fk] === main[pk]) {
if (relation === _this.RELATIONSHIP.hasOne || relation === _this.RELATIONSHIP.belongsTo) {
main[keyRelation] = main[keyRelation] || sub;
}
else {
if (main[keyRelation] == null)
main[keyRelation] = [];
main[keyRelation].push(sub);
}
}
});
}
});
if (_this.WITH_EXISTS) {
return mains.filter(function (main) {
if (Array.isArray(main[keyRelation]))
return main[keyRelation].length;
return main[keyRelation] != null;
});
}
return mains;
};
_this._relation = function (mains, relations) { return __awaiter(_this, void 0, void 0, function () {
var _a, pk_1, fk, select, hidden, pkId, mainId, whereHas, sqlSubs, subs_1, err_3;
return __generator(this, function (_b) {
switch (_b.label) {
case 0:
_b.trys.push([0, 3, , 4]);
_a = this._valueInRelation(relations), pk_1 = _a.pk, fk = _a.fk, select = _a.select, hidden = _a.hidden;
pkId = mains.map(function (main) { return main[pk_1]; }).filter(function (data) { return data != null; });
mainId = Array.from(new Set(pkId)) || [];
if (!mainId.length && !this.WITH_EXISTS)
throw new Error("can't relationship without primary or foreign key");
if (!mainId.length && this.WITH_EXISTS)
return [2 /*return*/, []];
whereHas = relations.whereHas || '';
return [4 /*yield*/, new relations.model().select(select).whereIn(fk, mainId).toString()];
case 1:
sqlSubs = _b.sent();
return [4 /*yield*/, this.queryStatement(sqlSubs + " " + whereHas)];
case 2:
subs_1 = _b.sent();
if (subs_1.length && hidden) {
hidden.forEach(function (column) {
subs_1.forEach(function (objColumn) {
delete objColumn[column];
});
});
}
return [2 /*return*/, subs_1];
case 3:
err_3 = _b.sent();
throw new Error(err_3.message);
case 4: return [2 /*return*/];
}
});
}); };
_this._relationChild = function (subs, relationsChilds) { return __awaiter(_this, void 0, void 0, function () {
var childSubs_1, _loop_2, this_1, _i, relationsChilds_1, relationsChild, err_4;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
_a.trys.push([0, 5, , 6]);
childSubs_1 = [];
_loop_2 = function (relationsChild) {
var _b, pk, fk, select, hidden, pkSubId, subId, _c;
return __generator(this, function (_d) {
switch (_d.label) {
case 0:
_b = this_1._valueInRelationChild(relationsChild), pk = _b.pk, fk = _b.fk, select = _b.select, hidden = _b.hidden;
pkSubId = subs.map(function (sub) { return sub[pk]; }).filter(function (data) { return data != null; });
subId = Array.from(new Set(pkSubId)) || [];
_c = [__spreadArray([], childSubs_1, true)];
return [4 /*yield*/, new relationsChild.model()
.select(select)
.whereIn(fk, subId)
.get({ debug: this_1.DEBUG })];
case 1:
childSubs_1 = __spreadArray.apply(void 0, _c.concat([_d.sent(), true]));
if (childSubs_1.length && hidden) {
hidden.forEach(function (column) {
childSubs_1.forEach(function (objColumn) {
delete objColumn[column];
});
});
}
return [2 /*return*/];
}
});
};
this_1 = this;
_i = 0, relationsChilds_1 = relationsChilds;
_a.label = 1;
case 1:
if (!(_i < relationsChilds_1.length)) return [3 /*break*/, 4];
relationsChild = relationsChilds_1[_i];
return [5 /*yield**/, _loop_2(relationsChild)];
case 2:
_a.sent();
_a.label = 3;
case 3:
_i++;
return [3 /*break*/, 1];
case 4: return [2 /*return*/, childSubs_1];
case 5:
err_4 = _a.sent();
throw new Error(err_4.message);
case 6: return [2 /*return*/];
}
});
}); };
_this._relationChildBelongsToMany = function (subs, relationsChilds, name) { return __awaiter(_this, void 0, void 0, function () {
var _loop_3, this_2, _i, relationsChilds_2, relationsChild, err_5;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
_a.trys.push([0, 5, , 6]);
_loop_3 = function (relationsChild) {
var _b, table, pk, fk, select, hidden, pkSubId, subId, sqlChildSubs, childSubs, nameRelation;
return __generator(this, function (_c) {
switch (_c.label) {
case 0:
_b = this_2._valueInRelationChild(relationsChild), table = _b.table, pk = _b.pk, fk = _b.fk, select = _b.select, hidden = _b.hidden;
pkSubId = subs.map(function (sub) { return sub[pk]; }).filter(function (data) { return data != null; });
subId = Array.from(new Set(pkSubId)).join(',') || 0;
sqlChildSubs = this_2.CONSTANT.SELECT + " " + select + " " + this_2.CONSTANT.FROM + " " + table + " " + this_2.CONSTANT.WHERE + " " + fk + " " + this_2.CONSTANT.IN + " (" + subId + ")";
return [4 /*yield*/, this_2.queryStatement(sqlChildSubs)];
case 1:
childSubs = _c.sent();
if (childSubs.length && hidden) {
hidden.forEach(function (column) {
childSubs.forEach(function (objColumn) {
delete objColumn[column];
});
});
}
nameRelation = relationsChild.name;
subs.forEach(function (sub) {
childSubs.forEach(function (childSub) {
var _a;
if (childSub[fk] === sub[pk]) {
var keyName = ((_a = nameRelation === null || nameRelation === void 0 ? void 0 : nameRelation.split('.')) === null || _a === void 0 ? void 0 : _a.pop()) || 'data';
sub[keyName] = childSub;
}
});
});
return [2 /*return*/];
}
});
};
this_2 = this;
_i = 0, relationsChilds_2 = relationsChilds;
_a.label = 1;
case 1:
if (!(_i < relationsChilds_2.length)) return [3 /*break*/, 4];
relationsChild = relationsChilds_2[_i];
return [5 /*yield**/, _loop_3(relationsChild)];
case 2:
_a.sent();
_a.label = 3;
case 3:
_i++;
return [3 /*break*/, 1];
case 4: return [2 /*return*/, subs];
case 5:
err_5 = _a.sent();
throw new Error(err_5.message);
case 6: return [2 /*return*/];
}
});
}); };
_this._belongsToMany = function (type, mains, dataRelation) { return __awaiter(_this, void 0, void 0, function () {
var _a, name_1, pk_2, fk_1, select, pkId, mainId, local, modelOther, other_1, pivotTable, otherPk_1, otherFk_1, sqlSubs, subs_2, otherId, otherArrId, otherSubs_1, err_6, _b, name_2, pk_3, fk_2, select, pkId, mainId, local, modelOther, other_2, pivotTable, otherPk_2, otherFk_2, sqlSubs, subs_3, otherId, otherArrId, otherSubs_2, err_7;
var _c, _d;
return __generator(this, function (_e) {
switch (_e.label) {
case 0:
_e.trys.push([0, 5, , 13]);
_a = this._valueInRelation(dataRelation), name_1 = _a.name, pk_2 = _a.pk, fk_1 = _a.fk, select = _a.select;
pkId = mains.map(function (main) { return main[pk_2]; }).filter(function (data) { return data != null; });
mainId = Array.from(new Set(pkId)).join(',') || [];
if (!mainId.length)
throw new Error("can't relationship without primary or foreign key");
local = this.HELPER.columnRelation(this.constructor.name);
modelOther = new dataRelation.model();
other_1 = this._classToTableName(modelOther.constructor.name, true);
pivotTable = (_c = dataRelation.freezeTable) !== null && _c !== void 0 ? _c : local + "_" + other_1;
pk_2 = 'id';
fk_1 = this._isPatternSnakeCase() ? local + "_id" : local + "Id";
otherPk_1 = 'id';
otherFk_1 = this._isPatternSnakeCase() ? other_1 + "_id" : other_1 + "Id";
sqlSubs = this.CONSTANT.SELECT + " * " + this.CONSTANT.FROM + " " + pivotTable + " " + this.CONSTANT.WHERE + " " + fk_1 + " " + this.CONSTANT.IN + " (" + mainId + ")";
return [4 /*yield*/, this.queryStatement(sqlSubs)];
case 1:
subs_2 = _e.sent();
otherId = subs_2.map(function (sub) { return sub[otherFk_1]; }).filter(function (data) { return data != null; });
otherArrId = Array.from(new Set(otherId)) || [];
return [4 /*yield*/, modelOther.select(select).whereIn(otherPk_1, otherArrId).get({ debug: this.DEBUG })];
case 2:
otherSubs_1 = _e.sent();
subs_2.forEach(function (sub) {
sub[other_1] = [];
otherSubs_1.forEach(function (otherSub) {
if (otherSub[otherPk_1] === sub[otherFk_1]) {
sub[other_1] = otherSub;
}
});
});
if (!(dataRelation === null || dataRelation === void 0 ? void 0 : dataRelation.child)) return [3 /*break*/, 4];
return [4 /*yield*/, this._relationChildBelongsToMany(subs_2, dataRelation.child, other_1)];
case 3:
subs_2 = _e.sent();
_e.label = 4;
case 4:
mains.forEach(function (main) {
if (main[name_1] == null)
main[name_1] = [];
subs_2.forEach(function (sub) {
if (sub[fk_1] === main[pk_2]) {
main[name_1].push(sub);
}
});
});
if (this.HIDDEN.length)
this._hiddenColumnModel(mains);
return [2 /*return*/, mains];
case 5:
err_6 = _e.sent();
_e.label = 6;
case 6:
_e.trys.push([6, 11, , 12]);
_b = this._valueInRelation(dataRelation), name_2 = _b.name, pk_3 = _b.pk, fk_2 = _b.fk, select = _b.select;
pkId = mains.map(function (main) { return main[pk_3]; }).filter(function (data) { return data != null; });
mainId = Array.from(new Set(pkId)).join(',') || [];
if (!mainId.length)
throw new Error("can't relationship without primary or foreign key");
local = this.HELPER.columnRelation(this.constructor.name);
modelOther = new dataRelation.model();
other_2 = modelOther.constructor.name.toLocaleLowerCase();
pivotTable = (_d = dataRelation.freezeTable) !== null && _d !== void 0 ? _d : other_2 + "_" + local;
pk_3 = 'id';
fk_2 = this._isPatternSnakeCase() ? local + "_id" : local + "Id";
otherPk_2 = 'id';
otherFk_2 = this._isPatternSnakeCase() ? other_2 + "_id" : other_2 + "Id";
sqlSubs = this.CONSTANT.SELECT + " * " + this.CONSTANT.FROM + " " + pivotTable + " " + this.CONSTANT.WHERE + " " + fk_2 + " " + this.CONSTANT.IN + " (" + mainId + ")";
return [4 /*yield*/, this.queryStatement(sqlSubs)];
case 7:
subs_3 = _e.sent();
otherId = subs_3.map(function (sub) { return sub[otherFk_2]; }).filter(function (data) { return data != null; });
otherArrId = Array.from(new Set(otherId)) || [];
return [4 /*yield*/, modelOther
.select(select)
.whereIn(otherPk_2, otherArrId)
.get({ debug: this.DEBUG })];
case 8:
otherSubs_2 = _e.sent();
subs_3.forEach(function (sub) {
otherSubs_2.forEach(function (otherSub) {
if (otherSub[otherPk_2] === sub[otherFk_2]) {
sub[other_2] = otherSub;
}
});
});
if (!(dataRelation === null || dataRelation === void 0 ? void 0 : dataRelation.child)) return [3 /*break*/, 10];
return [4 /*yield*/, this._relationChildBelongsToMany(subs_3, dataRelation.child, other_2)];
case 9:
subs_3 = _e.sent();
_e.label = 10;
case 10:
mains.forEach(function (main) {
if (main[name_2] == null)
main[name_2] = [];
subs_3.forEach(function (sub) {
if (sub[fk_2] === main[pk_3]) {
main[name_2].push(sub);
}
});
});
if (this.HIDDEN.length)
this._hiddenColumnModel(mains);
return [2 /*return*/, this._returnResult(type, mains)];
case 11:
err_7 = _e.sent();
throw new Error(err_7.message);
case 12: return [3 /*break*/, 13];
case 13: return [2 /*return*/];
}
});
}); };
_this._pagination = function (data) { return __awaiter(_this, void 0, void 0, function () {
var currentPage, sql, res, total, limit, lastPage, err_8;
var _a;
return __generator(this, function (_b) {
switch (_b.label) {
case 0:
_b.trys.push([0, 2, , 3]);
currentPage = this.PAGE;
this.select(this.CONSTANT.COUNT + "(*) " + this.CONSTANT.AS + " total");
sql = this._getSQLModel();
return [4 /*yield*/, this.queryStatement(sql)];
case 1:
res = _b.sent();
total = res.shift().total || 0;
limit = this.PERPAGE;
lastPage = Math.ceil(total / limit) || 0;
lastPage = lastPage > 1 ? lastPage : 1;
return [2 /*return*/, this._resultPattern({
currentPage: currentPage,
lastPage: lastPage,
total: total,
limit: limit,
totalPage: (_a = data === null || data === void 0 ? void 0 : data.length) !== null && _a !== void 0 ? _a : 0,
data: data
})];
case 2:
err_8 = _b.sent();
throw new Error(err_8.message);
case 3: return [2 /*return*/];
}
});
}); };
_this._returnEmpty = function (type, data) {
var emptyData = null;
switch (type) {
case 'FIRST': {
emptyData = null;
break;
}
case 'GET': {
emptyData = [];
break;
}
case 'PAGINATION': {
emptyData = {
current_page: _this.PAGE,
last_page: 0,
total: 0,
limit: _this.PERPAGE,
data: []
};
break;
}
default: {
throw new Error('Missing method first get or pagination');
}
}
return _this._resultPattern(emptyData);
};
_this._returnResult = function (type, data) {
var _a;
if ((_a = Object.keys(_this.REGISTRY)) === null || _a === void 0 ? void 0 : _a.length) {
data === null || data === void 0 ? void 0 : data.forEach(function (d) {
for (var name in _this.REGISTRY) {
d[name] = _this.REGISTRY[name];
}
});
}
if (_this.ONLY.length) {
data = _this._showOnly(data);
}
switch (type) {
case 'FIRST': {
if (_this.PLUCK) {
var newData = data.shift();
var checkProperty = newData.hasOwnProperty(_this.PLUCK);
if (!checkProperty)
throw new Error("can't find property '" + _this.PLUCK + "' of result");
return _this._resultPattern(newData[_this.PLUCK]);
}
return _this._resultPattern(data.shift());
}
case 'GET': {
if (_this.PLUCK) {
var newData = data.map(function (d) { return d[_this.PLUCK]; });
if (newData.every(function (d) { return d == null; }))
throw new Error("can't find property '" + _this.PLUCK + "' of result");
return _this._resultPattern(newData);
}
return _this._resultPattern(data);
}
case 'PAGINATION': {
return _this._pagination(data);
}
default: {
throw new Error('Missing method first get or pagination');
}
}
};
_this._hiddenColumnModel = function (object) {
var hidden = _this.HIDDEN;
if (object.length) {
hidden.forEach(function (column) {
object.forEach(function (objColumn) {
delete objColumn[column];
});
});
}
return object;
};
_this._attach = function (name, dataId, fields) { return __awaiter(_this, void 0, void 0, function () {
var relation, thisTable, relationTable, result, pivotTable, success, e_1, errorTable, search, pivotTable, success, e_2;
var _this = this;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
if (!Array.isArray(dataId))
throw new Error("this " + dataId + " is not an array");
relation = this.RELATION.find(function (data) { return data.name === name; });
if (!relation)
throw new Error("unknow name relation [" + name + "] in model");
thisTable = this.HELPER.columnRelation(this.constructor.name);
relationTable = this._classToTableName(relation.model.name, true);
result = this.RESULT;
_a.label = 1;
case 1:
_a.trys.push([1, 3, , 8]);
pivotTable = thisTable + "_" + relationTable;
return [4 /*yield*/, new DB_1.default().table(pivotTable).createMultiple(dataId.map(function (id) {
var _a;
return __assign((_a = {}, _a[_this._isPatternSnakeCase() ? relationTable + "_id" : relationTable + "Id"] = id, _a[_this._isPatternSnakeCase() ? thisTable + "_id" : thisTable + "Id"] = result.id, _a), fields);
})).save()];
case 2:
success = _a.sent();
return [2 /*return*/, success];
case 3:
e_1 = _a.sent();
errorTable = e_1.message;
search = errorTable.search("ER_NO_SUCH_TABLE");
if (!!search)
throw new Error(e_1.message);
_a.label = 4;
case 4:
_a.trys.push([4, 6, , 7]);
pivotTable = relationTable + "_" + thisTable;
return [4 /*yield*/, new DB_1.default().table(pivotTable).createMultiple(dataId.map(function (id) {
var _a;
return __assign((_a = {}, _a[_this._isPatternSnakeCase() ? relationTable + "_id" : relationTable + "Id"] = id, _a[_this._isPatternSnakeCase() ? thisTable + "_id" : thisTable + "Id"] = result.id, _a), fields);
})).save()];
case 5:
success = _a.sent();
return [2 /*return*/, success];
case 6:
e_2 = _a.sent();
throw new Error(e_2.message);
case 7: return [3 /*break*/, 8];
case 8: return [2 /*return*/];
}
});
}); };
_this._detach = function (name, dataId) { return __awaiter(_this, void 0, void 0, function () {
var relation, thisTable, relationTable, result, pivotTable, _i, dataId_1, id, e_3, errorTable, search, pivotTable, _a, dataId_2, id, e_4;
return __generator(this, function (_b) {
switch (_b.label) {
case 0:
if (!Array.isArray(dataId))
throw new Error("this " + dataId + " is not an array");
relation = this.RELATION.find(function (data) { return data.name === name; });
if (!relation)
throw new Error("unknow name relation [" + name + "] in model");
thisTable = this.HELPER.columnRelation(this.constructor.name);
relationTable = this._classToTableName(relation.model.name, true);
result = this.RESULT;
_b.label = 1;
case 1:
_b.trys.push([1, 6, , 14]);
pivotTable = thisTable + "_" + relationTable;
_i = 0, dataId_1 = dataId;
_b.label = 2;
case 2:
if (!(_i < dataId_1.length)) return [3 /*break*/, 5];
id = dataId_1[_i];
return [4 /*yield*/, new DB_1.default().table(pivotTable)
.where(this._isPatternSnakeCase() ? relationTable + "_id" : relationTable + "Id", id)
.where(this._isPatternSnakeCase() ? thisTable + "_id" : thisTable + "Id", result.id)
.delete()];
case 3:
_b.sent();
_b.label = 4;
case 4:
_i++;
return [3 /*break*/, 2];
case 5: return [2 /*return*/, true];
case 6:
e_3 = _b.sent();
errorTable = e_3.message;
search = errorTable.search("ER_NO_SUCH_TABLE");
if (!!search)
throw new Error(e_3.message);
_b.label = 7;
case 7:
_b.trys.push([7, 12, , 13]);
pivotTable = relationTable + "_" + thisTable;
_a = 0, dataId_2 = dataId;
_b.label = 8;
case 8:
if (!(_a < dataId_2.length)) return [3 /*break*/, 11];
id = dataId_2[_a];
return [4 /*yield*/, new DB_1.default().table(pivotTable)
.where(this._isPatternSnakeCase() ? relationTable + "_id" : relationTable + "Id", id)
.where(this._isPatternSnakeCase() ? thisTable + "_id" : thisTable + "Id", result.id)
.delete()];
case 9:
_b.sent();
_b.label = 10;
case 10:
_a++;
return [3 /*break*/, 8];
case 11: return [2 /*return*/, true];
case 12:
e_4 = _b.sent();
throw new Error(e_4.message);
case 13: return [3 /*break*/, 14];
case 14: return [2 /*return*/];
}
});
}); };
_this._tableName();
return _this;
}
Model.prototype.useRegistry = function () {
this.REGISTRY = __assign(__assign({}, this.REGISTRY), { attach: this._attach, detach: this._detach });
return this;
};
Model.prototype.useUUID = function (custom) {
if (custom === void 0) { custom = 'uuid'; }
this.UUID = true;
this.UUID_CUSTOM = custom;
return this;
};
Model.prototype.useDebug = function () {
this.DEBUG = true;
return this;
};
Model.prototype.useDefaultScope = function (defalutScope) {
this.DEFAULT_SCOPE = defalutScope;
return this;
};
Model.prototype.useResultSnakeCase = function () {
this.RESULT_PATTERN = this.CONSTANT.PATTERN.