Optimizations in how mixins are composed. The refresh should now be up to 2x faster for deeper hierarchies.
		
			
				
	
	
		
			58 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			58 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 'use strict';
 | |
| 
 | |
| const knex = require('./knex');
 | |
| const interoperableErrors = require('../../shared/interoperable-errors');
 | |
| const entitySettings = require('./entity-settings');
 | |
| const shares = require('../models/shares');
 | |
| 
 | |
| const defaultNoOfDependenciesReported = 20;
 | |
| 
 | |
| async function ensureNoDependencies(tx, context, id, depSpecs) {
 | |
| 
 | |
|     const deps = [];
 | |
|     let andMore = false;
 | |
| 
 | |
|     for (const depSpec of depSpecs) {
 | |
|         const entityType = entitySettings.getEntityType(depSpec.entityTypeId);
 | |
| 
 | |
|         let rows;
 | |
| 
 | |
|         if (depSpec.query) {
 | |
|             rows = await depSpec.query(tx).limit(defaultNoOfDependenciesReported + 1);
 | |
|         } else if (depSpec.column) {
 | |
|             rows = await tx(entityType.entitiesTable).where(depSpec.column, id).forShare().select(['id', 'name']).limit(defaultNoOfDependenciesReported + 1);
 | |
|         } else if (depSpec.rows) {
 | |
|             rows = await depSpec.rows(tx, defaultNoOfDependenciesReported + 1)
 | |
|         }
 | |
| 
 | |
|         for (const row of rows) {
 | |
|             if (deps.length === defaultNoOfDependenciesReported) {
 | |
|                 andMore = true;
 | |
|                 break;
 | |
|             }
 | |
| 
 | |
|             if (depSpec.viewPermission && await shares.checkEntityPermissionTx(tx, context, depSpec.viewPermission.entityTypeId, depSpec.viewPermission.entityId, depSpec.viewPermission.requiredOperations)) {
 | |
|                 deps.push({
 | |
|                     entityTypeId: depSpec.entityTypeId,
 | |
|                     name: row.name,
 | |
|                     link: entityType.clientLink(row.id)
 | |
|                 });
 | |
|             } else if (!depSpec.viewPermission && await shares.checkEntityPermissionTx(tx, context, depSpec.entityTypeId, row.id, 'view')) {
 | |
|                 deps.push({
 | |
|                     entityTypeId: depSpec.entityTypeId,
 | |
|                     name: row.name,
 | |
|                     link: entityType.clientLink(row.id)
 | |
|                 });
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     if (deps.length > 0) {
 | |
|         throw new interoperableErrors.DependencyPresentError('', {
 | |
|             dependencies: deps,
 | |
|             andMore
 | |
|         });
 | |
|     }
 | |
| }
 | |
| 
 | |
| module.exports.ensureNoDependencies = ensureNoDependencies;
 |