diff --git a/admin/app/admin/jam_ruby_users.rb b/admin/app/admin/jam_ruby_users.rb index 432de438b..96b28d6e3 100644 --- a/admin/app/admin/jam_ruby_users.rb +++ b/admin/app/admin/jam_ruby_users.rb @@ -637,10 +637,10 @@ ActiveAdmin.register JamRuby::User, :as => 'Users' do controller do # this actually searches on first name, last name, and email, because of get_autocomplete_items defined below - autocomplete :user, :email, :full => true, :display_value => :autocomplete_display_name + autocomplete :user, :email, :full => true, :display_value => :autocomplete_display_name, extra_data: [:last_jam_addr] def get_autocomplete_items(parameters) - User.select("email, first_name, last_name, id").where(["email ILIKE ? OR first_name ILIKE ? OR last_name ILIKE ?", "%#{parameters[:term]}%", "%#{parameters[:term]}%", "%#{parameters[:term]}%"]) + User.select("email, first_name, last_name, id, last_jam_addr").where(["email ILIKE ? OR first_name ILIKE ? OR last_name ILIKE ?", "%#{parameters[:term]}%", "%#{parameters[:term]}%", "%#{parameters[:term]}%"]) end @@ -698,6 +698,39 @@ ActiveAdmin.register JamRuby::User, :as => 'Users' do redirect_to edit_admin_user_path(@user) end + + def user_latencies + latency_params = params[:latencies] + latency_url = "#{Rails.application.config.latency_data_host}/user_latencies" + uri = URI(latency_url) + if not ([latency_params[:my_user_id], latency_params[:my_public_ip], latency_params[:user_1_id]]).any?{|param| param.blank? } + user_ids = [latency_params[:user_1_id]] + user_ids.push(latency_params[:user_2_id]) unless latency_params[:user_2_id].blank? + user_ids.push(latency_params[:user_3_id]) unless latency_params[:user_3_id].blank? + user_ids.push(latency_params[:user_4_id]) unless latency_params[:user_4_id].blank? + user_ids.push(latency_params[:user_5_id]) unless latency_params[:user_5_id].blank? + 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 = { + my_user_id: latency_params[:my_user_id], + my_public_ip: latency_params[:my_public_ip], + users: user_ids + }.to_json + request["Authorization"] = "Basic #{Rails.application.config.latency_data_host_auth_code}" + response = http.request(request) + @user_latencies = response.body + #render text: JSON.pretty_generate(@user_latencies) + rescue => e + render text: e.message + end + else + flash[:error] = 'Please provide all required fields' + redirect_to admin_latency_between_users_path + end + end end end \ No newline at end of file diff --git a/admin/app/admin/user_latencies.rb b/admin/app/admin/user_latencies.rb new file mode 100644 index 000000000..3be625e39 --- /dev/null +++ b/admin/app/admin/user_latencies.rb @@ -0,0 +1,7 @@ +ActiveAdmin.register_page "Latency Between Users" do + menu parent: 'Users' + + content :title => "Latency Between Users" do + render 'admin/users/users_latency_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 new file mode 100644 index 000000000..6f12aa939 --- /dev/null +++ b/admin/app/assets/javascripts/users.js @@ -0,0 +1,45 @@ +function intToIP(int) { + var part1 = int & 255; + var part2 = ((int >> 8) & 255); + var part3 = ((int >> 16) & 255); + var part4 = ((int >> 24) & 255); + + return part4 + "." + part3 + "." + part2 + "." + part1; +} + +$(document).ready(function() { + $('form#user_latencies_form #latencies_my_user').on('focus', function(){ + $('#latencies_my_user_id').val('') + }); + + $('form#user_latencies_form #latencies_my_user').bind('railsAutocomplete.select', function(event, data){ + $('#latencies_my_user_id').val(''); + $('#latencies_my_public_ip').val(''); + if(data.item.last_jam_addr){ + var ipAddr = intToIP(data.item.last_jam_addr); + $('#latencies_my_public_ip').val(ipAddr); + } + $('#latencies_my_user_id').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); + }) + + $('form#user_latencies_form #latencies_user_2').bind('railsAutocomplete.select', function(event, data){ + $('#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); + }) + + $('form#user_latencies_form #latencies_user_4').bind('railsAutocomplete.select', function(event, data){ + $('#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); + }) +}); \ No newline at end of file diff --git a/admin/app/views/admin/users/_users_latency_form.html.erb b/admin/app/views/admin/users/_users_latency_form.html.erb new file mode 100644 index 000000000..aa5da7dd1 --- /dev/null +++ b/admin/app/views/admin/users/_users_latency_form.html.erb @@ -0,0 +1,23 @@ +<%= semantic_form_for 'latencies', url: user_latencies_admin_users_path, html: {id: 'user_latencies_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 => 'Select other users', :class => 'inputs' do %> + <%= f.input :user_1, :as => :autocomplete, url: autocomplete_user_email_admin_users_path, label: 'Other user 1' %> + <%= f.input :user_1_id, as: :hidden %> + <%= f.input :user_2, :as => :autocomplete, url: autocomplete_user_email_admin_users_path, label: 'Other user 2', required: false %> + <%= f.input :user_2_id, as: :hidden %> + <%= f.input :user_3, :as => :autocomplete, url: autocomplete_user_email_admin_users_path, label: 'Other user 3', required: false %> + <%= f.input :user_3_id, as: :hidden %> + <%= f.input :user_4, :as => :autocomplete, url: autocomplete_user_email_admin_users_path, label: 'Other user 4', required: false %> + <%= f.input :user_4_id, as: :hidden %> + <%= f.input :user_5, :as => :autocomplete, url: autocomplete_user_email_admin_users_path, label: 'Other user 5', required: false %> + <%= f.input :user_5_id, as: :hidden %> + <% 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_latencies.html.erb b/admin/app/views/admin/users/user_latencies.html.erb new file mode 100644 index 000000000..9f8fccd62 --- /dev/null +++ b/admin/app/views/admin/users/user_latencies.html.erb @@ -0,0 +1 @@ +
<%= JSON.pretty_generate(JSON.parse(@user_latencies)) -%>\ No newline at end of file diff --git a/admin/config/environments/development.rb b/admin/config/environments/development.rb index f9895b612..2d0595cd7 100644 --- a/admin/config/environments/development.rb +++ b/admin/config/environments/development.rb @@ -46,4 +46,7 @@ JamAdmin::Application.configure do config.email_generic_from = 'nobody-dev@jamkazam.com' config.email_alerts_alias = 'alerts-dev@jamkazam.com' config.email_social_alias = 'social-dev@jamkazam.com' + + config.latency_data_host = "http://localhost:4001/local" + config.latency_data_host_auth_code = "c2VydmVyOnBhc3N3b3Jk" end diff --git a/admin/config/routes.rb b/admin/config/routes.rb index ef2322257..32a0659e3 100644 --- a/admin/config/routes.rb +++ b/admin/config/routes.rb @@ -17,6 +17,7 @@ JamAdmin::Application.routes.draw do get :add_school_user, on: :collection post :add_school_user, on: :collection patch :add_school_user, on: :member + post :user_latencies, on: :collection end end diff --git a/ruby/.gitignore b/ruby/.gitignore index fe1f4d2c5..eef8128f0 100644 --- a/ruby/.gitignore +++ b/ruby/.gitignore @@ -23,3 +23,4 @@ vendor *.swp *.iml .byebug_history +.ruby-version