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 { getAllSchedulers } from '../api/routes/schedulers' import { getSection } from '../api/routes/sections' import { getPathsOfSimulation, getSimulation } from '../api/routes/simulations' import { getAllCPUs, getAllGPUs, getAllMemories, getAllStorages, getCoolingItem, getCPU, getFailureModel, getGPU, getMemory, getPSU, getStorage, } from '../api/routes/specifications' import { getMachinesOfRackByTile, getRackByTile } from '../api/routes/tiles' import { getAllTraces } from '../api/routes/traces' 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 fetchAndStoreAllCPUs = () => fetchAndStoreObjects('cpu', call(getAllCPUs)) export const fetchAndStoreCPU = id => fetchAndStoreObject('cpu', id, call(getCPU, id)) export const fetchAndStoreAllGPUs = () => fetchAndStoreObjects('gpu', call(getAllGPUs)) export const fetchAndStoreGPU = id => fetchAndStoreObject('gpu', id, call(getGPU, id)) export const fetchAndStoreAllMemories = () => fetchAndStoreObjects('memory', call(getAllMemories)) export const fetchAndStoreMemory = id => fetchAndStoreObject('memory', id, call(getMemory, id)) export const fetchAndStoreAllStorages = () => fetchAndStoreObjects('storage', call(getAllStorages)) 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)) export const fetchAndStoreAllTraces = () => fetchAndStoreObjects('trace', call(getAllTraces)) export const fetchAndStoreAllSchedulers = function* () { const objects = yield call(getAllSchedulers) for (let index in objects) { objects[index].id = objects[index].name yield put(addToStore('scheduler', objects[index])) } return objects }