You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

survey.js 4.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. import { Survey } from '../entities/index.js'
  2. import { fetchQuestions, insertNewSurveyResponse } from '../services/index.js'
  3. import { splash, auth, possible, surveyStages, allSteps } from './lang.js'
  4. class SurveyFactory {
  5. constructor() {
  6. this.questionsFromDb = []
  7. this.responsesFromDb = []
  8. }
  9. _addResponses(responseKeys, responsesByCategory) {
  10. const existingResponses = {}
  11. // Removes empty form drop down options from possible['usa']
  12. Object.keys(responsesByCategory).forEach(categoryKey => {
  13. if (responsesByCategory[categoryKey].length) {
  14. existingResponses[categoryKey] =
  15. responsesByCategory[categoryKey]
  16. }
  17. })
  18. // Adds form drop down options to each responseKey
  19. Object.keys(existingResponses).forEach(inputKey => {
  20. responseKeys.forEach(responseKey => {
  21. if (responseKey.survey_stage == inputKey) {
  22. responseKey.responses = existingResponses[inputKey]
  23. }
  24. })
  25. })
  26. return responseKeys
  27. }
  28. _addComponents(responseKeys) {
  29. responseKeys.forEach(responseKey => {
  30. switch (responseKey.category) {
  31. case 'input':
  32. responseKey.component = 'FormInput'
  33. break
  34. case 'choice':
  35. responseKey.component = 'FormDropdown'
  36. break
  37. case 'aspect':
  38. responseKey.component = 'QuestionResponse'
  39. break
  40. }
  41. })
  42. return responseKeys
  43. }
  44. _addSurveySteps(responseKeys, surveyStages) {
  45. responseKeys.forEach(responseKey => {
  46. Object.keys(surveyStages).forEach((stage, i) => {
  47. if (responseKey.response_key_id == stage) {
  48. responseKey.survey_stage = surveyStages[i + 1]
  49. }
  50. })
  51. })
  52. return responseKeys
  53. }
  54. // TODO: Don't nest the for loop...
  55. _sortSurveySteps(mutatedResponseKeys, allSteps) {
  56. const reordered = []
  57. Object.values(allSteps).forEach(step => {
  58. Object.values(mutatedResponseKeys).forEach(response => {
  59. if (surveyStages[response.response_key_id] === step) {
  60. response.survey_stage = step
  61. reordered.push(response)
  62. }
  63. })
  64. })
  65. return reordered
  66. }
  67. _setSteps() {
  68. const responseKeys = this.questionsFromDb
  69. const responsesByCategory = possible['usa']
  70. let mutatedResponseKeys = this._addSurveySteps(
  71. responseKeys,
  72. surveyStages,
  73. )
  74. mutatedResponseKeys = this._addResponses(
  75. mutatedResponseKeys,
  76. responsesByCategory,
  77. )
  78. mutatedResponseKeys = this._addComponents(responseKeys)
  79. mutatedResponseKeys = this._sortSurveySteps(
  80. mutatedResponseKeys,
  81. allSteps['usa'],
  82. )
  83. // Splash page is placed at beginning of survey
  84. mutatedResponseKeys.unshift(splash)
  85. // Auth page is placed after email/password
  86. mutatedResponseKeys.splice(8, 0, auth)
  87. return mutatedResponseKeys
  88. }
  89. async getQuestions() {
  90. try {
  91. this.questionsFromDb = await fetchQuestions()
  92. return this.questionsFromDb
  93. } catch (err) {
  94. console.error(err)
  95. }
  96. }
  97. async addNewSurveyAnswer(responses, profileId) {
  98. try {
  99. this.responsesFromDb = await insertNewSurveyResponse(
  100. responses,
  101. profileId,
  102. )
  103. return this.responsesFromDb
  104. } catch (err) {
  105. console.error(err)
  106. }
  107. }
  108. async createSurvey(roleTree) {
  109. if (!this.questionsFromDb.length) {
  110. const res = await this.getQuestions()
  111. console.warn(
  112. `Attempted to create a survey before getting questions: retrieved ${res.length} questions`,
  113. )
  114. }
  115. const steps = this._setSteps()
  116. return new Survey(steps, roleTree)
  117. }
  118. }
  119. export { SurveyFactory }