# frozen_string_literal: true require_relative '../log/loggable' require_relative '../vendors/broad_sign/broad_sign_tokens' require_relative '../vendors/broad_sign/broad_sign_fetch_schedule' require_relative '../vendors/vistar/vistar_tokens' require_relative '../vendors/vistar/vistar_fetch_schedule' module SchedulePipeline class FetchSchedule include Log::Loggable def initialize(in_queue, out_queue, errors) @in_queue = in_queue @out_queue = out_queue @errors = errors end def start @in_queue.subscribe { |msg| process_msg(msg) } end def process_msg(msg) logger.debug("fetch schedule: #{msg}") vendor = msg[:vendor] vendor_fetch = for_vendor(vendor) unless vendor_fetch @errors.push("FetchSchedule: Unknown vendor #{vendor}") return end params = msg[:params] fetched = vendor_fetch.call(params) unless fetched @errors.push("FetchSchedule: No ads returned from vendor #{vendor}") return end Models::ScheduleProcessMsg.new(vendor, params[:player], fetched).push(@out_queue) if fetched true rescue StandardError => e @errors.push(e.message) end private def for_vendor(vendor) vendor_map[vendor&.to_sym] end def vendor_map @vendor_map ||= { broad_sign: Vendors::BroadSign::BroadSignFetchSchedule.new(Vendors::BroadSign::BroadSignTokens.instance), vistar: Vendors::Vistar::VistarFetchSchedule.new(Vendors::Vistar::VistarTokens.instance) } end end end