pupilfirst/pupilfirst

View on GitHub
app/queries/discussion_submissions_resolver.rb

Summary

Maintainability
A
1 hr
Test Coverage
A
100%
class DiscussionSubmissionsResolver < ApplicationQuery
  property :target_id

  def discussion_submissions
    # add moderator to context to be used in type fields
    context[:moderator] = moderator?
    submissions =
      course
        .timeline_events
        .discussion_enabled
        .live
        .joins(:students)
        .where.not(students: { id: student })

    # Filter by target
    submissions =
      submissions.where(target_id: target_id) if course.targets.exists?(
      id: target_id
    )

    #Filter hidden submissions if not moderator
    submissions = submissions.not_hidden unless moderator?

    submissions.order(pinned: :desc, created_at: :desc)
  end

  def authorized?
    return false if current_user.blank?

    return false if course&.school != current_school

    return true if current_school_admin.present?

    return true if current_user.course_authors.where(course: course).present?

    return true if course.faculty.exists?(user: current_user)

    student.present?
  end

  def moderator?
    current_school_admin.present? || @course.faculty.exists?(user: current_user)
  end

  def student
    @student ||=
      current_user
        .students
        .joins(:cohort)
        .find_by(cohorts: { course_id: course })
  end

  def course
    @course ||= target&.course
  end

  def target
    @target ||= Target.find_by(id: target_id)
  end
end