Create RelatedEntity.fetch method
This commit is contained in:
parent
473450c34a
commit
c92624d926
3 changed files with 33 additions and 7 deletions
|
|
@ -24,6 +24,18 @@ module DiasporaFederation
|
||||||
# @return [RelatedEntity] parent entity
|
# @return [RelatedEntity] parent entity
|
||||||
entity :parent, Entities::RelatedEntity, default: nil
|
entity :parent, Entities::RelatedEntity, default: nil
|
||||||
|
|
||||||
|
# Get related entity from the backend or fetch it from remote if not available locally
|
||||||
|
# @return [RelatedEntity] fetched related entity
|
||||||
|
def self.fetch(author, type, guid)
|
||||||
|
# Try to fetch locally
|
||||||
|
entity = DiasporaFederation.callbacks.trigger(:fetch_related_entity, type, guid)
|
||||||
|
return entity if entity
|
||||||
|
|
||||||
|
# Fetch and receive entity from remote if not available locally
|
||||||
|
Federation::Fetcher.fetch_public(author, type, guid)
|
||||||
|
DiasporaFederation.callbacks.trigger(:fetch_related_entity, type, guid)
|
||||||
|
end
|
||||||
|
|
||||||
# never add {RelatedEntity} to xml
|
# never add {RelatedEntity} to xml
|
||||||
def to_xml
|
def to_xml
|
||||||
nil
|
nil
|
||||||
|
|
|
||||||
|
|
@ -193,13 +193,7 @@ module DiasporaFederation
|
||||||
raise DiasporaFederation::Entity::ValidationError, "invalid #{self}! missing 'parent_guid'."
|
raise DiasporaFederation::Entity::ValidationError, "invalid #{self}! missing 'parent_guid'."
|
||||||
}
|
}
|
||||||
|
|
||||||
data[:parent] = DiasporaFederation.callbacks.trigger(:fetch_related_entity, type, guid)
|
data[:parent] = RelatedEntity.fetch(data[:author], type, guid)
|
||||||
|
|
||||||
return if data[:parent]
|
|
||||||
|
|
||||||
# Fetch and receive parent from remote, if not available locally
|
|
||||||
Federation::Fetcher.fetch_public(data[:author], type, guid)
|
|
||||||
data[:parent] = DiasporaFederation.callbacks.trigger(:fetch_related_entity, type, guid)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def xml_parser_class
|
def xml_parser_class
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,26 @@ module DiasporaFederation
|
||||||
|
|
||||||
it_behaves_like "an Entity subclass"
|
it_behaves_like "an Entity subclass"
|
||||||
|
|
||||||
|
describe ".fetch" do
|
||||||
|
let(:guid) { Fabricate.sequence(:guid) }
|
||||||
|
let(:entity) { Fabricate(:related_entity) }
|
||||||
|
|
||||||
|
it "fetches the entity from the backend" do
|
||||||
|
expect_callback(:fetch_related_entity, "Entity", guid).and_return(entity)
|
||||||
|
expect(Federation::Fetcher).not_to receive(:fetch_public)
|
||||||
|
|
||||||
|
expect(described_class.fetch(entity.author, "Entity", guid)).to eq(entity)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "fetches the entity from remote if not found on backend" do
|
||||||
|
expect_callback(:fetch_related_entity, "Entity", guid).ordered.and_return(nil)
|
||||||
|
expect(Federation::Fetcher).to receive(:fetch_public).ordered.with(entity.author, "Entity", guid)
|
||||||
|
expect_callback(:fetch_related_entity, "Entity", guid).ordered.and_return(entity)
|
||||||
|
|
||||||
|
expect(described_class.fetch(entity.author, "Entity", guid)).to eq(entity)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
describe "#to_xml" do
|
describe "#to_xml" do
|
||||||
it "returns nil" do
|
it "returns nil" do
|
||||||
expect(described_class.new(data).to_xml).to be_nil
|
expect(described_class.new(data).to_xml).to be_nil
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue