UNPKG

orange-orm

Version:

Object Relational Mapper

67 lines (60 loc) 1.89 kB
async function validateDeleteAllowed({ row, options, table }) { if (options.readonly) { const e = new Error(`Cannot delete ${table._dbName} because it is readonly`); // @ts-ignore e.status = 405; throw e; } if (!hasReadonlyTrue(options)) return; for (let p in options) { if (isManyRelation(p, table)) { const childTable = table[p]._relation.childTable; const childOptions = inferOptions(options, p); if (!hasReadonlyTrue(childOptions)) continue; const children = await row[p]; for (let i = 0; i < children.length; i++) { const childRow = children[i]; await validateDeleteAllowed({ row: childRow, options: childOptions, table: childTable }); } } else if (isOneRelation(p, table)) { const childOptions = inferOptions(options, p); if (!hasReadonlyTrue(childOptions)) continue; const childTable = table[p]._relation.childTable; let childRow = await row[p]; await validateDeleteAllowed({ row: childRow, options: childOptions, table: childTable }); } } } function isManyRelation(name, table) { return table[name] && table[name]._relation && table[name]._relation.isMany; } function isOneRelation(name, table) { return table[name] && table[name]._relation && table[name]._relation.isOne; } function inferOptions(defaults, property) { const parent = {}; if ('readonly' in defaults) parent.readonly = defaults.readonly; if ('concurrency' in defaults) parent.concurrency = defaults.concurrency; return {...parent, ...(defaults[property] || {})}; } function hasReadonlyTrue(options) { if (!options || options !== Object(options)) return false; if (options.readonly === true) return true; for (let p in options) { const value = options[p]; if (!value || value !== Object(value)) continue; if (hasReadonlyTrue(value)) return true; } return false; } module.exports = validateDeleteAllowed;