LearnersGuild/echo

View on GitHub
src/server/actions/findUserProjectEvaluations.js

Summary

Maintainability
A
1 hr
Test Coverage
import {Response, Member, Project} from 'src/server/services/dataService'
import {groupById} from 'src/server/util'
import {extractValueForReponseQuestionFeedbackType} from 'src/server/util/feedback'
import {FEEDBACK_TYPE_DESCRIPTORS} from 'src/common/models/feedbackType'
import {LGBadRequestError} from 'src/server/util/error'
 
const evaluationFeedbackTypeDescriptors = [
FEEDBACK_TYPE_DESCRIPTORS.GENERAL_FEEDBACK,
FEEDBACK_TYPE_DESCRIPTORS.TEAM_PLAY,
FEEDBACK_TYPE_DESCRIPTORS.TECHNICAL_COMPREHENSION,
]
 
Function `findUserProjectEvaluations` has 32 lines of code (exceeds 25 allowed). Consider refactoring.
Function `findUserProjectEvaluations` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.
export default async function findUserProjectEvaluations(userIdentifier, projectIdentifier) {
const user = await (typeof userIdentifier === 'string' ? Member.get(userIdentifier) : userIdentifier)
if (!user || !user.id) {
throw new LGBadRequestError(`User not found for identifier: ${userIdentifier}`)
}
 
const project = await (typeof projectIdentifier === 'string' ? Project.get(projectIdentifier) : projectIdentifier)
if (!project || !project.id) {
throw new LGBadRequestError(`Project not found for identifier: ${projectIdentifier}`)
}
 
const {retrospectiveSurveyId} = project
if (!retrospectiveSurveyId) {
return []
}
 
const retroSurveyResponses = groupById(
await Response.filter({
surveyId: retrospectiveSurveyId,
subjectId: user.id,
})
.getJoin({question: {feedbackType: true}})
, 'respondentId')
 
const userProjectEvaluations = []
retroSurveyResponses.forEach((responses, respondentId) => {
// choose create time of earliest response as create time for the evaluation
const createdAt = responses.sort((r1, r2) => {
const diff = r1.createdAt.getTime() - r2.createdAt.getTime()
return diff === 0 ? r1.id.localeCompare(r2.id) : diff
})[0].createdAt
 
const evaluation = {createdAt, submittedById: respondentId}
evaluationFeedbackTypeDescriptors.forEach(feedbackTypeDescriptor => {
evaluation[feedbackTypeDescriptor] = extractValueForReponseQuestionFeedbackType(responses, feedbackTypeDescriptor)
})
userProjectEvaluations.push(evaluation)
})
 
return userProjectEvaluations
}