@o3r/core
Version:
Core of the Otter Framework
49 lines • 2.58 kB
JavaScript
import { asyncStoreItemAdapter, } from './async.adapter';
/**
* Create an Asynchronous Request Entity Adapter
* @param adapter Entity Adapter
*/
export function createEntityAsyncRequestAdapter(adapter) {
const addRequestOne = (state, id, requestId) => {
const currentEntity = typeof id !== 'undefined' && id !== null && state.entities[id];
if (currentEntity) {
const changes = asyncStoreItemAdapter.addRequest(asyncStoreItemAdapter.extractAsyncStoreItem(currentEntity), requestId);
return adapter.updateOne({ id, changes }, state);
}
return asyncStoreItemAdapter.addRequest(state, requestId);
};
const addRequestMany = (state, ids, requestId) => adapter.updateMany(ids.filter((id) => !!state.entities[id]).map((id) => ({
id,
changes: asyncStoreItemAdapter.addRequest(asyncStoreItemAdapter.extractAsyncStoreItem(state.entities[id]), requestId)
})), state);
const resolveRequestOne = (state, entity, requestId, idProperty = 'id') => {
const currentEntity = state.entities[entity[idProperty]];
const newEntity = currentEntity
? asyncStoreItemAdapter.resolveRequest({ ...entity, ...asyncStoreItemAdapter.extractAsyncStoreItem(currentEntity) }, requestId)
: asyncStoreItemAdapter.initialize(entity);
state = asyncStoreItemAdapter.resolveRequest(state, requestId);
return adapter.upsertOne(newEntity, state);
};
const resolveRequestMany = (state, entities, requestId, idProperty = 'id') => adapter.updateMany(entities.filter((entity) => !!state.entities[entity[idProperty]]).map((entity) => {
const model = { ...entity, ...asyncStoreItemAdapter.extractAsyncStoreItem(state.entities[entity[idProperty]]) };
return { id: entity[idProperty], changes: asyncStoreItemAdapter.resolveRequest(model, requestId) };
}), state);
const failRequestMany = (state, ids = [], requestId) => {
if (ids.length > 0 && !ids.some((id) => state.entities[id] === undefined)) {
return adapter.updateMany(ids.map((id) => ({
id,
changes: asyncStoreItemAdapter.failRequest(asyncStoreItemAdapter.extractAsyncStoreItem(state.entities[id]), requestId)
})), state);
}
return asyncStoreItemAdapter.failRequest(state, requestId);
};
return {
...adapter,
failRequestMany,
addRequestOne,
addRequestMany,
resolveRequestOne,
resolveRequestMany
};
}
//# sourceMappingURL=async-entity.adapter.js.map