import { Survey } from '../entities/index.js' import { fetchQuestions, insertNewSurveyResponse } from '../services/index.js' import { splash, auth, 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) // Auth page is placed after email/password mutatedResponseKeys.splice(8, 0, auth) 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 }