Advertisement
the_cec

EventsOccurencesService

Jun 10th, 2015
395
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 4.65 KB | None | 0 0
  1. # This service offers an interface to load the events in a date range
  2. class EventsOccurrencesService
  3.  
  4.   def initialize(options)
  5.     @product_edition = options[:product_edition]
  6.     @operator = %w(= >=).include?(options[:operator]) ? options[:operator] : '='
  7.     @hours_late = options[:hours_late] || 2
  8.     @locales = if options[:locales].try(:is_array?)
  9.                  options[:locales]
  10.                else
  11.                  [I18n.default_locale]
  12.                end
  13.     # @fallback_locale = options[:fallback_locale]
  14.     @collection_edition = options[:collection_edition]
  15.     @category = options[:category]
  16.     @exclude_categories = options[:exclude_categories]
  17.     @publication_status = Event::STATES.include?(options[:publication_status]) ? options[:publication_status] : 'published'
  18.   end
  19.  
  20.   def occurrences(date)
  21.     occurrences_ids = ids_of_occurrences(date)
  22.     @occurrences_relation = EventDate.where(id: occurrences_ids).includes(:times, {venue: :city}, {alt_venue: :city}).includes(
  23.         event: [:categories, :collection_editions, :image, :promoters]
  24.     )
  25.     include_texts_with_required_locale!
  26.     collection_edition_conditions!
  27.     category_conditions!
  28.     exclude_categories_conditions!
  29.     @occurrences_relation
  30.   end
  31.  
  32.   def day(options)
  33.     operator = %w(= >=).include?(options[:op]) ? options[:op] : '='
  34.     date = options[:date] || Date.today
  35.     order = (operator == '>=') ? 'event_dates.start_date, event_times.time_start' : 'event_times.time_start'
  36.  
  37.     event_dates_ids = date_ids(operator, date)
  38.     # Language constraint (locale & default_locale)
  39.     expression = EventDate.where(id: event_dates_ids).includes(:times, {venue: :city}, {alt_venue: :city})
  40.     expression = expression.includes(event: [:texts, :categories])
  41.     expression = expression.with_languages() unless options[:skip_languages]
  42.     expression = expression.includes(dates: [:times, :venue, :alt_venue]).includes(:texts, :categories) unless options[:skip_includes]
  43.     expression.order(order).all
  44.   end
  45.  
  46.  
  47.   def ids_of_occurrences(date)
  48.     @ids_relation = EventDate.joins(:event).where(
  49.         events: {status: @publication_status, home_control: %w(off show)}
  50.     ).joins("INNER JOIN product_eds_events ON product_eds_events.event_id = events.id").where(
  51.         ['product_eds_events.product_edition_id = :product_edition', product_edition: @product_edition]
  52.     )
  53.  
  54.     time_based_ordering!
  55.     date_conditions!(date, @operator)
  56.     times_conditions!(date, @operator)
  57.     @ids_relation.pluck(:id)
  58.   end
  59.  
  60.   def time_based_ordering!()
  61.     order = (@operator == '>=') ? 'event_dates.start_date, event_times.time_start' : 'event_times.time_start'
  62.     @ids_relation = @ids_relation.joins("LEFT JOIN event_times ON event_times.date_id = event_dates.id").order(order)
  63.   end
  64.  
  65.   def date_conditions!(date, operator)
  66.     @ids_relation = @ids_relation.where(
  67.         [
  68.             "event_dates.start_date #{operator} :date
  69.            OR
  70.            ( event_dates.end_date IS NOT NULL AND :date BETWEEN event_dates.start_date AND event_dates.end_date )",
  71.             date: date
  72.         ]
  73.     )
  74.   end
  75.  
  76.   def times_conditions!(date, operator)
  77.     if date == Date.today && operator == '='
  78.       @ids_relation= @ids_relation.where(
  79.           [
  80.               %Q(
  81.                 event_dates.allday = 1
  82.                 OR ( event_times.time_end IS NULL AND :x_hours_ago <= event_times.time_start )
  83.                 OR ( event_times.time_end IS NOT NULL AND ( :now <= event_times.time_start OR :now < event_times.time_end ) )
  84.               ),
  85.               {x_hours_ago: (Time.now - @hours_late.hours), now: Time.now}
  86.           ]
  87.       )
  88.     end
  89.   end
  90.  
  91.   def include_texts_with_required_locale!()
  92.     languages = @locales.map{|locale| "'#{locale}'"}.join(',')
  93.     @occurrences_relation= @occurrences_relation.joins(:event).joins(
  94.         "INNER JOIN event_texts ON event_texts.event_id = events.id AND event_texts.language IN (#{languages})"
  95.     ).includes(event: :texts)
  96.   end
  97.  
  98.   def collection_edition_conditions!()
  99.     if @collection_edition
  100.       @occurrences_relation= @occurrences_relation.where(['collection_editions.id = ?', @collection_edition])
  101.     end
  102.   end
  103.  
  104.   def category_conditions!()
  105.     if @category
  106.       @occurrences_relation= @occurrences_relation.where(['event_categories.id = ?', @category.id])
  107.     end
  108.   end
  109.  
  110.   def exclude_categories_conditions!()
  111.     if @exclude_categories
  112.       @occurrences_relation= @occurrences_relation.where(
  113.           [
  114.               'event_categories.id NOT IN ( :categories ) OR events.home_control = :control',
  115.               categories: @exclude_categories, control: 'show'
  116.           ]
  117.       )
  118.     end
  119.   end
  120.  
  121. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement