diff --git a/lib/diaspora_federation/entities.rb b/lib/diaspora_federation/entities.rb index 96c5957..d932167 100644 --- a/lib/diaspora_federation/entities.rb +++ b/lib/diaspora_federation/entities.rb @@ -15,20 +15,27 @@ require "diaspora_federation/entities/relayable" # types require "diaspora_federation/entities/profile" require "diaspora_federation/entities/person" -require "diaspora_federation/entities/location" -require "diaspora_federation/entities/photo" -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/contact" +require "diaspora_federation/entities/account_deletion" + require "diaspora_federation/entities/participation" require "diaspora_federation/entities/like" 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/conversation" -require "diaspora_federation/entities/relayable_retraction" -require "diaspora_federation/entities/reshare" + require "diaspora_federation/entities/retraction" + +# deprecated +require "diaspora_federation/entities/request" require "diaspora_federation/entities/signed_retraction" -require "diaspora_federation/entities/poll_participation" +require "diaspora_federation/entities/relayable_retraction" diff --git a/lib/diaspora_federation/entities/contact.rb b/lib/diaspora_federation/entities/contact.rb new file mode 100644 index 0000000..4f2b20f --- /dev/null +++ b/lib/diaspora_federation/entities/contact.rb @@ -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 diff --git a/lib/diaspora_federation/entities/request.rb b/lib/diaspora_federation/entities/request.rb index 5ed2857..bf76b4e 100644 --- a/lib/diaspora_federation/entities/request.rb +++ b/lib/diaspora_federation/entities/request.rb @@ -4,6 +4,7 @@ module DiasporaFederation # when he starts sharing with another user. # # @see Validators::RequestValidator + # @deprecated will be replaced with {Contact} class Request < Entity # @!attribute [r] author # The diaspora ID of the person who shares his profile @@ -16,6 +17,19 @@ module DiasporaFederation # @see Validation::Rule::DiasporaId # @return [String] recipient ID 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 diff --git a/lib/diaspora_federation/test/factories.rb b/lib/diaspora_federation/test/factories.rb index 80456f9..8ebee42 100644 --- a/lib/diaspora_federation/test/factories.rb +++ b/lib/diaspora_federation/test/factories.rb @@ -109,6 +109,13 @@ module DiasporaFederation recipient { generate(:diaspora_id) } 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 author { generate(:diaspora_id) } guid diff --git a/lib/diaspora_federation/validators.rb b/lib/diaspora_federation/validators.rb index 57e7ace..3a88845 100644 --- a/lib/diaspora_federation/validators.rb +++ b/lib/diaspora_federation/validators.rb @@ -19,11 +19,11 @@ end require "diaspora_federation/validators/rules/birthday" require "diaspora_federation/validators/rules/boolean" 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/not_nil" require "diaspora_federation/validators/rules/public_key" require "diaspora_federation/validators/rules/tag_count" -require "diaspora_federation/validators/rules/diaspora_id_count" module DiasporaFederation # Validators to perform basic sanity-checks on {DiasporaFederation::Entities federation entities}. @@ -34,25 +34,31 @@ module DiasporaFederation end end +# abstract types require "diaspora_federation/validators/relayable_validator" -require "diaspora_federation/validators/h_card_validator" -require "diaspora_federation/validators/person_validator" -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" + +# types 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/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/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/poll_answer_validator" -require "diaspora_federation/validators/poll_validator" -require "diaspora_federation/validators/poll_participation_validator" diff --git a/lib/diaspora_federation/validators/contact_validator.rb b/lib/diaspora_federation/validators/contact_validator.rb new file mode 100644 index 0000000..5923cd3 --- /dev/null +++ b/lib/diaspora_federation/validators/contact_validator.rb @@ -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 diff --git a/lib/diaspora_federation/validators/request_validator.rb b/lib/diaspora_federation/validators/request_validator.rb index 78b12a8..3f7f5c6 100644 --- a/lib/diaspora_federation/validators/request_validator.rb +++ b/lib/diaspora_federation/validators/request_validator.rb @@ -1,6 +1,7 @@ module DiasporaFederation module Validators # This validates a {Entities::Request} + # @deprecated the {Entities::Request} will be replaced with {Entities::Contact} class RequestValidator < Validation::Validator include Validation diff --git a/spec/lib/diaspora_federation/entities/contact_spec.rb b/spec/lib/diaspora_federation/entities/contact_spec.rb new file mode 100644 index 0000000..46310ed --- /dev/null +++ b/spec/lib/diaspora_federation/entities/contact_spec.rb @@ -0,0 +1,20 @@ +module DiasporaFederation + describe Entities::Contact do + let(:data) { FactoryGirl.attributes_for(:contact_entity) } + + let(:xml) { + <<-XML + + #{data[:author]} + #{data[:recipient]} + #{data[:following]} + #{data[:sharing]} + +XML + } + + it_behaves_like "an Entity subclass" + + it_behaves_like "an XML Entity" + end +end diff --git a/spec/lib/diaspora_federation/entities/request_spec.rb b/spec/lib/diaspora_federation/entities/request_spec.rb index 957592e..43300ee 100644 --- a/spec/lib/diaspora_federation/entities/request_spec.rb +++ b/spec/lib/diaspora_federation/entities/request_spec.rb @@ -14,5 +14,25 @@ XML it_behaves_like "an Entity subclass" 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 diff --git a/spec/lib/diaspora_federation/validators/contact_validator_spec.rb b/spec/lib/diaspora_federation/validators/contact_validator_spec.rb new file mode 100644 index 0000000..128dd0e --- /dev/null +++ b/spec/lib/diaspora_federation/validators/contact_validator_spec.rb @@ -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