Vulcan/packages/vulcan-lib/lib/client/apollo-client/updates.js
2018-09-26 10:17:03 +02:00

81 lines
No EOL
1.8 KiB
JavaScript

/**
* Helpers to update watched mutations
*/
import Mingo from 'mingo';
export const WatchedMutations = {};
export const registerWatchedMutation = (mutationName, queryName, updateFunction) => {
WatchedMutations[mutationName] = {
[queryName]: updateFunction
}
}
/*
Test if a document is matched by a given selector
*/
export const belongsToSet = (document, selector) => {
const mingoQuery = new Mingo.Query(selector);
return mingoQuery.test(document)
}
/*
Test if a document is already in a result set
*/
export const isInSet = (data, document) => data.results.find(item => item._id === document._id)
/*
Add a document to a set of results
*/
export const addToSet = (queryData, document) => {
const newData = {
results: [...queryData.results, document],
totalCount: queryData.totalCount + 1
}
return newData;
};
/*
Update a document in a set of results
*/
export const updateInSet = (queryData, document) => {
const oldDocument = queryData.results.find(item => item._id === document._id);
const newDocument = { ...oldDocument, ...document };
const index = queryData.results.findIndex((item => item._id === document._id));
const newData = { results: [...queryData.results] }; // clone
newData.results[index] = newDocument;
return newData;
};
/*
Reorder results according to a sort
*/
export const reorderSet = (queryData, sort, selector) => {
const mingoQuery = new Mingo.Query(selector);
const cursor = mingoQuery.find(queryData.results);
queryData.results = cursor.sort(sort).all();
return queryData;
};
/*
Remove a document from a set
*/
export const removeFromSet = (queryData, document) => {
const newData = {
results: queryData.results.filter(item => item._id !== document._id),
totalCount: queryData.totalCount - 1
}
return newData;
}