import {call, put, select} from "redux-saga/effects"; import {addToStore} from "../actions/objects"; import {getDatacenter, getRoomsOfDatacenter} from "../api/routes/datacenters"; import {getPath, getSectionsOfPath} from "../api/routes/paths"; import {getTilesOfRoom} from "../api/routes/rooms"; import {getSection} from "../api/routes/sections"; import {getPathsOfSimulation, getSimulation} from "../api/routes/simulations"; import { getCoolingItem, getCPU, getFailureModel, getGPU, getMemory, getPSU, getStorage } from "../api/routes/specifications"; import {getMachinesOfRackByTile, getRackByTile} from "../api/routes/tiles"; import {getUser} from "../api/routes/users"; export const OBJECT_SELECTORS = { simulation: state => state.objects.simulation, user: state => state.objects.user, authorization: state => state.objects.authorization, failureModel: state => state.objects.failureModel, cpu: state => state.objects.cpu, gpu: state => state.objects.gpu, memory: state => state.objects.memory, storage: state => state.objects.storage, machine: state => state.objects.machine, rack: state => state.objects.rack, coolingItem: state => state.objects.coolingItem, psu: state => state.objects.psu, tile: state => state.objects.tile, room: state => state.objects.room, datacenter: state => state.objects.datacenter, section: state => state.objects.section, path: state => state.objects.path, }; function* fetchAndStoreObject(objectType, id, apiCall) { const objectStore = yield select(OBJECT_SELECTORS[objectType]); let object = objectStore[id]; if (!object) { object = yield apiCall; yield put(addToStore(objectType, object)); } return object; } function* fetchAndStoreObjects(objectType, apiCall) { const objects = yield apiCall; for (let index in objects) { yield put(addToStore(objectType, objects[index])); } return objects; } export const fetchAndStoreSimulation = (id) => fetchAndStoreObject("simulation", id, call(getSimulation, id)); export const fetchAndStoreUser = (id) => fetchAndStoreObject("user", id, call(getUser, id)); export const fetchAndStoreFailureModel = (id) => fetchAndStoreObject("failureModel", id, call(getFailureModel, id)); export const fetchAndStoreCPU = (id) => fetchAndStoreObject("cpu", id, call(getCPU, id)); export const fetchAndStoreGPU = (id) => fetchAndStoreObject("gpu", id, call(getGPU, id)); export const fetchAndStoreMemory = (id) => fetchAndStoreObject("memory", id, call(getMemory, id)); export const fetchAndStoreStorage = (id) => fetchAndStoreObject("storage", id, call(getStorage, id)); export const fetchAndStoreMachinesOfTile = (tileId) => fetchAndStoreObjects("machine", call(getMachinesOfRackByTile, tileId)); export const fetchAndStoreRackOnTile = (id, tileId) => fetchAndStoreObject("rack", id, call(getRackByTile, tileId)); export const fetchAndStoreCoolingItem = (id) => fetchAndStoreObject("coolingItem", id, call(getCoolingItem, id)); export const fetchAndStorePSU = (id) => fetchAndStoreObject("psu", id, call(getPSU, id)); export const fetchAndStoreTilesOfRoom = (roomId) => fetchAndStoreObjects("tile", call(getTilesOfRoom, roomId)); export const fetchAndStoreRoomsOfDatacenter = (datacenterId) => fetchAndStoreObjects("room", call(getRoomsOfDatacenter, datacenterId)); export const fetchAndStoreDatacenter = (id) => fetchAndStoreObject("datacenter", id, call(getDatacenter, id)); export const fetchAndStoreSection = (id) => fetchAndStoreObject("section", id, call(getSection, id)); export const fetchAndStoreSectionsOfPath = (pathId) => fetchAndStoreObjects("section", call(getSectionsOfPath, pathId)); export const fetchAndStorePath = (id) => fetchAndStoreObject("path", id, call(getPath, id)); export const fetchAndStorePathsOfSimulation = (simulationId) => fetchAndStoreObjects("path", call(getPathsOfSimulation, simulationId));