Sha256: 68ce7675a3266241c802df80896daefa4faa9fc49ac3a784ff30b2a32f0123ef

Contents?: true

Size: 1.95 KB

Versions: 7

Compression:

Stored size: 1.95 KB

Contents

# frozen_string_literal: true

# == Schema Information
#
# Table name: sources
#
#  id          :integer          not null, primary key
#  imported_at :datetime
#  title       :string
#  url         :string
#  created_at  :datetime
#  updated_at  :datetime
#

# == Source
#
# A model that represents a source of events data, such as feeds for hCal, iCal, etc.
require "calagator/decode_html_entities_hack"
require "paper_trail"
require "loofah-activerecord"
require "loofah/activerecord/xss_foliate"

module Calagator
  class Source < Calagator::ApplicationRecord
    self.table_name = "sources"

    validate :assert_url

    has_many :events, dependent: :destroy
    has_many :venues, dependent: :destroy

    scope :listing, -> { order("created_at DESC") }

    has_paper_trail

    xss_foliate
    include DecodeHtmlEntitiesHack

    # Create events for this source. Returns the events created. URL must be set
    # for this source for this to work.
    def create_events!
      save!
      to_events.select { |event| event.valid? && !event.old? }.each(&:save!)
    end

    # Normalize the URL.
    def url=(value)
      url = URI.parse(value.strip)
      unless %w[http https ftp].include?(url.scheme) || url.scheme.nil?
        url.scheme = "http"
      end
      self[:url] = url.scheme.nil? ? "http://" + value.strip : url.to_s
    rescue URI::InvalidURIError
      false
    end

    # Returns an Array of Event objects that were read from this source.
    def to_events
      raise ActiveRecord::RecordInvalid, self unless valid?

      self.imported_at = Time.now.in_time_zone
      Source::Parser.to_events(url: url, source: self)
    end

    # Return the name of the source, which can be its title or URL.
    def name
      [title, url].detect(&:present?)
    end

    private

    # Ensure that the URL for this source is valid.
    def assert_url
      URI.parse(url)
    rescue URI::InvalidURIError
      errors.add :url, "has invalid format"
      false
    end
  end
end

Version data entries

7 entries across 7 versions & 2 rubygems

Version Path
koalagator-4.1.0 app/models/calagator/source.rb
koalagator-4.0.0 app/models/calagator/source.rb
koalagator-3.0.0 app/models/calagator/source.rb
koalagator-2.1.1 app/models/calagator/source.rb
koalagator-2.1.0 app/models/calagator/source.rb
calagator2-2.1.1 app/models/calagator/source.rb
calagator2-2.1.0 app/models/calagator/source.rb