Split search / filter logic into service