# # <%= autogenerated_migration_warning %> # A ContextModule is the same as a Canvas Module. They're called ContextModules for 2 reasons: # 1 - Module is a reserved word in Rails and you can't call a model a Module # 2 - Canvas calls them ContextModules class ContextModule < ApplicationRecord include CanvasSync::Record include CanvasSync::Concerns::ApiSyncable # include CanvasSync::Concerns::LiveEventSync canvas_sync_features :defaults belongs_to :context, polymorphic: true, optional: true, primary_key: :canvas_id, foreign_key: :canvas_context_id, foreign_type: :canvas_context_type has_many :context_module_items, primary_key: :canvas_id, foreign_key: :canvas_context_module_id has_many :assignments, through: :context_module_items serialize :completion_requirements serialize :prerequisites api_syncable({ canvas_id: :id, canvas_context_id: :context_id, canvas_context_type: :context_type, position: :position, name: :name, workflow_state: :workflow_state, unlock_at: :unlock_at, completion_requirements: :completion_requirements, prerequisites: :prerequisites, requirement_count: :requirement_count }, lambda { |api| course_modules = api.course_modules(canvas_context_id, { include: ['items'] }) # avoids having 2 API calls for modules as we reuse this data context_module = course_modules&.detect { |course_module| course_module['id'] == canvas_id } if context_module.nil? # no context_module here means it is deleted in Canvas self.workflow_state = :deleted return self end # The ContextModule model in Canvas has the 'completion_requirements' and 'prerequisites' fields that are not returned directly from the API # We need to compute them here based on data that we receive from course_modules in the API context_module['prerequisites'] = course_modules.map do |course_module| next unless context_module['prerequisite_module_ids']&.include?(course_module['id']) { id: course_module['id'], name: course_module['name'], type: 'context_module' }.with_indifferent_access end.compact context_module['completion_requirements'] = context_module['items']&.map { |item| item['completion_requirement'] }&.compact context_module }) end