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 3.8KB

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