UNPKG

tspace-sql

Version:

mysql & postgresql query builder object relational mapping

902 lines 90 kB
"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.