create new Contact entity

* replaces Request entity (better name)
* with following/sharing state
* should also be used as retraction-type

see #32
This commit is contained in:
Benjamin Neff 2016-03-22 02:18:33 +01:00
parent 20675b941a
commit ef43104880
10 changed files with 168 additions and 27 deletions

View file

@ -15,20 +15,27 @@ require "diaspora_federation/entities/relayable"
# types # types
require "diaspora_federation/entities/profile" require "diaspora_federation/entities/profile"
require "diaspora_federation/entities/person" require "diaspora_federation/entities/person"
require "diaspora_federation/entities/location" require "diaspora_federation/entities/contact"
require "diaspora_federation/entities/photo" require "diaspora_federation/entities/account_deletion"
require "diaspora_federation/entities/poll_answer"
require "diaspora_federation/entities/poll"
require "diaspora_federation/entities/status_message"
require "diaspora_federation/entities/request"
require "diaspora_federation/entities/participation" require "diaspora_federation/entities/participation"
require "diaspora_federation/entities/like" require "diaspora_federation/entities/like"
require "diaspora_federation/entities/comment" require "diaspora_federation/entities/comment"
require "diaspora_federation/entities/account_deletion" require "diaspora_federation/entities/poll_answer"
require "diaspora_federation/entities/poll"
require "diaspora_federation/entities/poll_participation"
require "diaspora_federation/entities/location"
require "diaspora_federation/entities/photo"
require "diaspora_federation/entities/status_message"
require "diaspora_federation/entities/reshare"
require "diaspora_federation/entities/message" require "diaspora_federation/entities/message"
require "diaspora_federation/entities/conversation" require "diaspora_federation/entities/conversation"
require "diaspora_federation/entities/relayable_retraction"
require "diaspora_federation/entities/reshare"
require "diaspora_federation/entities/retraction" require "diaspora_federation/entities/retraction"
# deprecated
require "diaspora_federation/entities/request"
require "diaspora_federation/entities/signed_retraction" require "diaspora_federation/entities/signed_retraction"
require "diaspora_federation/entities/poll_participation" require "diaspora_federation/entities/relayable_retraction"

View file

@ -0,0 +1,29 @@
module DiasporaFederation
module Entities
# this entity represents a contact with another person. A user issues it
# when he starts sharing/following with another user.
#
# @see Validators::ContactValidator
class Contact < Entity
# @!attribute [r] author
# The diaspora ID of the person who shares his profile
# @see Person#author
# @return [String] sender ID
property :author
# @!attribute [r] recipient
# The diaspora ID of the person who will be shared with
# @see Validation::Rule::DiasporaId
# @return [String] recipient ID
property :recipient
# @!attribute [r] following
# @return [Boolean] if the author is following the person
property :following, default: true
# @!attribute [r] sharing
# @return [Boolean] if the author is sharing with the person
property :sharing, default: true
end
end
end

View file

@ -4,6 +4,7 @@ module DiasporaFederation
# when he starts sharing with another user. # when he starts sharing with another user.
# #
# @see Validators::RequestValidator # @see Validators::RequestValidator
# @deprecated will be replaced with {Contact}
class Request < Entity class Request < Entity
# @!attribute [r] author # @!attribute [r] author
# The diaspora ID of the person who shares his profile # The diaspora ID of the person who shares his profile
@ -16,6 +17,19 @@ module DiasporaFederation
# @see Validation::Rule::DiasporaId # @see Validation::Rule::DiasporaId
# @return [String] recipient ID # @return [String] recipient ID
property :recipient, xml_name: :recipient_handle property :recipient, xml_name: :recipient_handle
# use only {Contact} for receive
# @return [Contact] instance as contact
def to_contact
Contact.new(author: author, recipient: recipient)
end
# @param [Nokogiri::XML::Element] root_node xml nodes
# @return [Retraction] instance
def self.populate_entity(root_node)
super(root_node).to_contact
end
private_class_method :populate_entity
end end
end end
end end

View file

@ -109,6 +109,13 @@ module DiasporaFederation
recipient { generate(:diaspora_id) } recipient { generate(:diaspora_id) }
end end
factory :contact_entity, class: DiasporaFederation::Entities::Contact do
author { generate(:diaspora_id) }
recipient { generate(:diaspora_id) }
following true
sharing true
end
factory :comment_entity, class: DiasporaFederation::Entities::Comment, parent: :relayable_entity do factory :comment_entity, class: DiasporaFederation::Entities::Comment, parent: :relayable_entity do
author { generate(:diaspora_id) } author { generate(:diaspora_id) }
guid guid

View file

@ -19,11 +19,11 @@ end
require "diaspora_federation/validators/rules/birthday" require "diaspora_federation/validators/rules/birthday"
require "diaspora_federation/validators/rules/boolean" require "diaspora_federation/validators/rules/boolean"
require "diaspora_federation/validators/rules/diaspora_id" require "diaspora_federation/validators/rules/diaspora_id"
require "diaspora_federation/validators/rules/diaspora_id_count"
require "diaspora_federation/validators/rules/guid" require "diaspora_federation/validators/rules/guid"
require "diaspora_federation/validators/rules/not_nil" require "diaspora_federation/validators/rules/not_nil"
require "diaspora_federation/validators/rules/public_key" require "diaspora_federation/validators/rules/public_key"
require "diaspora_federation/validators/rules/tag_count" require "diaspora_federation/validators/rules/tag_count"
require "diaspora_federation/validators/rules/diaspora_id_count"
module DiasporaFederation module DiasporaFederation
# Validators to perform basic sanity-checks on {DiasporaFederation::Entities federation entities}. # Validators to perform basic sanity-checks on {DiasporaFederation::Entities federation entities}.
@ -34,25 +34,31 @@ module DiasporaFederation
end end
end end
# abstract types
require "diaspora_federation/validators/relayable_validator" require "diaspora_federation/validators/relayable_validator"
require "diaspora_federation/validators/h_card_validator"
require "diaspora_federation/validators/person_validator" # types
require "diaspora_federation/validators/profile_validator"
require "diaspora_federation/validators/web_finger_validator"
require "diaspora_federation/validators/request_validator"
require "diaspora_federation/validators/photo_validator"
require "diaspora_federation/validators/location_validator"
require "diaspora_federation/validators/status_message_validator"
require "diaspora_federation/validators/participation_validator"
require "diaspora_federation/validators/like_validator"
require "diaspora_federation/validators/comment_validator"
require "diaspora_federation/validators/account_deletion_validator" require "diaspora_federation/validators/account_deletion_validator"
require "diaspora_federation/validators/message_validator" require "diaspora_federation/validators/comment_validator"
require "diaspora_federation/validators/contact_validator"
require "diaspora_federation/validators/conversation_validator" require "diaspora_federation/validators/conversation_validator"
require "diaspora_federation/validators/relayable_retraction_validator" require "diaspora_federation/validators/h_card_validator"
require "diaspora_federation/validators/like_validator"
require "diaspora_federation/validators/location_validator"
require "diaspora_federation/validators/message_validator"
require "diaspora_federation/validators/participation_validator"
require "diaspora_federation/validators/person_validator"
require "diaspora_federation/validators/photo_validator"
require "diaspora_federation/validators/poll_answer_validator"
require "diaspora_federation/validators/poll_participation_validator"
require "diaspora_federation/validators/poll_validator"
require "diaspora_federation/validators/profile_validator"
require "diaspora_federation/validators/reshare_validator" require "diaspora_federation/validators/reshare_validator"
require "diaspora_federation/validators/retraction_validator" require "diaspora_federation/validators/retraction_validator"
require "diaspora_federation/validators/status_message_validator"
require "diaspora_federation/validators/web_finger_validator"
# deprecated
require "diaspora_federation/validators/relayable_retraction_validator"
require "diaspora_federation/validators/request_validator"
require "diaspora_federation/validators/signed_retraction_validator" require "diaspora_federation/validators/signed_retraction_validator"
require "diaspora_federation/validators/poll_answer_validator"
require "diaspora_federation/validators/poll_validator"
require "diaspora_federation/validators/poll_participation_validator"

View file

@ -0,0 +1,13 @@
module DiasporaFederation
module Validators
# This validates a {Entities::Contact}
class ContactValidator < Validation::Validator
include Validation
rule :author, %i(not_empty diaspora_id)
rule :recipient, %i(not_empty diaspora_id)
rule :following, :boolean
rule :sharing, :boolean
end
end
end

View file

@ -1,6 +1,7 @@
module DiasporaFederation module DiasporaFederation
module Validators module Validators
# This validates a {Entities::Request} # This validates a {Entities::Request}
# @deprecated the {Entities::Request} will be replaced with {Entities::Contact}
class RequestValidator < Validation::Validator class RequestValidator < Validation::Validator
include Validation include Validation

View file

@ -0,0 +1,20 @@
module DiasporaFederation
describe Entities::Contact do
let(:data) { FactoryGirl.attributes_for(:contact_entity) }
let(:xml) {
<<-XML
<contact>
<author>#{data[:author]}</author>
<recipient>#{data[:recipient]}</recipient>
<following>#{data[:following]}</following>
<sharing>#{data[:sharing]}</sharing>
</contact>
XML
}
it_behaves_like "an Entity subclass"
it_behaves_like "an XML Entity"
end
end

View file

@ -14,5 +14,25 @@ XML
it_behaves_like "an Entity subclass" it_behaves_like "an Entity subclass"
it_behaves_like "an XML Entity" it_behaves_like "an XML Entity"
describe "#to_contact" do
it "copies the attributes to a Contact" do
request = FactoryGirl.build(:request_entity)
contact = request.to_contact
expect(contact).to be_a(Entities::Contact)
expect(contact.author).to eq(request.author)
expect(contact.recipient).to eq(request.recipient)
expect(contact.following).to be_truthy
expect(contact.sharing).to be_truthy
end
end
context "parse contact" do
it "parses the xml as a contact" do
contact = Entities::Request.from_xml(Nokogiri::XML::Document.parse(xml).root)
expect(contact).to be_a(Entities::Contact)
end
end
end end
end end

View file

@ -0,0 +1,24 @@
module DiasporaFederation
describe Validators::ContactValidator do
let(:entity) { :contact_entity }
it_behaves_like "a common validator"
%i(author recipient).each do |prop|
describe "##{prop}" do
it_behaves_like "a diaspora id validator" do
let(:property) { prop }
let(:mandatory) { true }
end
end
end
%i(following sharing).each do |prop|
describe "##{prop}" do
it_behaves_like "a boolean validator" do
let(:property) { prop }
end
end
end
end
end