diff options
| author | Georgios Andreadis <g.andreadis@student.tudelft.nl> | 2017-08-31 17:59:51 +0200 |
|---|---|---|
| committer | Georgios Andreadis <g.andreadis@student.tudelft.nl> | 2017-09-23 10:05:50 +0200 |
| commit | 3f736cd3db63f106eac02f220477b4a0f3b0eceb (patch) | |
| tree | 80afa73f8c4d281b2fccba8ad2baa7c10f7e7e84 /src/sagas | |
| parent | b17f1d8cb4815f57a4b7043cc91b867ec3cbc867 (diff) | |
Implement room creation
Diffstat (limited to 'src/sagas')
| -rw-r--r-- | src/sagas/index.js | 20 | ||||
| -rw-r--r-- | src/sagas/objects.js | 7 | ||||
| -rw-r--r-- | src/sagas/topology.js | 74 |
3 files changed, 89 insertions, 12 deletions
diff --git a/src/sagas/index.js b/src/sagas/index.js index c6177cd4..7c1d921f 100644 --- a/src/sagas/index.js +++ b/src/sagas/index.js @@ -1,11 +1,23 @@ import {takeEvery} from "redux-saga/effects"; import {LOG_IN} from "../actions/auth"; import {ADD_SIMULATION, DELETE_SIMULATION} from "../actions/simulations"; -import {FETCH_LATEST_DATACENTER} from "../actions/topology"; +import { + ADD_TILE, + CANCEL_NEW_ROOM_CONSTRUCTION, + DELETE_TILE, + FETCH_LATEST_DATACENTER, + START_NEW_ROOM_CONSTRUCTION +} from "../actions/topology"; import {DELETE_CURRENT_USER, FETCH_AUTHORIZATIONS_OF_CURRENT_USER} from "../actions/users"; import {onDeleteCurrentUser} from "./profile"; import {onSimulationAdd, onSimulationDelete} from "./simulations"; -import {onFetchLatestDatacenter} from "./topology"; +import { + onAddTile, + onCancelNewRoomConstruction, + onDeleteTile, + onFetchLatestDatacenter, + onStartNewRoomConstruction +} from "./topology"; import {onFetchAuthorizationsOfCurrentUser, onFetchLoggedInUser} from "./users"; export default function* rootSaga() { @@ -15,4 +27,8 @@ export default function* rootSaga() { yield takeEvery(DELETE_SIMULATION, onSimulationDelete); yield takeEvery(DELETE_CURRENT_USER, onDeleteCurrentUser); yield takeEvery(FETCH_LATEST_DATACENTER, onFetchLatestDatacenter); + yield takeEvery(START_NEW_ROOM_CONSTRUCTION, onStartNewRoomConstruction); + yield takeEvery(CANCEL_NEW_ROOM_CONSTRUCTION, onCancelNewRoomConstruction); + yield takeEvery(ADD_TILE, onAddTile); + yield takeEvery(DELETE_TILE, onDeleteTile); } diff --git a/src/sagas/objects.js b/src/sagas/objects.js index 5fac6c3e..5c9f00c2 100644 --- a/src/sagas/objects.js +++ b/src/sagas/objects.js @@ -39,11 +39,12 @@ export const OBJECT_SELECTORS = { function* fetchAndStoreObject(objectType, id, apiCall) { const objectStore = yield select(OBJECT_SELECTORS[objectType]); - if (!objectStore[id]) { - const object = yield apiCall; + let object = objectStore[id]; + if (!object) { + object = yield apiCall; yield put(addToStore(objectType, object)); } - return objectStore[id]; + return object; } function* fetchAndStoreObjects(objectType, apiCall) { diff --git a/src/sagas/topology.js b/src/sagas/topology.js index a15e6a30..815cd842 100644 --- a/src/sagas/topology.js +++ b/src/sagas/topology.js @@ -1,6 +1,15 @@ -import {put} from "redux-saga/effects"; -import {addPropToStoreObject} from "../actions/objects"; -import {fetchLatestDatacenterSucceeded} from "../actions/topology"; +import {call, put, select} from "redux-saga/effects"; +import {addPropToStoreObject, addToStore} from "../actions/objects"; +import { + addTileSucceeded, + cancelNewRoomConstructionSucceeded, + deleteTileSucceeded, + fetchLatestDatacenterSucceeded, + startNewRoomConstructionSucceeded +} from "../actions/topology"; +import {addRoomToDatacenter} from "../api/routes/datacenters"; +import {addTileToRoom, deleteRoom} from "../api/routes/rooms"; +import {deleteTile} from "../api/routes/tiles"; import { fetchAndStoreCoolingItem, fetchAndStoreDatacenter, @@ -27,11 +36,12 @@ export function* onFetchLatestDatacenter(action) { export function* fetchDatacenter(datacenterId) { try { - const datacenter = yield fetchAndStoreDatacenter(datacenterId); - datacenter.roomIds = (yield fetchAndStoreRoomsOfDatacenter(datacenterId)).map(room => room.id); + yield fetchAndStoreDatacenter(datacenterId); + const rooms = yield fetchAndStoreRoomsOfDatacenter(datacenterId); + yield put(addPropToStoreObject("datacenter", datacenterId, {roomIds: rooms.map(room => room.id)})); - for (let index in datacenter.roomIds) { - yield fetchRoom(datacenter.roomIds[index]); + for (let index in rooms) { + yield fetchRoom(rooms[index].id); } } catch (error) { console.log(error); @@ -69,3 +79,53 @@ function* fetchTile(tile) { console.warn("Unknown object type encountered while fetching tile objects"); } } + +export function* onStartNewRoomConstruction() { + try { + const datacenterId = yield select(state => state.currentDatacenterId); + const room = yield call(addRoomToDatacenter, { + id: -1, + datacenterId, + roomType: "SERVER" + }); + const roomWithEmptyTileList = Object.assign(room, {tileIds: []}); + yield put(addToStore("room", roomWithEmptyTileList)); + yield put(startNewRoomConstructionSucceeded(room.id)); + } catch (error) { + console.log(error); + } +} + +export function* onCancelNewRoomConstruction() { + try { + const roomId = yield select(state => state.currentRoomInConstruction); + yield call(deleteRoom, roomId); + yield put(cancelNewRoomConstructionSucceeded()); + } catch (error) { + console.log(error); + } +} + +export function* onAddTile(action) { + try { + const roomId = yield select(state => state.currentRoomInConstruction); + const tile = yield call(addTileToRoom, { + roomId, + positionX: action.positionX, + positionY: action.positionY + }); + yield put(addToStore("tile", tile)); + yield put(addTileSucceeded(tile.id)); + } catch (error) { + console.log(error); + } +} + +export function* onDeleteTile(action) { + try { + yield call(deleteTile, action.tileId); + yield put(deleteTileSucceeded(action.tileId)); + } catch (error) { + console.log(error); + } +} |
