{"record":{"id":"f6478d7ce9daabf9","repo":"hcengineering/platform","slug":"mixin-questions-mixin-questionmixin-not-found-f","errorCode":null,"errorMessage":"Mixin ${questions.mixin.QuestionMixin} not found for question class ${questionClass._id}","messagePattern":"Mixin (.+?) not found for question class (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"plugins/questions-resources/src/utils/getQuestionMixin.ts","lineNumber":16,"sourceCode":"//\n// Copyright @ 2024 Hardcore Engineering Inc.\n//\n\nimport type { Answer, Question, QuestionMixin } from '@hcengineering/questions'\nimport type { Class, Ref } from '@hcengineering/core'\nimport { getClient } from '@hcengineering/presentation'\nimport questions from '../plugin'\n\nexport function getQuestionMixin<Q extends Question<any>> (\n  questionClassRef: Ref<Class<Q>>\n): QuestionMixin<Q, Answer<Q, unknown>> {\n  const hierarchy = getClient().getHierarchy()\n  const questionClass = hierarchy.getClass<Q>(questionClassRef)\n  if (!hierarchy.hasMixin(questionClass, questions.mixin.QuestionMixin)) {\n    throw new Error(`Mixin ${questions.mixin.QuestionMixin} not found for question class ${questionClass._id}`)\n  }\n  return hierarchy.as(questionClass, questions.mixin.QuestionMixin)\n}\n","sourceCodeStart":1,"sourceCodeEnd":20,"githubUrl":"https://github.com/hcengineering/platform/blob/63e28dc96483967b2fc21c881b3f1023c1de7718/plugins/questions-resources/src/utils/getQuestionMixin.ts#L1-L20","documentation":"getQuestionMixin verifies that a question class carries the QuestionMixin before casting to it via hierarchy.as(). If the resolved class does not have questions.mixin.QuestionMixin registered in the hierarchy, this error is thrown. It protects callers (e.g. mixin()) from treating a non-question class as a question and accessing question-specific mixin data that does not exist.","triggerScenarios":"Calling getQuestionMixin (directly or via mixin()) with a Ref<Class<Q>> that resolves to a class created without QuestionMixin — e.g. a subclass registered in the hierarchy without mixing in questions.mixin.QuestionMixin, a wrong/typo'd class reference, or a class from an unrelated plugin passed in.","commonSituations":"Custom question subclasses added to the model without applying the mixin; plugin version mismatch where an older model snapshot lacks the mixin; passing the answer/result class instead of the question class; migration where classes were re-created without mixin data.","solutions":["Ensure the question class definition includes QuestionMixin (mixins: questions.mixin.QuestionMixin) when registering it in the model.","Verify the classRef passed to getQuestionMixin actually points to a question class; log/inspect hierarchy.getClass(questionClassRef)._class.","Re-run model/migration upgrades so the deployed hierarchy includes the mixin for all question classes.","Guard the call site: use hierarchy.hasMixin(class, questions.mixin.QuestionMixin) before requesting the mixin and handle the negative case."],"exampleFix":"// before: register subclass without mixin\nexport const MyQuestion = classify(MyQuestionId, 'question', ...) // no QuestionMixin\n\n// after\nexport const MyQuestion = classify(MyQuestionId, 'question', 'Question', {\n  mixins: [questions.mixin.QuestionMixin]\n})","handlingStrategy":"validation","validationCode":"function ensureQuestionMixin<Q extends Question<any>>(classRef: Ref<Class<Q>>): boolean {\n  const hierarchy = getClient().getHierarchy()\n  const cls = hierarchy.getClass<Q>(classRef)\n  return hierarchy.hasMixin(cls, questions.mixin.QuestionMixin)\n}\n// guard: if (!ensureQuestionMixin(classRef)) { /* handle non-question class */ }","typeGuard":"function isQuestionClass<Q extends Question<any>>(classRef: Ref<Class<Q>>): boolean {\n  const hierarchy = getClient().getHierarchy()\n  if (!hierarchy.getClasses().some((c) => c._id === classRef)) return false\n  return hierarchy.hasMixin(hierarchy.getClass<Q>(classRef), questions.mixin.QuestionMixin)\n}","tryCatchPattern":"let question: QuestionMixin<Question<any>, Answer<Question<any>, unknown>>\ntry {\n  question = getQuestionMixin(classRef)\n} catch (err) {\n  if (err instanceof Error && err.message.includes('not found for question class')) {\n    console.error('Class is not registered as a question:', classRef)\n    return // or fallback path\n  }\n  throw err\n}","preventionTips":["Register every question subclass with questions.mixin.QuestionMixin in the model","Validate class refs at model-migration time with a hierarchy-wide hasMixin audit","Type class refs narrowly (Ref<Class<Question<any>>>) so non-question classes cannot be passed","Keep plugin model versions in sync so the hierarchy always contains mixin definitions"],"tags":["hierarchy","mixin","data-model","class-registration"],"backgroundTag":"missing-mixin","analyzedSha":"63e28dc96483967b2fc21c881b3f1023c1de7718","analyzedAt":"2026-08-29T15:21:27.377Z","schemaVersion":2},"datasetVersion":"2026-08-29T17:17:51.833Z"}