import { Survey } from '../entities/index.js' import { fetchQuestions } from '../services/index.js' import { splash, possible, surveyStages, allSteps } from './lang.js' class SurveyFactory { constructor() { this.questionsFromDb = [] } _addSurveyStages(responseKeys, surveyStages) { responseKeys.forEach((key, i) => { key.survey_stage = surveyStages[i] }) return responseKeys } _addResponses(responseKeys, responsesByCategory) { Object.keys(responsesByCategory).forEach(k => { responseKeys.forEach(key => { if (key.survey_stage === k) { key.responses = responsesByCategory[k] } }) }) return responseKeys } _addComponents(responseKeys) { responseKeys.forEach(key => { switch (key.category) { case 'input': key.component = 'FormInput' break case 'choice': key.component = 'FormDropdown' break case 'aspect': key.component = 'QuestionResponse' break } }) return responseKeys } _sortSurveySteps(mutatedResponseKeys, allSteps) { const reordered = [] Object.values(allSteps).forEach((step, i) => { Object.values(mutatedResponseKeys).forEach(val => { if (val.survey_stage === step) { reordered[i] = val } }) }) return reordered } _setSteps() { const responseKeys = this.questionsFromDb const responsesByCategory = possible['usa'] let mutatedResponseKeys = this._addSurveyStages(responseKeys, surveyStages) mutatedResponseKeys = this._addResponses(responseKeys, 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 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 }