KyivKrishnaAcademy/ved_akadem_students

View on GitHub
app/interactions/concerns/class_schedules_loadable.rb

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
module ClassSchedulesLoadable
  extend ActiveSupport::Concern

  include ApplicationHelper
  include ClassSchedulesHelper
  include Rails.application.routes.url_helpers

  def as_json(_opts = {})
    {
      classSchedules: @class_schedules.map { |cs| serialize_class_schedule cs },
      pages: @class_schedules.total_pages
    }
  end

  private

  def serialize_class_schedule(class_schedule)
    {
      id: class_schedule.id,
      subject: class_schedule.subject,
      course: serialize_course(class_schedule.course),
      lector: class_schedule.teacher_profile.present? ? serialize_lector(class_schedule.teacher_profile.person) : nil,
      academicGroups: class_schedule.academic_groups.map { |ag| serialize_academic_group ag },
      classroom: class_schedule.classroom.title,
      time: show_scheduled_time(class_schedule),
      canEdit: policy(class_schedule.real_class_schedule).edit?,
      canDelete: policy(class_schedule.real_class_schedule).destroy?,
      editPath: edit_class_schedule_path(class_schedule),
      deletePath: class_schedule_path(class_schedule)
    }
  end

  def serialize_common(model)
    {
      id: model.id,
      title: model.title,
      canView: policy(model).show?
    }
  end

  def serialize_course(course)
    serialize_common(course).merge(path: course_path(course))
  end

  def serialize_academic_group(group)
    serialize_common(group).merge(path: academic_group_path(group))
  end

  def serialize_lector(lector)
    {
      id: lector.id,
      path: person_path(lector),
      canView: policy(lector).show?,
      complexName: complex_name(lector, short: true)
    }
  end

  def policy(model)
    Pundit.policy(user, model)
  end
end