diff --git a/packages/core/database/lib/entity-manager/__tests__/relations-orderer.test.js b/packages/core/database/lib/entity-manager/__tests__/relations-orderer.test.js new file mode 100644 index 0000000000..f28c63ffa1 --- /dev/null +++ b/packages/core/database/lib/entity-manager/__tests__/relations-orderer.test.js @@ -0,0 +1,68 @@ +'use strict'; + +const RelationsOrderer = require('../relations-orderer'); + +describe('relations orderer', () => { + test('connect at the end', () => { + const orderer = new RelationsOrderer( + [ + { id: 2, order: 4 }, + { id: 3, order: 10 }, + ], + 'id', + 'order' + ); + + orderer.connect([{ id: 4, position: { end: true } }, { id: 5 }]); + + expect(orderer.arr).toMatchObject([ + { id: 2, order: 4 }, + { id: 3, order: 10 }, + { id: 4, order: 10.5 }, + { id: 5, order: 10.5 }, + ]); + }); + + test('connect at the start', () => { + const orderer = new RelationsOrderer( + [ + { id: 2, order: 4 }, + { id: 3, order: 10 }, + ], + 'id', + 'order' + ); + + orderer.connect([{ id: 4, position: { start: true } }]); + + expect(orderer.arr).toMatchObject([ + { id: 4, order: 0.5 }, + { id: 2, order: 4 }, + { id: 3, order: 10 }, + ]); + }); + + test('connect multiple relations', () => { + const orderer = new RelationsOrderer( + [ + { id: 2, order: 4 }, + { id: 3, order: 10 }, + ], + 'id', + 'order' + ); + + orderer.connect([ + { id: 4, position: { before: 2 } }, + { id: 4, position: { before: 3 } }, + { id: 5, position: { before: 4 } }, + ]); + + expect(orderer.arr).toMatchObject([ + { id: 2, order: 4 }, + { id: 5, order: 9.5 }, + { id: 4, order: 9.5 }, + { id: 3, order: 10 }, + ]); + }); +}); diff --git a/packages/core/database/lib/entity-manager/index.js b/packages/core/database/lib/entity-manager/index.js index 216e08e987..0dc8b58115 100644 --- a/packages/core/database/lib/entity-manager/index.js +++ b/packages/core/database/lib/entity-manager/index.js @@ -38,7 +38,7 @@ const { deleteRelations, cleanOrderColumns, } = require('./regular-relations'); -const FractionalOrderer = require('./relationsOrderer'); +const FractionalOrderer = require('./relations-orderer'); const toId = (value) => value.id || value; const toIds = (value) => castArray(value || []).map(toId); diff --git a/packages/core/database/lib/entity-manager/relationsOrderer.js b/packages/core/database/lib/entity-manager/relations-orderer.js similarity index 90% rename from packages/core/database/lib/entity-manager/relationsOrderer.js rename to packages/core/database/lib/entity-manager/relations-orderer.js index 591f7a9f07..3a4210c9da 100644 --- a/packages/core/database/lib/entity-manager/relationsOrderer.js +++ b/packages/core/database/lib/entity-manager/relations-orderer.js @@ -29,11 +29,11 @@ const _ = require('lodash/fp'); * in the positional attributes & the last relation in the database. * */ -class FractionalOrderer { +class RelationsOrderer { /** - * @param {*} initArr - array of relations to initialize the class with - * @param {*} idColumn - the column name of the id - * @param {*} orderColumn - the column name of the order + * @param {Array<*>} initArr - array of relations to initialize the class with + * @param {string} idColumn - the column name of the id + * @param {string} orderColumn - the column name of the order */ constructor(initArr, idColumn, orderColumn) { this.arr = _.castArray(initArr || []).map((r) => ({ @@ -45,17 +45,17 @@ class FractionalOrderer { _updateRelationOrder(r) { let idx; - if (r.position.before) { + if (r.position?.before) { const { idx: _idx, relation } = this.findRelation(r.position.before); if (relation.init) r.order = relation.order - 0.5; else r.order = relation.order; idx = _idx; - } else if (r.position.after) { + } else if (r.position?.after) { const { idx: _idx, relation } = this.findRelation(r.position.after); if (relation.init) r.order = relation.order + 0.5; else r.order = relation.order; idx = _idx + 1; - } else if (r.position.start) { + } else if (r.position?.start) { r.order = 0.5; idx = 0; } else { @@ -120,4 +120,4 @@ class FractionalOrderer { } } -module.exports = FractionalOrderer; +module.exports = RelationsOrderer;