summaryrefslogtreecommitdiff
path: root/frontend/src/reducers/objects.js
blob: 99d91092d4cfa0d711e49f0e28b784d927a7fca3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
import { combineReducers } from "redux";
import {
  ADD_ID_TO_STORE_OBJECT_LIST_PROP,
  ADD_PROP_TO_STORE_OBJECT,
  ADD_TO_STORE,
  REMOVE_ID_FROM_STORE_OBJECT_LIST_PROP
} from "../actions/objects";

export const objects = combineReducers({
  simulation: object("simulation"),
  user: object("user"),
  authorization: objectWithId("authorization", object => [
    object.userId,
    object.simulationId
  ]),
  failureModel: object("failureModel"),
  cpu: object("cpu"),
  gpu: object("gpu"),
  memory: object("memory"),
  storage: object("storage"),
  machine: object("machine"),
  rack: object("rack"),
  coolingItem: object("coolingItem"),
  psu: object("psu"),
  tile: object("tile"),
  room: object("room"),
  datacenter: object("datacenter"),
  section: object("section"),
  path: object("path"),
  task: object("task"),
  job: object("job"),
  trace: object("trace"),
  scheduler: object("scheduler"),
  experiment: object("experiment")
});

function object(type) {
  return objectWithId(type, object => object.id);
}

function objectWithId(type, getId) {
  return (state = {}, action) => {
    if (action.objectType !== type) {
      return state;
    }

    if (action.type === ADD_TO_STORE) {
      return Object.assign({}, state, {
        [getId(action.object)]: action.object
      });
    } else if (action.type === ADD_PROP_TO_STORE_OBJECT) {
      return Object.assign({}, state, {
        [action.objectId]: Object.assign(
          {},
          state[action.objectId],
          action.propObject
        )
      });
    } else if (action.type === ADD_ID_TO_STORE_OBJECT_LIST_PROP) {
      return Object.assign({}, state, {
        [action.objectId]: Object.assign({}, state[action.objectId], {
          [action.propName]: [
            ...state[action.objectId][action.propName],
            action.id
          ]
        })
      });
    } else if (action.type === REMOVE_ID_FROM_STORE_OBJECT_LIST_PROP) {
      return Object.assign({}, state, {
        [action.objectId]: Object.assign({}, state[action.objectId], {
          [action.propName]: state[action.objectId][action.propName].filter(
            id => id !== action.id
          )
        })
      });
    }

    return state;
  };
}