moonleerecords/moonlee-website

View on GitHub
app/models/release.rb

Summary

Maintainability
A
0 mins
Test Coverage
class Release < ApplicationRecord
  extend FriendlyId

  friendly_id :title, use: :slugged

  default_scope { where(active: true).order('catalog_number DESC') }

  has_many :release_types, dependent: :destroy
  has_many :release_reviews, dependent: :destroy
  has_many :artist_releases
  has_many :artists, through: :artist_releases
  has_many :external_links, as: :linkable, dependent: :destroy

  accepts_nested_attributes_for :release_types, allow_destroy: true
  accepts_nested_attributes_for :release_reviews, allow_destroy: true
  accepts_nested_attributes_for :external_links, allow_destroy: true

  has_attached_file :cover,
                    styles: {
                      large: '1250x1250',
                      medium: '450x450',
                      small: '100x100'
                    }

  # TODO: add attachment - pdf???

  validates :title, presence: true
  validates :catalog_number, presence: true
  validates :release_date, presence: true
  validates_attachment_content_type :cover, content_type: %r{\Aimage\/.*\Z}

  scope :internal_releases, -> { where(internal: true) }
  scope :upcoming, -> { internal_releases.where('release_date > ?', Time.zone.today) }
  scope :fresh, lambda {
    internal_releases.where(
      'release_date <= ? AND release_date >= ?',
      Time.zone.today,
      Time.zone.today - 1.month
    )
  }
  scope :latest, -> { internal_releases.where('release_date <= ?', Time.zone.today) }

  before_save :generate_bandcamp_player, :assign_artists_names

  def released_formats(separator = '/')
    released_formats = []
    release_types.each do |release_type|
      released_formats << release_type.release_format
    end
    released_formats.join(" #{separator} ")
  end

  def internal_buy_links
    internal_buy_links = {}
    release_types.each do |release_type|
      buy_link = release_type.release_type_buy_links.internal.first
      internal_buy_links[release_type.release_format] = buy_link.try(:buy_url)
    end
    internal_buy_links
  end

  def external_buy_links
    external_buy_links = {}
    release_types.each do |release_type|
      buy_link = release_type.release_type_buy_links.internal.first
      external_buy_links[release_type.release_format] = buy_link.try(:buy_url)
    end
    external_buy_links
  end

  def bandcamp_url_http
    return nil unless bandcamp_url.present?
    uri = URI.parse(bandcamp_url)
    # TODO: get certificate and change this
    uri.scheme = 'http' if uri.scheme == 'https'
    uri.to_s
  end

  def concat_artists_names
    artists.pluck(:name).map! { |name| name.index('/') ? name.slice(0..name.index('/') - 1).strip : name }.join(' / ')
  end

  def split_release?
    artists.count > 1
  end

  private

  def generate_bandcamp_player
    self.bandcamp_player = "<iframe style=\"border: 0; width: 100%; height: 742px;\" src=\"https://bandcamp.com/EmbeddedPlayer/album=#{bandcamp_id}/size=large/bgcol=ffffff/linkcol=333333/transparent=true/\" seamless><a href=\"#{bandcamp_url_http}\"></a></iframe>" if bandcamp_url.present?
  end

  def assign_artists_names
    self.artists_names = if split_release?
                           concat_artists_names
                         else
                           artists[0].present? ? artists[0].name : ''
                         end
  end
end