diff --git a/admin/app/admin/jam_ruby_users.rb b/admin/app/admin/jam_ruby_users.rb index 96b28d6e3..563e252b9 100644 --- a/admin/app/admin/jam_ruby_users.rb +++ b/admin/app/admin/jam_ruby_users.rb @@ -699,6 +699,64 @@ ActiveAdmin.register JamRuby::User, :as => 'Users' do end + def user_latency_recommendation + recommendation_params = params[:latency_recommendation] + + offset = recommendation_params[:offset].blank?? 0 : recommendation_params[:offset] + limit = recommendation_params[:limit].blank?? 20 : recommendation_params[:limit] + + is_valid = [ + recommendation_params[:my_user_id], + recommendation_params[:my_public_ip] + ].all?{ |param| + param.present? + } + + if is_valid + instruments = [] + instruments << recommendation_params[:instruments_beginner].reject(&:blank?).map{|i| { id: i, proficiency: 1} } + instruments << recommendation_params[:instruments_advanced].reject(&:blank?).map{|i| { id: i, proficiency: 2} } + instruments << recommendation_params[:instruments_expert].reject(&:blank?).map{|i| { id: i, proficiency: 3} } + instruments.flatten! + genres = recommendation_params[:genres].reject(&:blank?) + wifi = recommendation_params[:wifi] + max_latency = recommendation_params[:max_latency] + + data = { + my_user_id: recommendation_params[:my_user_id], + my_public_ip: recommendation_params[:my_public_ip], + offset: offset, + limit: limit + } + + data.merge!({query: recommendation_params[:query]}) unless recommendation_params[:query].blank? + data.merge!({instruments: instruments}) unless instruments.empty? + data.merge!({genres: genres}) unless genres.empty? + data.merge!({wifi: wifi}) if %w(true false).include?(wifi) + data.merge!({max_latency: max_latency}) unless max_latency.blank? + + latency_url = "#{Rails.application.config.latency_data_host}/recommendations" + uri = URI(latency_url) + + begin + http = Net::HTTP.new(uri.host, uri.port) + http.read_timeout = 5 + http.use_ssl = true if Rails.application.config.latency_data_host.start_with?("https://") + request = Net::HTTP::Post.new(uri.path, 'Content-Type' => 'application/json') + request.body = data.to_json + request["Authorization"] = "Basic #{Rails.application.config.latency_data_host_auth_code}" + response = http.request(request) + @latency_recommendation = response.body + rescue => exception + render text: exception.message + end + + else + flash[:error] = 'Please provide all required fields' + redirect_to admin_latency_recommendation_path + end + end + def user_latencies latency_params = params[:latencies] latency_url = "#{Rails.application.config.latency_data_host}/user_latencies" diff --git a/admin/app/admin/user_latency_recommendation.rb b/admin/app/admin/user_latency_recommendation.rb new file mode 100644 index 000000000..89eac9856 --- /dev/null +++ b/admin/app/admin/user_latency_recommendation.rb @@ -0,0 +1,7 @@ +ActiveAdmin.register_page "Latency Recommendation" do + menu parent: 'Users' + + content :title => "Latency Recommentation" do + render 'admin/users/latency_recommendation_form' + end +end \ No newline at end of file diff --git a/admin/app/assets/javascripts/users.js b/admin/app/assets/javascripts/users.js index 6f12aa939..d5a1816d3 100644 --- a/admin/app/assets/javascripts/users.js +++ b/admin/app/assets/javascripts/users.js @@ -7,39 +7,71 @@ function intToIP(int) { return part4 + "." + part3 + "." + part2 + "." + part1; } -$(document).ready(function() { - $('form#user_latencies_form #latencies_my_user').on('focus', function(){ - $('#latencies_my_user_id').val('') +function handleUserLatencyForm(){ + var $userLatenciesForm = $('form#user_latencies_form'); + var $latenciesMyUser = $userLatenciesForm.find('#latencies_my_user'); + var $latenciesMyUserId = $userLatenciesForm.find('#latencies_my_user_id'); + var $latenciesMyPublicIp = $userLatenciesForm.find('#latencies_my_public_ip'); + + $latenciesMyUser.on('focus', function(){ + $latenciesMyUserId.val('') }); - $('form#user_latencies_form #latencies_my_user').bind('railsAutocomplete.select', function(event, data){ - $('#latencies_my_user_id').val(''); - $('#latencies_my_public_ip').val(''); + $latenciesMyUser.bind('railsAutocomplete.select', function(event, data){ + $latenciesMyUserId.val(''); + $latenciesMyPublicIp.val(''); if(data.item.last_jam_addr){ var ipAddr = intToIP(data.item.last_jam_addr); - $('#latencies_my_public_ip').val(ipAddr); + $latenciesMyPublicIp.val(ipAddr); } - $('#latencies_my_user_id').val(data.item.id); - + $latenciesMyUserId.val(data.item.id); }); - $('form#user_latencies_form #latencies_user_1').bind('railsAutocomplete.select', function(event, data){ - $('#latencies_user_1_id').val(data.item.id); - }) + $userLatenciesForm.find('#latencies_user_1').bind('railsAutocomplete.select', function(event, data){ + $userLatenciesForm.find('#latencies_user_1_id').val(data.item.id); + }); - $('form#user_latencies_form #latencies_user_2').bind('railsAutocomplete.select', function(event, data){ - $('#latencies_user_2_id').val(data.item.id); - }) + $userLatenciesForm.find('#latencies_user_2').bind('railsAutocomplete.select', function(event, data){ + $userLatenciesForm.find('#latencies_user_2_id').val(data.item.id); + }); - $('form#user_latencies_form #latencies_user_3').bind('railsAutocomplete.select', function(event, data){ - $('#latencies_user_3_id').val(data.item.id); - }) + $userLatenciesForm.find('#latencies_user_3').bind('railsAutocomplete.select', function(event, data){ + $userLatenciesForm.find('#latencies_user_3_id').val(data.item.id); + }); - $('form#user_latencies_form #latencies_user_4').bind('railsAutocomplete.select', function(event, data){ - $('#latencies_user_4_id').val(data.item.id); - }) + $userLatenciesForm.find('#latencies_user_4').bind('railsAutocomplete.select', function(event, data){ + $userLatenciesForm.find('#latencies_user_4_id').val(data.item.id); + }); - $('form#user_latencies_form #latencies_user_5').bind('railsAutocomplete.select', function(event, data){ - $('#latencies_user_5_id').val(data.item.id); - }) + $userLatenciesForm.find('#latencies_user_5').bind('railsAutocomplete.select', function(event, data){ + $userLatenciesForm.find('#latencies_user_5_id').val(data.item.id); + }); +} + +function handleLatencyRecommendationForm(){ + var $latencyRecommendationForm = $('form#latency_recommendation_form'); + var $latenciesMyUser = $latencyRecommendationForm.find('#latency_recommendation_my_user'); + var $latenciesMyUserId = $latencyRecommendationForm.find('#latency_recommendation_my_user_id'); + var $latenciesMyPublicIp = $latencyRecommendationForm.find('#latency_recommendation_my_public_ip'); + + $latenciesMyUser.on('focus', function(){ + $latenciesMyUserId.val('') + }); + + $latenciesMyUser.bind('railsAutocomplete.select', function(event, data){ + $latenciesMyUserId.val(''); + $latenciesMyPublicIp.val(''); + if(data.item.last_jam_addr){ + var ipAddr = intToIP(data.item.last_jam_addr); + $latenciesMyPublicIp.val(ipAddr); + } + $latenciesMyUserId.val(data.item.id); + }); + + +} + +$(document).ready(function() { + handleUserLatencyForm(); + handleLatencyRecommendationForm(); }); \ No newline at end of file diff --git a/admin/app/views/admin/users/_latency_recommendation_form.html.erb b/admin/app/views/admin/users/_latency_recommendation_form.html.erb new file mode 100644 index 000000000..eb5528cd2 --- /dev/null +++ b/admin/app/views/admin/users/_latency_recommendation_form.html.erb @@ -0,0 +1,22 @@ +<%= semantic_form_for 'latency_recommendation', url: user_latency_recommendation_admin_users_path, html: {id: 'latency_recommendation_form'} do |f| %> + <%= f.inputs :name => 'Select user', :class => 'inputs' do %> + <%= f.input :my_user, :as => :autocomplete, url: autocomplete_user_email_admin_users_path, label: 'My user name/email' %> + <%= f.input :my_user_id, as: :hidden %> + <%= f.input :my_public_ip, label: 'My user public IP' %> + <% end %> + <%= f.inputs :name => 'Query parameters', :class => 'inputs' do %> + <%= f.input :query, required: false %> + <%= f.input :instruments_beginner, collection: JamRuby::Instrument.all, input_html: { multiple: true }, required: false %> + <%= f.input :instruments_advanced, collection: JamRuby::Instrument.all, input_html: { multiple: true }, required: false %> + <%= f.input :instruments_expert, collection: JamRuby::Instrument.all, input_html: { multiple: true }, required: false %> + <%= f.input :genres, as: :select, collection: JamRuby::Genre.all, input_html: { multiple: true }, required: false %> + <%= f.input :wifi, as: :select, collection: {'Any': 'any', 'Yes': true, 'No': false }, required: false %> + <%= f.input :max_latency, required: false %> + <%= f.input :offset, input_html: { value: 0 } %> + <%= f.input :limit, input_html: { value: 20 } %> + <% end %> + <%= f.actions do %> + <%= f.action :submit, :as => :button, label: 'Submit' %> + <%= f.action :cancel, :as => :link, label: 'Cancel' %> + <% end %> +<% end %> \ No newline at end of file diff --git a/admin/app/views/admin/users/user_latency_recommendation.html.erb b/admin/app/views/admin/users/user_latency_recommendation.html.erb new file mode 100644 index 000000000..3517afb14 --- /dev/null +++ b/admin/app/views/admin/users/user_latency_recommendation.html.erb @@ -0,0 +1 @@ +
<%= JSON.pretty_generate(JSON.parse(@latency_recommendation)) -%>\ No newline at end of file diff --git a/admin/config/routes.rb b/admin/config/routes.rb index 32a0659e3..701629a45 100644 --- a/admin/config/routes.rb +++ b/admin/config/routes.rb @@ -18,6 +18,7 @@ JamAdmin::Application.routes.draw do post :add_school_user, on: :collection patch :add_school_user, on: :member post :user_latencies, on: :collection + post :user_latency_recommendation, on: :collection end end