(async() => { const Sequelize = require("sequelize"); const sequelize = new Sequelize("test", "","",{ host: 'localhost', dialect: 'mysql', pool: { max: 5, min: 0, idle: 10000 }, //logging: false }); const Slice = sequelize.define("slice",{ permission: Sequelize.STRING, //create, update, delete, read, etc model: Sequelize.STRING, modelId: Sequelize.INTEGER, //plain list of: "tags" like: admin, manager, user, anon, User can be tagged by this word in string list variable //OR: just userId. //OR, if negative number (or hash #100500) - other slice id (use abs to get proper table id) //this way optimizing slice: {type: Sequelize.TEXT, //PROBABLY STRING get(){ return this.getDataValue("slice").split(",") }, set(newValue){ newValue = "length" in newValue ? newValue.join(",") : newValue return this.setDataValue("slice", newValue) } } },{ getterMethods: { async all(){ const Op = Sequelize.Op this._subSlicesList = this.slice.filter(id => id[0] == "#" || id[0] == "-") //detect - or # .map( id => +id.substr(1)) //cut first char + toInt let subSlices = await Slice.find({where: {id: {[Op.in]: this._subSlicesList}}}) for (let subSlice of subSlices){ this._subSlicesList = this._subSlicesList.filter(id => subSlice.id !== id) this._subSlicesList = [...this._subSlicesList,... await subSlice.all()] } return this._subSlicesList } }, indexes: [ { fields: ["modelId", "model", "permission"] }, ] }) const User = sequelize.define("user", { login: Sequelize.STRING, password: Sequelize.STRING, }) const Content = sequelize.define("content", { title: Sequelize.STRING, data: Sequelize.TEXT }) await sequelize.sync() function sliced(model){ } let delay = ms => new Promise(r => setTimeout(r, ms)) })()