UNPKG

react-cms

Version:

For personal use. Not production.

427 lines (254 loc) 6.32 kB
import { ObjectsListType, } from 'react-cms/src/app/components/ORM/fields'; export const objectResolver = (ofType, source, args, context, info, getResolverByType) => { let { fieldName, operation, } = info; // Если это не корневой вызов, сбрасываем операцию, чтобы сквозной вызов не выполнялся if(source){ operation = undefined; } let result = getObject(ofType, source, args, context, info, getResolverByType); if(operation && operation.name){ switch(operation.name.value){ } } return result; } export const getObjectsList = (ofType, source, args, context, info, getResolverByType) => { let result; let { fieldName, } = info; const resolver = getResolverByType(ofType); if(resolver){ return ObjectsListResolver(resolver, source, args, context, info); } } export const getObjects = (ofType, source, args, context, info, getResolverByType) => { let result; result = getObjectsList(ofType, source, args, context, info, getResolverByType) // .then(r => { // result = r; // }); if(result){ if(result instanceof Promise){ return new Promise((resolve, reject) => { result .then(r => { resolve(r && r.object); }) .catch(e => { reject(e); }); }); } result = result && result.object; } return result; } export const getObject = (ofType, source, args, context, info, getResolverByType) => { let state; // const { // id, // parent, // } = args; state = getObjects(ofType, source, args, context, info, getResolverByType) if(state){ if(state instanceof Promise){ return new Promise((resolve, reject) => { state .then(r => { resolve(processObjectState(r, args)); }) .catch(e => { reject(e); }); }); } state = processObjectState(state, args); } return state; } export const processObjectState = function (state, args){ if(state){ const { id, parent, } = args; if(id !== undefined){ state = state.filter(n => n.id === id); } if(parent !== undefined){ state = state.filter(n => n.parent === parent); } state = state && state.get(0); } return state; } export const ObjectsListResolver = (resolver, object, args, context, info) => { if(!resolver){ console.error("resolver is undefined", info); // return reject("resolver is undefined"); throw(new Error("resolver is undefined")); } let state = resolver(object, args, context, info); // if(state){ // let { // ids, // parent, // offset, // limit, // sort, // page, // } = args; // page = page || 1; // const total = state.size; // state = storeResolver(state, args, context, info); // return state && { // success: true, // message: '', // count: state.size, // total, // limit, // page, // object: state, // } || null; // } // return state; return ObjectsListResolverProcessResult(state, args, context, info); } const ObjectsListResolverProcessResult = function(state, args, context, info){ if(state){ if(state instanceof Promise){ return new Promise((resolve, reject) => { state .then(r => resolve(ObjectsListResolverProcessResult(r, args, context, info))) .catch(e => { reject(e) }); }); } else{ let { ids, parent, offset, limit, sort, page, } = args; page = page || 1; const total = state.size; state = storeResolver(state, args, context, info); return state && { success: true, message: '', count: state.size, total, limit, page, object: state, } || null; } } return state; } export const storeResolver = function(state, args, context, info){ if(state){ if(state instanceof Promise){ return new Promise((resolve, reject) => { state.then(r => { if(r){ r = processState(r, args, context, info); } resolve(r); }) .catch(e => reject(e)); }); } else{ state = processState(state, args, context, info); } } return state; } export const processState = function(state, args, context, info){ let { id, ids, excludeIds, parent, offset, limit, sort, page, } = args; page = page || 1; if(id){ state = state.filter(n => n.id === id); } if(ids){ state = state.filter(n => ids.indexOf(n.id) !== -1); } if(excludeIds){ excludeIds.map(id => { state = state.filter(n => n.id !== id); }) } if(parent){ state = state.filter(n => n.parent === parent); } if(sort){ sort.map(rule => { const { by, dir, } = rule; if(!by){ return; } let sortByRules; switch(by){ case 'id': sortByRules = n => n.id; break; case 'rand()': sortByRules = n => Math.random(); break; } if(sortByRules){ state = sortBy(state, sortByRules, dir); }; }); } if(offset){ state = state.skip(offset); } if(limit){ if(page > 1){ state = state.skip(limit * (page - 1)); } state = state.take(limit); } return state; } export const sortBy = function(state, by, dir){ dir = dir || 'asc'; return state.sortBy(by, (a, b) => { a = a && a.toLocaleUpperCase && a.toLocaleUpperCase() || a; b = b && b.toLocaleUpperCase && b.toLocaleUpperCase() || b; if(dir == 'asc'){ if ( a > b ) return 1; if (a < b ) return -1; return 0; } else{ if ( a < b ) return 1; if (a > b ) return -1; return 0; } }); }