diff options
Diffstat (limited to 'app/controllers/api/v1')
-rw-r--r-- | app/controllers/api/v1/calls_controller.rb | 41 | ||||
-rw-r--r-- | app/controllers/api/v1/phone_book_entries_controller.rb | 77 | ||||
-rw-r--r-- | app/controllers/api/v1/switchboards_controller.rb | 12 |
3 files changed, 126 insertions, 4 deletions
diff --git a/app/controllers/api/v1/calls_controller.rb b/app/controllers/api/v1/calls_controller.rb new file mode 100644 index 0000000..329bd94 --- /dev/null +++ b/app/controllers/api/v1/calls_controller.rb @@ -0,0 +1,41 @@ +module Api + module V1 + class CallsController < ApplicationController + respond_to :json + + def index + @calls = Call.limit(10) + + respond_with @calls + end + + def show + @call = Call.find(params[:id]) + + if params[:transfer_blind] + @call.transfer_blind(params[:transfer_blind]) + else + if params[:transfer_attended] && @call.b_sip_account.phones.first.phone_model.manufacturer.name == 'SNOM Technology AG' + phone = @call.b_sip_account.phones.first + ip_address = phone.ip_address + http_user = phone.http_user + http_password = phone.http_password + + # Hold + open("http://#{ip_address}/command.htm?key=F_HOLD", :http_basic_authentication=>[http_user, http_password]) + + # Call the other party + (0..(params[:transfer_attended].length - 1)).each do |i| + digit = params[:transfer_attended][i] + open("http://#{ip_address}/command.htm?key=#{digit}", :http_basic_authentication=>[http_user, http_password]) + end + open("http://#{ip_address}/command.htm?key=ENTER", :http_basic_authentication=>[http_user, http_password]) + end + end + + respond_with @call + end + + end + end +end diff --git a/app/controllers/api/v1/phone_book_entries_controller.rb b/app/controllers/api/v1/phone_book_entries_controller.rb new file mode 100644 index 0000000..6a39623 --- /dev/null +++ b/app/controllers/api/v1/phone_book_entries_controller.rb @@ -0,0 +1,77 @@ +module Api + module V1 + class PhoneBookEntriesController < ApplicationController + respond_to :json + + def index + query = params[:query] + switchboard = Switchboard.find(params[:switchboard_id]) + + return nil if query.blank? + + current_ability = Ability.new(current_user) + phone_book_entries = PhoneBookEntry.accessible_by(current_ability) + + if query.match(/^\+?\d+$/) != nil && switchboard && switchboard.reverse_lookup_activated + # Find by phone number + phone_book_entries_ids = phone_book_entries.map{|entry| entry.id} + found_phone_numbers = PhoneNumber. + where(:phone_numberable_type => 'PhoneBookEntry', :phone_numberable_id => phone_book_entries_ids). + where('number LIKE ?', "#{query}%") + search_result = phone_book_entries.where(:id => found_phone_numbers.map{|entry| entry.phone_numberable_id}) + elsif query.match(/^[\"\'](.*)[\"\']$/) != nil + # The User searched for =>'example'<= so he wants an EXACT search for that. + # This is the fasted and most accurate way of searching. + # The order to search is: last_name, first_name and organization. + # It stops searching as soon as it finds results. + # + query = $1 + search_result = phone_book_entries.where(:last_name => query) + search_result = phone_book_entries.where(:first_name => query) if search_result.blank? + search_result = phone_book_entries.where(:organization => query) if search_result.blank? + + exact_search = true + else + # Search with SQL LIKE + # + search_result = phone_book_entries. + where( '( ( last_name LIKE ? ) OR ( first_name LIKE ? ) OR ( organization LIKE ? ) )', + "#{query}%", "#{query}%", "#{query}%" ) + + exact_search = false + end + + # Let's have a run with our phonetic search. + # + phonetic_query = PhoneBookEntry.koelner_phonetik(query) + phonetic_search_result = phone_book_entries.where(:last_name_phonetic => phonetic_query) + phonetic_search_result = phone_book_entries.where(:first_name_phonetic => phonetic_query) if phonetic_search_result.blank? + phonetic_search_result = phone_book_entries.where(:organization_phonetic => phonetic_query) if phonetic_search_result.blank? + + if phonetic_search_result.blank? + # Let's try the search with SQL LIKE. Just in case. + # + phonetic_search_result = phone_book_entries.where( 'last_name_phonetic LIKE ?', "#{phonetic_query}%" ) + phonetic_search_result = phone_book_entries.where( 'first_name_phonetic LIKE ?', "#{phonetic_query}%" ) if phonetic_search_result.blank? + phonetic_search_result = phone_book_entries.where( 'organization_phonetic LIKE ?', "#{phonetic_query}%" ) if phonetic_search_result.blank? + end + + phonetic_search = true if phonetic_search_result.any? + + phone_book_entries = search_result + + if phone_book_entries.count == 0 && exact_search == false && phonetic_search + phone_book_entries = phonetic_search_result + end + + # Let's sort the results and do pagination. + # + phone_book_entries = phone_book_entries. + order([ :last_name, :first_name, :organization ]).limit(20) + + respond_with phone_book_entries + end + + end + end +end diff --git a/app/controllers/api/v1/switchboards_controller.rb b/app/controllers/api/v1/switchboards_controller.rb index e6996ca..4d6607a 100644 --- a/app/controllers/api/v1/switchboards_controller.rb +++ b/app/controllers/api/v1/switchboards_controller.rb @@ -5,16 +5,20 @@ module Api def index @user = current_user - @switchboards = @user.switchboards + @switchboards = Switchboard.all - respond_with @switchboards + if can? :read, @switchboards + respond_with @switchboards + end end def show @user = current_user - @switchboard = @user.switchboards.find(params[:id]) + @switchboard = Switchboard.find(params[:id]) - respond_with @switchboard + if can? :read, @switchboard + respond_with @switchboard + end end end end |