Initial commit
This commit is contained in:
85
app/services/schedule_pipeline/process_schedule.rb
Normal file
85
app/services/schedule_pipeline/process_schedule.rb
Normal file
@@ -0,0 +1,85 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require_relative '../log/loggable'
|
||||
require_relative '../vle/vle_settings'
|
||||
require_relative '../vle/vle_create_asset'
|
||||
require_relative '../vle/vle_ingest_asset'
|
||||
require_relative '../vendors/broad_sign/broad_sign_transform_schedule'
|
||||
require_relative '../vendors/vistar/vistar_transform_schedule'
|
||||
require_relative '../auth/auth_token_service'
|
||||
require 'auth/client/request/auth_aware_request'
|
||||
|
||||
module SchedulePipeline
|
||||
class ProcessSchedule
|
||||
include Log::Loggable
|
||||
|
||||
def initialize(in_queue, out_queue, errors, tokens = Auth::AuthTokenService.instance)
|
||||
@in_queue = in_queue
|
||||
@out_queue = out_queue
|
||||
@errors = errors
|
||||
@tokens = tokens
|
||||
end
|
||||
|
||||
def start
|
||||
@in_queue.subscribe do |msg|
|
||||
msg = Models::ScheduleProcessMsg.from_hash(msg) if msg.is_a? Hash
|
||||
process_msg(msg)
|
||||
end
|
||||
end
|
||||
|
||||
def process_msg(msg)
|
||||
logger.info("Process Schedule")
|
||||
|
||||
vendor = msg.vendor
|
||||
schedule_transform = for_vendor(vendor)
|
||||
unless schedule_transform
|
||||
@errors.push("ProcessSchedule: Unknown vendor #{vendor}")
|
||||
return
|
||||
end
|
||||
|
||||
content_map = []
|
||||
msg.vendor_schedule[:contents].each do |content|
|
||||
# TODO: optimization: first check whether the content has already been ingested into VLE
|
||||
vle_asset = create_asset(content)[:asset]
|
||||
content_map << vle_asset
|
||||
ingest_content(content, vle_asset[:meta][:presigned_url])
|
||||
end
|
||||
|
||||
schedule = schedule_transform.call(vendor, msg.player, msg.vendor_schedule, content_map)
|
||||
@out_queue.push(schedule)
|
||||
true
|
||||
rescue StandardError => e
|
||||
@errors.push(e.message)
|
||||
end
|
||||
|
||||
private
|
||||
def create_asset(content)
|
||||
sanitized_name = content[:name].gsub(/\s+/, '_')
|
||||
Auth::Client::Request::AuthAwareRequest.new(
|
||||
Vle::VleCreateAsset.new(
|
||||
{
|
||||
name: sanitized_name,
|
||||
file: sanitized_name,
|
||||
project_id: Vle::VleSettings.instance.target_project
|
||||
}
|
||||
),
|
||||
@tokens
|
||||
).call
|
||||
end
|
||||
|
||||
def ingest_content(content, destination)
|
||||
Vle::VleIngestAsset.new.call(content, destination)
|
||||
end
|
||||
|
||||
def for_vendor(vendor)
|
||||
vendor_map[vendor&.to_sym]
|
||||
end
|
||||
|
||||
def vendor_map
|
||||
@vendor_map ||= {
|
||||
broad_sign: Vendors::BroadSign::BroadSignTransformSchedule.new,
|
||||
vistar: Vendors::Vistar::VistarTransformSchedule.new
|
||||
}
|
||||
end
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user