defmodule Ami.Package do use Ecto.Schema import Ecto.{Query} # alias Users.User alias Ami.{ PackagePeriod, TeaserImage, EnrollmentInterest, PackageToolKit, PromoCode, Repo, Video } schema "packages" do field(:title, :string) field(:description, :string) field(:marketing_url, :string) field(:is_featured, :boolean) field(:on_air, :boolean) field(:price, :integer) field(:price_currency, :string) field(:search_box_text, :string) field(:slug, :string) field(:teaser_banner_text, :string) field(:teaser_description, :string) field(:total_hours, :integer) field(:why_take_package, :string) field(:created_at, :utc_datetime) field(:updated_at, :utc_datetime) has_many(:package_periods, PackagePeriod) has_many(:enrollments, through: [:package_periods, :enrollment]) has_many(:users, through: [:enrollments, :user]) has_many(:teaser_images, TeaserImage, on_delete: :delete_all, foreign_key: :teaseable_id) has_one(:video, Video, foreign_key: :videoable_id, on_delete: :delete_all) has_many(:enrollment_interests, EnrollmentInterest, foreign_key: :package_id) has_many(:interested_users, through: [:enrollment_interests, :user]) has_many(:package_tool_kits, PackageToolKit) has_many(:tool_kits, through: [:package_tool_kits, :tool_kit]) has_many(:promo_codes, PromoCode) end def on_air do package_periods_query = from( pp in PackagePeriod, where: pp.starts_on <= ^Date.utc_today() and pp.enrollment_end >= ^Date.utc_today(), order_by: [asc: pp.starts_on] ) Repo.all( from( p in __MODULE__, where: p.on_air == true, preload: [package_periods: ^package_periods_query] ) ) end def preload_preview_images(struct) do TeaserImage.preload_preview_images(struct, "Package") end def courses_for(package_struct) do current_package_period = PackagePeriod.current_for(package_struct) if current_package_period do Repo.preload(current_package_period, courses: :thumb_images).courses else pp = List.first( Repo.preload(package_struct, package_periods: [courses: :thumb_images]).package_periods ) pp.courses end end end