| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- import { Survey } from '../entities/index.js'
- import { fetchQuestions, insertNewSurveyResponse } from '../services/index.js'
- import { splash, possible, surveyStages, allSteps } from './lang.js'
-
- class SurveyFactory {
- constructor() {
- this.questionsFromDb = []
- this.responsesFromDb = []
- }
- _addResponses(responseKeys, responsesByCategory) {
- const existingResponses = {}
- // Removes empty form drop down options from possible['usa']
- Object.keys(responsesByCategory).forEach(categoryKey => {
- if (responsesByCategory[categoryKey].length) {
- existingResponses[categoryKey] = responsesByCategory[categoryKey]
- }
- })
- // Adds form drop down options to each responseKey
- Object.keys(existingResponses).forEach(inputKey => {
- responseKeys.forEach(responseKey => {
- if (responseKey.survey_stage == inputKey) {
- responseKey.responses = existingResponses[inputKey]
- }
- })
- })
- return responseKeys
- }
- _addComponents(responseKeys) {
- responseKeys.forEach(responseKey => {
- switch (responseKey.category) {
- case 'input':
- responseKey.component = 'FormInput'
- break
- case 'choice':
- responseKey.component = 'FormDropdown'
- break
- case 'aspect':
- responseKey.component = 'QuestionResponse'
- break
- }
- })
- return responseKeys
- }
- _addSurveySteps(responseKeys, surveyStages) {
- responseKeys.forEach(responseKey => {
- Object.keys(surveyStages).forEach((stage, i) => {
- if (responseKey.response_key_id == stage) {
- responseKey.survey_stage = surveyStages[i + 1]
- }
- })
- })
- return responseKeys
- }
- // TODO: Don't nest the for loop...
- _sortSurveySteps(mutatedResponseKeys, allSteps) {
- const reordered = []
- Object.values(allSteps).forEach(step => {
- Object.values(mutatedResponseKeys).forEach(response => {
- if (surveyStages[response.response_key_id] === step) {
- response.survey_stage = step
- reordered.push(response)
- }
- })
- })
- return reordered
- }
- _setSteps() {
- const responseKeys = this.questionsFromDb
- const responsesByCategory = possible['usa']
- let mutatedResponseKeys = this._addSurveySteps(responseKeys, surveyStages)
- mutatedResponseKeys = this._addResponses(mutatedResponseKeys, responsesByCategory)
- mutatedResponseKeys = this._addComponents(responseKeys)
- mutatedResponseKeys = this._sortSurveySteps(mutatedResponseKeys, allSteps['usa'])
- // Splash page is placed at beginning of survey
- mutatedResponseKeys.unshift(splash)
- return mutatedResponseKeys
- }
- async getQuestions() {
- try {
- this.questionsFromDb = await fetchQuestions()
- return this.questionsFromDb
- } catch (err) {
- console.error(err)
- }
- }
- async addNewSurveyAnswer(responses, profileId) {
- try {
- this.responsesFromDb = await insertNewSurveyResponse(responses, profileId)
- return this.responsesFromDb
- }
- catch (err) {
- console.error(err)
- }
- }
- async createSurvey(roleTree) {
- if (!this.questionsFromDb.length) {
- const res = await this.getQuestions()
- console.warn(
- `Attempted to create a survey before getting questions: retrieved ${res.length} questions`,
- )
- }
- const steps = this._setSteps()
- return new Survey(steps, roleTree)
- }
- }
-
- export { SurveyFactory }
|