| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- 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 }
|