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.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. /** @module survey/survey */
  2. import { _baseRecord } from '../index.js'
  3. import { surveySchema } from './survey.schema.js'
  4. import { answerValidator } from './survey.answer.validator.js'
  5. import { aspectsArr } from '../../utils/lang.js'
  6. const SCORED = aspectsArr
  7. const _isScored = id => SCORED.includes(id)
  8. const _makeCategoryFriendly = responseCategory => {
  9. const labels = responseCategory.split('_vs_')
  10. labels.forEach((a, i) => {
  11. if (a.indexOf('_') == -1) return
  12. labels[i] = a.split('_').join(' ')
  13. })
  14. return labels
  15. }
  16. const _formatAspectQuestions = steps => {
  17. return steps
  18. .map(q => {
  19. if (!_isScored(q.response_key_id)) return null
  20. return {
  21. id: q.response_key_id,
  22. question: q.response_key_prompt,
  23. labels: _makeCategoryFriendly(q.response_key_category),
  24. answer: null,
  25. }
  26. })
  27. .filter(step => step != null)
  28. }
  29. const SCORED = [1, 2, 3, 4, 5, 6]
  30. const _isScored = id => SCORED.includes(id)
  31. const _makeCategoryFriendly = responseCategory => {
  32. const labels = responseCategory.split('_vs_')
  33. labels.forEach((a, i) => {
  34. if (a.indexOf('_') == -1) return
  35. labels[i] = a.split('_').join(' ')
  36. })
  37. return labels
  38. }
  39. const _formatAspectQuestions = steps => {
  40. return steps
  41. .map(q => {
  42. if (!_isScored(q.response_key_id)) return null
  43. return {
  44. id: q.response_key_id,
  45. question: q.response_key_prompt,
  46. labels: _makeCategoryFriendly(q.response_key_category),
  47. answer: null,
  48. }
  49. })
  50. .filter(step => step != null)
  51. }
  52. class Survey extends _baseRecord {
  53. constructor(questionSteps) {
  54. super()
  55. this.type = this.constructor.name.toLowerCase()
  56. /** Fields */
  57. this.steps = [...questionSteps] // ! required
  58. this.aspectQuestions = _formatAspectQuestions(this.steps)
  59. }
  60. hasMinResponsesToCreateProfile(responses) {
  61. const neededResponseKeys = [8, 7, 11, 9]
  62. const hasNeededResponseKey = responses => {
  63. return responses.every(response => {
  64. neededResponseKeys.includes(response.response_key_id)
  65. })
  66. }
  67. return hasNeededResponseKey
  68. }
  69. validateAnswer(payload) {
  70. const { question, input } = payload
  71. // Continue our ugly hacks
  72. const validationType =
  73. question.category == 'aspect'
  74. ? question.category
  75. : question.survey_stage
  76. const validate = answerValidator[validationType].validate(input)
  77. if (validate.error) {
  78. console.error(`error: ${validate.error}`)
  79. }
  80. return !validate.error ? true : false
  81. }
  82. isValid() {
  83. const validate = surveySchema.validate(this)
  84. /**
  85. * Log out some useful error messages
  86. */
  87. if (validate.error) {
  88. console.error(`error: ${validate.error} - ${this.type} validation`)
  89. }
  90. /** validate(this) always returns something so force it to a bool */
  91. return !validate.error ? true : false
  92. }
  93. }
  94. export { Survey }