# frozen_string_literal: true require_relative '../log/loggable' require_relative 'errors' require_relative 'publish_schedule' require_relative 'process_schedule' require_relative 'fetch_schedule' module SchedulePipeline # Schedule Processing Pipeline class SchedulePipeline include Log::Loggable def initialize(queue_factory) errors = Errors.new processed_schedules_queue = queue_factory.for_name(:processed_schedules) publish_schedule = PublishSchedule.new(processed_schedules_queue, errors) unprocessed_schedules_queue = queue_factory.for_name(:unprocessed_schedules) process_schedule = ProcessSchedule.new(unprocessed_schedules_queue, processed_schedules_queue, errors) fetch_schedule_queue = queue_factory.for_name(:fetch_vendor_schedules) fetch_schedule = FetchSchedule.new(fetch_schedule_queue, unprocessed_schedules_queue, errors) @queues = [processed_schedules_queue, unprocessed_schedules_queue, fetch_schedule_queue] @stages = [publish_schedule, process_schedule, fetch_schedule] end def start stages.each(&:start) logger.info "Started Schedule Pipeline" end def stop stages.reverse_each(&:stop) end private def stages @stages end def queues @queues end end end