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

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  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. class Survey extends _baseRecord {
  30. constructor(questionSteps) {
  31. super()
  32. this.type = this.constructor.name.toLowerCase()
  33. /** Fields */
  34. this.steps = [...questionSteps] // ! required
  35. this.aspectQuestions = _formatAspectQuestions(this.steps)
  36. }
  37. hasMinResponsesToCreateProfile(responses) {
  38. const neededResponseKeys = [8, 7, 10, 11, 15, 19, 9]
  39. const hasMinResponses = () =>
  40. responses.every(response => {
  41. return neededResponseKeys.includes(response.response_key_id)
  42. })
  43. return hasMinResponses()
  44. }
  45. validateAnswer(payload) {
  46. const { question, input } = payload
  47. // Continue our ugly hacks
  48. const validationType =
  49. question.category == 'aspect'
  50. ? question.category
  51. : question.survey_stage
  52. const validate = answerValidator[validationType].validate(input)
  53. if (validate.error) {
  54. console.error(`error: ${validate.error}`)
  55. }
  56. return !validate.error ? true : false
  57. }
  58. isValid() {
  59. const validate = surveySchema.validate(this)
  60. /**
  61. * Log out some useful error messages
  62. */
  63. if (validate.error) {
  64. console.error(`error: ${validate.error} - ${this.type} validation`)
  65. }
  66. /** validate(this) always returns something so force it to a bool */
  67. return !validate.error ? true : false
  68. }
  69. }
  70. export { Survey }