Skip to content

Commit

Permalink
Merge pull request #252 from wadetandy/master
Browse files Browse the repository at this point in the history
Change filter_name => inverse_filter
  • Loading branch information
richmolj committed Jul 15, 2020
2 parents eada07c + 72c084e commit 573fd22
Show file tree
Hide file tree
Showing 6 changed files with 63 additions and 16 deletions.
4 changes: 4 additions & 0 deletions lib/graphiti/sideload.rb
Expand Up @@ -132,6 +132,10 @@ def link?
end
end

def link_filter(parents)
base_filter(parents)
end

# The parent resource is a remote,
# AND the sideload is a remote to the same endpoint
def shared_remote?
Expand Down
20 changes: 19 additions & 1 deletion lib/graphiti/sideload/has_many.rb
@@ -1,8 +1,18 @@
class Graphiti::Sideload::HasMany < Graphiti::Sideload
def initialize(name, opts)
@inverse_filter = opts[:inverse_filter]

super(name, opts)
end

def type
:has_many
end

def inverse_filter
@inverse_filter || foreign_key
end

def load_params(parents, query)
query.hash.tap do |hash|
hash[:filter] ||= {}
Expand All @@ -11,11 +21,19 @@ def load_params(parents, query)
end

def base_filter(parents)
{foreign_key => ids_for_parents(parents).join(",")}
{foreign_key => parent_filter(parents)}
end

def link_filter(parents)
{inverse_filter => parent_filter(parents)}
end

private

def parent_filter(parents)
ids_for_parents(parents).join(",")
end

def child_map(children)
children.group_by(&foreign_key)
end
Expand Down
14 changes: 4 additions & 10 deletions lib/graphiti/sideload/many_to_many.rb
@@ -1,10 +1,4 @@
class Graphiti::Sideload::ManyToMany < Graphiti::Sideload::HasMany
def initialize(name, opts)
@filter_name_opt = opts[:filter_name]

super(name, opts)
end

def type
:many_to_many
end
Expand All @@ -17,12 +11,12 @@ def true_foreign_key
foreign_key.values.first
end

def filter_name
@filter_name_opt || true_foreign_key
def inverse_filter
@inverse_filter || true_foreign_key
end

def base_filter(parents)
{filter_name => ids_for_parents(parents).join(",")}
{true_foreign_key => parent_filter(parents)}
end

def infer_foreign_key
Expand All @@ -42,7 +36,7 @@ def apply_belongs_to_many_filter
self_ref = self
fk_type = parent_resource_class.attributes[:id][:type]
fk_type = :hash if polymorphic?
resource_class.filter filter_name, fk_type do
resource_class.filter inverse_filter, fk_type do
eq do |scope, value|
self_ref.belongs_to_many_filter(scope, value)
end
Expand Down
2 changes: 1 addition & 1 deletion lib/graphiti/util/link.rb
Expand Up @@ -60,7 +60,7 @@ def on_demand_links(url)
def params
@params ||= {}.tap do |params|
if @sideload.type != :belongs_to || @sideload.remote?
params[:filter] = @sideload.base_filter([@model])
params[:filter] = @sideload.link_filter([@model])
end

@sideload.params_proc&.call(params, [@model], context)
Expand Down
23 changes: 21 additions & 2 deletions spec/integration/rails/finders_spec.rb
Expand Up @@ -968,6 +968,25 @@ def resource
expect(book).to have_key("alternate_title")
expect(book).to_not have_key("title")
end

context "when a custom inverse_filter is provided" do
before do
Legacy::AuthorResource.class_eval do
has_many :books, inverse_filter: :some_author_id
end
end

after do
Legacy::AuthorResource.class_eval do
has_many :books
end
end

it "still works" do
do_index({include: "books"})
expect(included("books").map(&:id)).to eq([book1.id, book2.id])
end
end
end

context "sideloading belongs_to" do
Expand Down Expand Up @@ -1234,10 +1253,10 @@ def resource
end
end

context "when a custom filter_name is provided" do
context "when a custom inverse_filter is provided" do
before do
Legacy::AuthorResource.class_eval do
many_to_many :hobbies, filter_name: :the_id_of_the_author
many_to_many :hobbies, inverse_filter: :the_id_of_the_author
end
end

Expand Down
16 changes: 14 additions & 2 deletions spec/serialization_spec.rb
Expand Up @@ -1104,6 +1104,18 @@ def positions
end
end

context "and custom filter name is provided" do
before do
resource.has_many :positions, inverse_filter: :person_id
end

it "links correctly" do
render
expect(positions["links"]["related"])
.to eq("/poro/positions?filter[person_id]=1")
end
end

context "opting-out of linking" do
before do
resource.has_many :positions, link: false
Expand Down Expand Up @@ -1303,10 +1315,10 @@ def define_relationship
.to eq("/poro/teams?filter[employee_id]=1")
end

context 'when the filter_name has been overridden' do
context 'when the inverse_filter has been overridden' do
def define_relationship
resource.many_to_many :teams,
filter_name: :the_employee_id,
inverse_filter: :the_employee_id,
resource: team_resource,
foreign_key: {employee_teams: :employee_id}
end
Expand Down

0 comments on commit 573fd22

Please sign in to comment.