Nevillealee/cs_prepaid_app

View on GitHub
app/services/size_update.rb

Summary

Maintainability
A
2 hrs
Test Coverage
require Rails.root.join('app', 'helpers','resque_helper.rb')
 
# Class for updating Subscription and attached QUEUED Order sizes
# @param arg [Hash] nested hash (prop_params and line_items) of form data
class SizeUpdate
include ResqueHelper
 
SIZE_PROPERTIES = ['leggings', 'tops', 'sports-jacket', 'sports-bra', 'gloves'].freeze
 
def initialize(arg)
@form_data = arg
@my_user_id = arg["current_user_id"]
end
 
Method `run` has 52 lines of code (exceeds 25 allowed). Consider refactoring.
def run
stream_pre_update
Resque.logger = Logger.new("#{Rails.root}/log/order_size_update.log", 5, 10024000)
Resque.logger.level = Logger::INFO
Resque.logger.info "PARAMS IN ORDERSIZEUPDATE #{@form_data.inspect}"
recharge_token = @form_data["recharge_token"]
recharge_change_header = {
'X-Recharge-Access-Token' => recharge_token,
'Accept' => 'application/json',
'Content-Type' => 'application/json'
}
new_line_items = format_params(@form_data)
order_id = @form_data["order_id"]
my_order = Order.find(order_id)
new_sizes = get_param_sizes(@form_data)
sub_id = new_line_items['subscription_id'].to_i
sub = Subscription.find(sub_id)
 
# Update Subscription in ReCharge api then locally if HTTP 200
Resque.logger.warn("Property Update params sub_id(#{sub_id}) found in DB? #{sub_id == sub.id}")
sub.sizes = new_sizes
sub_litems = {"properties" => sub.properties}.to_json
res1 = HTTParty.put(
"https://api.rechargeapps.com/subscriptions/#{sub_id}",
:headers => recharge_change_header,
:body => sub_litems,
:timeout => 80
)
Resque.logger.info("SUBSCRIPTION(#{sub_id}) update response: #{res1.parsed_response}")
if (res1.code == 200)
sub.save!
Resque.logger.info "New Subscription sizes: #{sub.sizes}"
else
stream_failure
Resque.logger.error "SUB ##{sub.id} WAS NOT UPDATED IN DB OR RECHARGE!!!"
end
 
# Recharge API now changes json data automatically on all future QUEUED Orders
# 'in case you have pre-paid subscription, please use this endpoint since it will
# regenerate json data on all future orders which were not possible until now.'
my_order.sizes_change(new_sizes, sub_id)
my_hash = { "line_items" => reformat_oline_items(my_order.line_items) }
body = my_hash.to_json
res2 = HTTParty.put(
"https://api.rechargeapps.com/orders/#{my_order.id}",
:headers => recharge_change_header,
:body => body,
:timeout => 80
)
Resque.logger.info "ORDER SIZE UPDATE RESPONSE: #{res2}"
if (res2.code == 200)
my_order.save!
Resque.logger.info("New Order sizes: #{my_order.sizes(sub_id)}")
puts "Order size update Done"
stream_complete_update(res2)
else
Resque.logger.error "ORDER ##{my_order.id} WAS NOT UPDATED IN DB OR RECHARGE!!!"
stream_failure(res2)
end
end
 
private
 
# creates hash of sizes from line_item properties
# @param arg [Hash] form data
# @return [Hash] {"leggings"=>"?", "sports-bra"=>"?", "tops"=>"?", "sports-bra"=>"?"}
def get_param_sizes(arg)
parameters = arg["prop_params"]
parameters.select{|p| SIZE_PROPERTIES.include? p}
end
 
def stream_pre_update
ActionCable.server.broadcast "notifications:#{@my_user_id}", {html:
"<div class='alert alert-primary alert-block text-center'>
Sending update sizes request to Recharge API....
</div>"
}
end
 
def stream_complete_update(response)
results = response['order']['line_items'][0]['properties'].select do |hash|
%w{product_collection leggings sports-bra tops sports-jacket}.include? hash['name']
end
 
ActionCable.server.broadcast "notifications:#{@my_user_id}", {html:
"<div class='alert alert-success alert-block text-center'>
Order(#{@form_data['order_id']}) changes now reflected in Recharge: <p>#{results}</p>
*<a href='/customer/orders/#{@form_data['order_id']}'>Order</a> page may require refresh to show updated values
</div>"
}
end
 
def stream_failure(res2)
ActionCable.server.broadcast "notifications:#{@my_user_id}", {html:
"<div class='alert alert-danger alert-block text-center'>
Recharge API Error: #{res2["errors"]}
Please correct error & resubmit Order(#{@form_data['order_id']}) <a href='/customer/orders/#{@form_data['order_id']}'>here</a>
</div>"
}
end
end