CLOSER-Cohorts/archivist

View on GitHub
react/src/reducers/index.js

Summary

Maintainability
F
2 wks
Test Coverage
import { combineReducers } from "redux";
import { get } from 'lodash'

const serializeSearchesArrayToObject = (array) =>
  array.reduce((obj, item) => {
    obj[item.prefix] = item
   return obj
  }, {})

const serializeArrayToObject = (array) =>
  array.reduce((obj, item) => {
    obj[item.id] = item
   return obj
  }, {})

const auth = (state = { isAuthUser: !!window.localStorage.getItem("jwt") }, action) => {

  switch (action.type) {

    case 'LOGIN':
      window.localStorage.setItem('jwt', action.payload.jwt);
      return { isAuthUser: true, user: action.payload }
    case 'WHOAMI':
      return { ...state, ...{user: action.payload.user } }
    case 'LOGOUT':
      window.localStorage.removeItem('jwt');
      return { isAuthUser: false }
    default:
      return state
  }
}

const instrumentTrees = (state = {}, action) => {

  switch (action.type) {
    case 'LOAD_INSTRUMENT_TREE':
      return {...state, ...{[action.payload.instrumentId]: action.payload.flatTree}}
    default:
      return state
  }
}

const instruments = (state = [], action) => {

  switch (action.type) {
    case 'LOAD_INSTRUMENTS':
      return serializeSearchesArrayToObject(action.payload.instruments)
    case 'LOAD_INSTRUMENT':
      return {...state, ...{[action.payload.instrument.prefix]: action.payload.instrument}}
    case 'DELETE_INSTRUMENT':
      const { [`${action.payload.instrumentId}`]: instrumentId, ...newState } = state;
      return newState
    default:
      return state
  }
}

const imports = (state = [], action) => {

  switch (action.type) {
    case 'LOAD_ADMIN_IMPORTS':
      return serializeArrayToObject(action.payload.imports)
    case 'LOAD_ADMIN_IMPORT':
      return {...state, ...{[action.payload.import.id]: action.payload.import}}
    default:
      return state
  }
}

const datasets = (state = [], action) => {
  switch (action.type) {
    case 'LOAD_DATASETS':
      return serializeArrayToObject(action.payload.datasets)
    case 'LOAD_DATASET':
      return {...state, ...{[action.payload.dataset.id]: action.payload.dataset}}
    case 'DELETE_INSTRUMENT':
      const { [`${action.payload.datasetId}`]: datasetId, ...newState } = state;
      return newState
    default:
      return state
  }
}

const users = (state = [], action) => {
  switch (action.type) {
    case 'LOAD_USERS':
      return serializeArrayToObject(action.payload.users)
    case 'LOAD_USER':
      return { ...state, ...{ [action.payload.user.id]: action.payload.user } }
    case 'DELETE_USER':
      const { [`${action.payload.userId}`]: userId, ...newState } = state;
      return newState
    default:
      return state
  }
}

const instrumentStats = (state = [], action) => {

  switch (action.type) {
    case 'LOAD_INSTRUMENT_STATS':
      return {...state, ...{[action.payload.instrumentId]: action.payload.stats}}
    default:
      return state
  }
}

const instrumentMappingStats = (state = [], action) => {

  switch (action.type) {
    case 'LOAD_INSTRUMENT_MAPPING_STATS':
      return {...state, ...{[action.payload.instrumentId]: action.payload.mapping_stats}}
    default:
      return state
  }
}

const datasetMappingStats = (state = [], action) => {

  switch (action.type) {
    case 'LOAD_DATASET_MAPPING_STATS':
      return {...state, ...{[action.payload.datasetId]: action.payload.mapping_stats}}
    default:
      return state
  }
}

const cc_sequences = (state = {}, action) => {

  switch (action.type) {
    case 'LOAD_INSTRUMENT_SEQUENCES':
      return {...state, ...{[action.payload.instrumentId]: serializeArrayToObject(action.payload.sequences)}}
    case 'LOAD_INSTRUMENT_SEQUENCE':
      var instrumentSequences = state[action.payload.instrumentId]
      instrumentSequences[action.payload.sequence.id] = action.payload.sequence
      return {...state, ...{[action.payload.instrumentId]: instrumentSequences}}
    default:
      return state
  }
}

const cc_statements = (state = {}, action) => {

  switch (action.type) {
    case 'LOAD_INSTRUMENT_STATEMENTS':
      return {...state, ...{[action.payload.instrumentId]: serializeArrayToObject(action.payload.statements)}}
    case 'LOAD_INSTRUMENT_STATEMENT':
      var instrumentStatements = state[action.payload.instrumentId]
      instrumentStatements[action.payload.statement.id] = action.payload.statement
      return {...state, ...{[action.payload.instrumentId]: instrumentStatements}}
    default:
      return state
  }
}

const cc_conditions = (state = {}, action) => {

  switch (action.type) {
    case 'LOAD_INSTRUMENT_CONDITIONS':
      return {...state, ...{[action.payload.instrumentId]: serializeArrayToObject(action.payload.conditions)}}
    case 'LOAD_INSTRUMENT_CONDITION':
      var instrumentConditions = state[action.payload.instrumentId]
      instrumentConditions[action.payload.condition.id] = action.payload.condition
      return {...state, ...{[action.payload.instrumentId]: instrumentConditions}}
    default:
      return state
  }
}


const cc_loops = (state = {}, action) => {

  switch (action.type) {
    case 'LOAD_INSTRUMENT_LOOPS':
      return {...state, ...{[action.payload.instrumentId]: serializeArrayToObject(action.payload.loops)}}
    case 'LOAD_INSTRUMENT_LOOP':
      var instrumentLoops = state[action.payload.instrumentId]
      instrumentLoops[action.payload.loop.id] = action.payload.loop
      return {...state, ...{[action.payload.instrumentId]: instrumentLoops}}
    default:
      return state
  }
}

const response_units = (state = {}, action) => {

  switch (action.type) {
    case 'LOAD_INSTRUMENT_RESPONSE_UNITS':
      return {...state, ...{[action.payload.instrumentId]: serializeArrayToObject(action.payload.responseUnits)}}
    case 'LOAD_INSTRUMENT_RESPONSE_UNIT':
      var instrumentResponseUnits = state[action.payload.instrumentId]
      instrumentResponseUnits[action.payload.responseUnit.id] = action.payload.responseUnit
      return {...state, ...{[action.payload.instrumentId]: instrumentResponseUnits}}
    default:
      return state
  }
}

const cc_questions = (state = {}, action) => {

  switch (action.type) {
    case 'LOAD_INSTRUMENT_QUESTIONS':
      return {...state, ...{[action.payload.instrumentId]: serializeArrayToObject(action.payload.questions)}}
    case 'LOAD_INSTRUMENT_QUESTION':
      var instrumentQuestions = state[action.payload.instrumentId]
      instrumentQuestions[action.payload.question.id] = action.payload.question
      return {...state, ...{[action.payload.instrumentId]: instrumentQuestions}}
    default:
      return state
  }
}

const questionItems = (state = {}, action) => {

  switch (action.type) {
    case 'LOAD_INSTRUMENT_QUESTION_ITEMS':
      return {...state, ...{[action.payload.instrumentId]: serializeArrayToObject(action.payload.questions)}}
    case 'LOAD_INSTRUMENT_QUESTION_ITEM':
      var questionItems = get(state, action.payload.instrumentId, {})
      const revisedQuestionItems = {...questionItems, ...{[action.payload.questionItem.id]: action.payload.questionItem}}
      return {...state, ...{[action.payload.instrumentId]: revisedQuestionItems}}
    case 'DELETE_INSTRUMENT_OBJECT_TYPE':
      if(action.payload.objectType === 'QuestionItem'){
        var objects = get(state, action.payload.instrumentId, {})
        delete objects[action.payload.id]
        return {...state, ...{[action.payload.instrumentId]: objects}}
      }else{
        return state
      }
    default:
      return state
  }
}

const questionGrids = (state = {}, action) => {

  switch (action.type) {
    case 'LOAD_INSTRUMENT_QUESTION_GRIDS':
      return {...state, ...{[action.payload.instrumentId]: serializeArrayToObject(action.payload.questions)}}
    case 'LOAD_INSTRUMENT_QUESTION_GRID':
      var questionGrids = get(state, action.payload.instrumentId, {})
      const revisedQuestionGrids = {...questionGrids, ...{[action.payload.questionGrid.id]: action.payload.questionGrid}}
      return {...state, ...{[action.payload.instrumentId]: revisedQuestionGrids}}
    case 'DELETE_INSTRUMENT_OBJECT_TYPE':
      if(action.payload.objectType === 'QuestionGrid'){
        var objects = get(state, action.payload.instrumentId, {})
        delete objects[action.payload.id]
        return {...state, ...{[action.payload.instrumentId]: objects}}
      }else{
        return state
      }
    default:
      return state
  }
}

const variables = (state = {}, action) => {

  switch (action.type) {
    case 'LOAD_INSTRUMENT_VARIABLES':
      return {...state, ...{[action.payload.instrumentId]: serializeArrayToObject(action.payload.variables)}}
    default:
      return state
  }
}

const datasetVariables = (state = {}, action) => {

  switch (action.type) {
    case 'LOAD_DATASET_VARIABLES':
      return {...state, ...{[action.payload.datasetId]: serializeArrayToObject(action.payload.variables)}}
    case 'LOAD_DATASET_VARIABLE':
      var variables = get(state, action.payload.datasetId, {})
      const revisedVariables = {...variables, ...{[action.payload.variable.id]: action.payload.variable}}
      return {...state, ...{[action.payload.datasetId]: revisedVariables}}
    default:
      return state
  }
}

const datasetImportMappings = (state = {}, action) => {

  switch (action.type) {
    case 'LOAD_DATASET_IMPORT_MAPPINGS':
      return {...state, ...{[action.payload.id]: serializeArrayToObject(action.payload.importMappings)}}
    case 'LOAD_DATASET_IMPORT_MAPPING':
      var importMappings = get(state, action.payload.parentId, {})
      const revisedImportMappings = {...importMappings, ...{[action.payload.importMapping.id]: action.payload.importMapping}}
      return {...state, ...{[action.payload.parentId]: revisedImportMappings}}
    default:
      return state
  }
}

const instrumentImportMappings = (state = {}, action) => {

  switch (action.type) {
    case 'LOAD_INSTRUMENT_IMPORT_MAPPINGS':
      return {...state, ...{[action.payload.id]: serializeArrayToObject(action.payload.importMappings)}}
    case 'LOAD_INSTRUMENT_IMPORT_MAPPING':
      var importMappings = get(state, action.payload.parentId, {})
      const revisedImportMappings = {...importMappings, ...{[action.payload.importMapping.id]: action.payload.importMapping}}
      return {...state, ...{[action.payload.parentId]: revisedImportMappings}}
    default:
      return state
  }
}

const codeLists = (state = {}, action) => {

  switch (action.type) {
    case 'LOAD_INSTRUMENT_CODE_LISTS':
      return {...state, ...{[action.payload.instrumentId]: serializeArrayToObject(action.payload.codeLists)}}
    case 'LOAD_INSTRUMENT_CODE_LIST':
      var codeLists = get(state, action.payload.instrumentId, {})
      const revisedCodeLists = {...codeLists, ...{[action.payload.codeList.id]: action.payload.codeList}}
      return {...state, ...{[action.payload.instrumentId]: revisedCodeLists}}
    case 'DELETE_INSTRUMENT_OBJECT_TYPE':
      if(action.payload.objectType === 'CodeList'){
        var codeLists = get(state, action.payload.instrumentId, {})
        delete codeLists[action.payload.id]
        return {...state, ...{[action.payload.instrumentId]: codeLists}}
      }else{
        return state
      }
    default:
      return state
  }
}

const responseDomainNumerics = (state = {}, action) => {

  switch (action.type) {
    case 'LOAD_INSTRUMENT_RESPONSE_DOMAIN_NUMERICS':
      return {...state, ...{[action.payload.instrumentId]: serializeArrayToObject(action.payload.responseDomainNumerics)}}
    case 'LOAD_INSTRUMENT_RESPONSE_DOMAIN_NUMERIC':
      var responseDomainNumerics = get(state, action.payload.instrumentId, {})
      const revisedResponseDomains = {...responseDomainNumerics, ...{[action.payload.responseDomainNumeric.id]: action.payload.responseDomainNumeric}}
      return {...state, ...{[action.payload.instrumentId]: revisedResponseDomains}}
    case 'DELETE_INSTRUMENT_OBJECT_TYPE':
      if(action.payload.objectType === 'ResponseDomainNumeric'){
        var objects = get(state, action.payload.instrumentId, {})
        delete objects[action.payload.id]
        return {...state, ...{[action.payload.instrumentId]: objects}}
      }else{
        return state
      }
    default:
      return state
  }
}

const responseDomainCodes = (state = {}, action) => {

  switch (action.type) {
    case 'LOAD_INSTRUMENT_RESPONSE_DOMAIN_CODES':
      return {...state, ...{[action.payload.instrumentId]: serializeArrayToObject(action.payload.responseDomainCodes)}}
    default:
      return state
  }
}

const responseDomainTexts = (state = {}, action) => {

  switch (action.type) {
    case 'LOAD_INSTRUMENT_RESPONSE_DOMAIN_TEXTS':
      return {...state, ...{[action.payload.instrumentId]: serializeArrayToObject(action.payload.responseDomainTexts)}}
    case 'LOAD_INSTRUMENT_RESPONSE_DOMAIN_TEXT':
      var responseDomainTexts = get(state, action.payload.instrumentId, {})
      const revisedResponseDomains = {...responseDomainTexts, ...{[action.payload.responseDomainText.id]: action.payload.responseDomainText}}
      return {...state, ...{[action.payload.instrumentId]: revisedResponseDomains}}
    case 'DELETE_INSTRUMENT_OBJECT_TYPE':
      if(action.payload.objectType === 'ResponseDomainText'){
        var objects = get(state, action.payload.instrumentId, {})
        delete objects[action.payload.id]
        return {...state, ...{[action.payload.instrumentId]: objects}}
      }else{
        return state
      }
    default:
      return state
  }
}

const responseDomainDatetimes = (state = {}, action) => {

  switch (action.type) {
    case 'LOAD_INSTRUMENT_RESPONSE_DOMAIN_DATETIMES':
      return {...state, ...{[action.payload.instrumentId]: serializeArrayToObject(action.payload.responseDomainDatetimes)}}
    case 'LOAD_INSTRUMENT_RESPONSE_DOMAIN_DATETIME':
      var responseDomainDatetimes = get(state, action.payload.instrumentId, {})
      const revisedResponseDomains = {...responseDomainDatetimes, ...{[action.payload.responseDomainDatetime.id]: action.payload.responseDomainDatetime}}
      return {...state, ...{[action.payload.instrumentId]: revisedResponseDomains}}
    case 'DELETE_INSTRUMENT_OBJECT_TYPE':
      if(action.payload.objectType === 'ResponseDomainDatetime'){
        var objects = get(state, action.payload.instrumentId, {})
        delete objects[action.payload.id]
        return {...state, ...{[action.payload.instrumentId]: objects}}
      }else{
        return state
      }
    default:
      return state
  }
}

const categories = (state = {}, action) => {

  switch (action.type) {
    case 'LOAD_INSTRUMENT_CATEGORIES':
      return {...state, ...{[action.payload.instrumentId]: serializeArrayToObject(action.payload.categories)}}
    default:
      return state
  }
}

const userGroups = (state = [], action) => {

  switch (action.type) {
    case 'LOAD_USER_GROUPS':
      return action.payload.user_groups
    default:
      return state
  }
}

const topics = (state = {}, action) => {

  switch (action.type) {
    case 'LOAD_TOPICS':
      var new_state = { ...state, ...serializeArrayToObject(action.payload.topics) }
      return {...new_state, ...{ flattened: action.payload.topics}}
    default:
      return state
  }
}

const statuses = (state = {}, action) => {

  var key;

  switch (action.type) {
    case 'CLEAR':
      key = action.payload.type + ':' + action.payload.id
      return {...state, ...{[key]: {}}}
    case 'SAVING':
      key = action.payload.type + ':' + action.payload.id
      return {...state, ...{[key]: {saving: true}}}
    case 'SAVED':
      key = action.payload.type + ':' + action.payload.id
      return {...state, ...{[key]: {saved: true}}}
    case 'ERROR':
      key = action.payload.type + ':' + action.payload.id
      if(typeof action.payload.error === 'object' && action.payload.error !== null){
        if(Array.isArray(action.payload.error)){
          return { ...state, ...{ [key]: { error: true, errors: action.payload.error, errorMessage: action.payload.error[0] } } }
        }else{
          return { ...state, ...{ [key]: { error: true, errors: action.payload.error, errorMessage: '' } } }
        }
      }else{
        return {...state, ...{[key]: {error: true, errorMessage: action.payload.error}}}
      }
    default:
      return state
  }
}

const common = (state = {}, action) => {

  switch (action.type) {
    case 'REDIRECT':
      return {...state, ...{redirect: action.payload.to}}
    case 'REDIRECT_CLEAR':
      return {...state, ...{redirect: undefined}}
    default:
      return state
  }
}


const appReducer = combineReducers({
    common,
    auth,
    datasets,
    instruments,
    instrumentTrees,
    imports,
    instrumentStats,
    instrumentMappingStats,
    datasetMappingStats,
    cc_sequences,
    cc_statements,
    cc_conditions,
    cc_loops,
    cc_questions,
    response_units,
    questionItems,
    questionGrids,
    categories,
    codeLists,
    responseDomainNumerics,
    responseDomainTexts,
    responseDomainDatetimes,
    responseDomainCodes,
    datasetVariables,
    variables,
    statuses,
    topics,
    userGroups,
    users,
    datasetImportMappings,
    instrumentImportMappings,
})

export default appReducer;