diff --git a/app/controllers/admin/contacts_controller.rb b/app/controllers/admin/contacts_controller.rb index 5156578db..ec8154e93 100644 --- a/app/controllers/admin/contacts_controller.rb +++ b/app/controllers/admin/contacts_controller.rb @@ -10,21 +10,13 @@ class Admin::ContactsController < AdminController search_params[:registrant_domains_id_not_null] = 1 end - @q = Contact.includes(:registrar).joins(:registrar).select('contacts.*, registrars.name').search(search_params) - @contacts = @q.result(distinct: :true).page(params[:page]) - - if params[:statuses_contains] - contacts = Contact.includes(:registrar).joins(:registrar).select('contacts.*, registrars.name').where( - "contacts.statuses @> ?::varchar[]", "{#{params[:statuses_contains].join(',')}}" - ) - else - contacts = Contact.includes(:registrar).joins(:registrar).select('contacts.*, registrars.name') - end + contacts = Contact.includes(:registrar).joins(:registrar).select('contacts.*, registrars.name') + contacts = contacts.filter_by_states(params[:statuses_contains].join(',')) if params[:statuses_contains] contacts = contacts.where("ident_country_code is null or ident_country_code=''") if params[:only_no_country_code].eql?('1') normalize_search_parameters do - @q = contacts.includes(:registrar).joins(:registrar).select('contacts.*, registrars.name').search(search_params) + @q = contacts.search(search_params) @contacts = @q.result.uniq.page(params[:page]) end diff --git a/app/controllers/registrar/contacts_controller.rb b/app/controllers/registrar/contacts_controller.rb index 0581a3cfc..fae23b087 100644 --- a/app/controllers/registrar/contacts_controller.rb +++ b/app/controllers/registrar/contacts_controller.rb @@ -42,13 +42,8 @@ class Registrar::ContactsController < Registrar::DeppController # EPP controller @contacts = Contact.find_by(name: params[:q][:name_matches]) end - if params[:statuses_contains] - contacts = current_user.registrar.contacts.includes(:registrar).where( - "contacts.statuses @> ?::varchar[]", "{#{params[:statuses_contains].join(',')}}" - ) - else - contacts = current_user.registrar.contacts.includes(:registrar) - end + contacts = current_user.registrar.contacts.includes(:registrar) + contacts = contacts.filter_by_states(params[:statuses_contains]) if params[:statuses_contains] normalize_search_parameters do @q = contacts.search(params[:q]) diff --git a/app/models/contact.rb b/app/models/contact.rb index 96b3eae26..b84319982 100644 --- a/app/models/contact.rb +++ b/app/models/contact.rb @@ -172,6 +172,27 @@ class Contact < ActiveRecord::Base ') end + def find_linked + where(' + EXISTS( + select 1 from domains d where d.registrant_id = contacts.id + ) OR EXISTS( + select 1 from domain_contacts dc where dc.contact_id = contacts.id + ) + ') + end + + def filter_by_states in_states + states = Array(in_states).dup + scope = all + + # all contacts has state ok, so no need to filter by it + states.delete(OK) + scope = scope.find_linked if states.delete(LINKED) + scope = scope.where( "contacts.statuses @> ?::varchar[]", "{#{states.join(',')}}") if states.any? + scope + end + # To leave only new ones we need to check # if contact was at any time used in domain. # This can be checked by domain history.