module.exports = Self => { Self.remoteMethod('toggleIsIncluded', { description: 'Toggle include to delivery', accessType: '', accepts: [{ arg: 'zoneFk', type: 'Number', required: true, }, { arg: 'geoFk', type: 'Number', required: true, }], returns: { type: 'object', root: true }, http: { path: `/toggleIsIncluded`, verb: 'POST' } }); Self.toggleIsIncluded = async(zoneFk, geoFk) => { const models = Self.app.models; const geo = await models.ZoneGeo.findById(geoFk); const isIncluded = await Self.findOne({ where: {zoneFk, geoFk} }); const hasCheckedParents = await Self.rawSql( `SELECT id FROM vn.zoneGeo zt JOIN vn.zoneIncluded zi ON zi.geoFk = zt.id WHERE zt.lft < ? AND zt.rgt > ?`, [geo.lft, geo.rgt] ); const hasCheckedChilds = await Self.rawSql( `SELECT id FROM vn.zoneGeo zt JOIN vn.zoneIncluded zi ON zi.geoFk = zt.id WHERE zt.lft > ? AND zt.rgt < ?`, [geo.lft, geo.rgt] ); const isExcluded = hasCheckedParents.length || hasCheckedChilds.length; if (isIncluded) return Self.destroyAll({zoneFk, geoFk}); else return Self.upsert({zoneFk, geoFk, isIncluded: isExcluded}); }; };