Duplicating library nodes now duplicates up to 50 descendants
This commit is contained in:
@@ -1,4 +1,4 @@
|
|||||||
import '//imports/api/creature/creatureProperties/methods/adjustQuantity.js';
|
import '/imports/api/creature/creatureProperties/methods/adjustQuantity.js';
|
||||||
import '/imports/api/creature/creatureProperties/methods/damagePropertiesByName.js';
|
import '/imports/api/creature/creatureProperties/methods/damagePropertiesByName.js';
|
||||||
import '/imports/api/creature/creatureProperties/methods/damageProperty.js';
|
import '/imports/api/creature/creatureProperties/methods/damageProperty.js';
|
||||||
import '/imports/api/creature/creatureProperties/methods/dealDamage.js';
|
import '/imports/api/creature/creatureProperties/methods/dealDamage.js';
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import { assertEditPermission } from '/imports/api/sharing/sharingPermissions.js
|
|||||||
import { softRemove } from '/imports/api/parenting/softRemove.js';
|
import { softRemove } from '/imports/api/parenting/softRemove.js';
|
||||||
import SoftRemovableSchema from '/imports/api/parenting/SoftRemovableSchema.js';
|
import SoftRemovableSchema from '/imports/api/parenting/SoftRemovableSchema.js';
|
||||||
import { storedIconsSchema } from '/imports/api/icons/Icons.js';
|
import { storedIconsSchema } from '/imports/api/icons/Icons.js';
|
||||||
|
import '/imports/api/library/methods/index.js';
|
||||||
|
|
||||||
let LibraryNodes = new Mongo.Collection('libraryNodes');
|
let LibraryNodes = new Mongo.Collection('libraryNodes');
|
||||||
|
|
||||||
@@ -79,27 +80,6 @@ const insertNode = new ValidatedMethod({
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
const duplicateNode = new ValidatedMethod({
|
|
||||||
name: 'libraryNodes.duplicate',
|
|
||||||
validate: new SimpleSchema({
|
|
||||||
_id: {
|
|
||||||
type: String,
|
|
||||||
regEx: SimpleSchema.RegEx.Id,
|
|
||||||
}
|
|
||||||
}).validator(),
|
|
||||||
mixins: [RateLimiterMixin],
|
|
||||||
rateLimit: {
|
|
||||||
numRequests: 5,
|
|
||||||
timeInterval: 5000,
|
|
||||||
},
|
|
||||||
run({_id}) {
|
|
||||||
let libraryNode = LibraryNodes.findOne(_id);
|
|
||||||
assertNodeEditPermission(libraryNode, this.userId);
|
|
||||||
delete libraryNode._id;
|
|
||||||
return LibraryNodes.insert(libraryNode);
|
|
||||||
},
|
|
||||||
})
|
|
||||||
|
|
||||||
const updateLibraryNode = new ValidatedMethod({
|
const updateLibraryNode = new ValidatedMethod({
|
||||||
name: 'libraryNodes.update',
|
name: 'libraryNodes.update',
|
||||||
validate({_id, path}){
|
validate({_id, path}){
|
||||||
@@ -195,7 +175,6 @@ export default LibraryNodes;
|
|||||||
export {
|
export {
|
||||||
LibraryNodeSchema,
|
LibraryNodeSchema,
|
||||||
insertNode,
|
insertNode,
|
||||||
duplicateNode,
|
|
||||||
updateLibraryNode,
|
updateLibraryNode,
|
||||||
pullFromLibraryNode,
|
pullFromLibraryNode,
|
||||||
pushToLibraryNode,
|
pushToLibraryNode,
|
||||||
|
|||||||
85
app/imports/api/library/methods/duplicateLibraryNode.js
Normal file
85
app/imports/api/library/methods/duplicateLibraryNode.js
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
import { ValidatedMethod } from 'meteor/mdg:validated-method';
|
||||||
|
import SimpleSchema from 'simpl-schema';
|
||||||
|
import { RateLimiterMixin } from 'ddp-rate-limiter-mixin';
|
||||||
|
import LibraryNodes from '/imports/api/library/LibraryNodes.js';
|
||||||
|
import { assertDocEditPermission } from '/imports/api/sharing/sharingPermissions.js';
|
||||||
|
import {
|
||||||
|
setLineageOfDocs,
|
||||||
|
renewDocIds
|
||||||
|
} from '/imports/api/parenting/parenting.js';
|
||||||
|
import { reorderDocs } from '/imports/api/parenting/order.js';
|
||||||
|
|
||||||
|
var snackbar;
|
||||||
|
if (Meteor.isClient){
|
||||||
|
snackbar = require(
|
||||||
|
'/imports/ui/components/snackbars/SnackbarQueue.js'
|
||||||
|
).snackbar
|
||||||
|
}
|
||||||
|
|
||||||
|
const DUPLICATE_CHILDREN_LIMIT = 50;
|
||||||
|
|
||||||
|
const duplicateLibraryNode = new ValidatedMethod({
|
||||||
|
name: 'libraryNodes.duplicate',
|
||||||
|
validate: new SimpleSchema({
|
||||||
|
_id: {
|
||||||
|
type: String,
|
||||||
|
regEx: SimpleSchema.RegEx.Id,
|
||||||
|
}
|
||||||
|
}).validator(),
|
||||||
|
mixins: [RateLimiterMixin],
|
||||||
|
rateLimit: {
|
||||||
|
numRequests: 5,
|
||||||
|
timeInterval: 5000,
|
||||||
|
},
|
||||||
|
run({_id}) {
|
||||||
|
let libraryNode = LibraryNodes.findOne(_id);
|
||||||
|
assertDocEditPermission(libraryNode, this.userId);
|
||||||
|
let libraryNodeId = Random.id();
|
||||||
|
libraryNode._id = libraryNodeId;
|
||||||
|
|
||||||
|
let nodes = LibraryNodes.find({
|
||||||
|
'ancestors.id': _id,
|
||||||
|
removed: {$ne: true},
|
||||||
|
}, {
|
||||||
|
limit: DUPLICATE_CHILDREN_LIMIT + 1,
|
||||||
|
sort: {order: 1},
|
||||||
|
}).fetch();
|
||||||
|
|
||||||
|
if (nodes.length > DUPLICATE_CHILDREN_LIMIT){
|
||||||
|
nodes.pop();
|
||||||
|
if (Meteor.isClient){
|
||||||
|
snackbar({
|
||||||
|
text: `Only the first ${DUPLICATE_CHILDREN_LIMIT} children were duplicated`,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// re-map all the ancestors
|
||||||
|
setLineageOfDocs({
|
||||||
|
docArray: nodes,
|
||||||
|
newAncestry : [
|
||||||
|
...libraryNode.ancestors,
|
||||||
|
{id: libraryNodeId, collection: 'libraryNodes'}
|
||||||
|
],
|
||||||
|
oldParent : {id: _id, collection: 'libraryNodes'},
|
||||||
|
});
|
||||||
|
|
||||||
|
// Give the docs new IDs without breaking internal references
|
||||||
|
renewDocIds({docArray: nodes});
|
||||||
|
|
||||||
|
// Order the root node
|
||||||
|
libraryNode.order += 0.5;
|
||||||
|
|
||||||
|
LibraryNodes.batchInsert([libraryNode, ...nodes]);
|
||||||
|
|
||||||
|
// Tree structure changed by inserts, reorder the tree
|
||||||
|
reorderDocs({
|
||||||
|
collection: LibraryNodes,
|
||||||
|
ancestorId: libraryNode.ancestors[0].id,
|
||||||
|
});
|
||||||
|
|
||||||
|
return libraryNodeId;
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
export default duplicateLibraryNode;
|
||||||
1
app/imports/api/library/methods/index.js
Normal file
1
app/imports/api/library/methods/index.js
Normal file
@@ -0,0 +1 @@
|
|||||||
|
import '/imports/api/library/methods/duplicateLibraryNode.js';
|
||||||
Reference in New Issue
Block a user