From c08113afbe21d0b8d7d7025bb21f36fe233d1142 Mon Sep 17 00:00:00 2001 From: Pramod Date: Wed, 22 Jul 2015 13:05:15 +0530 Subject: [PATCH 1/3] Added response type key path to mailbox user + For calendar item attendee users response_type was not part of MailboxUser#ews_item + Added response_type to MailboxUser#ews_item --- lib/ews/types/item.rb | 6 +++++- lib/ews/types/mailbox_user.rb | 1 + 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/ews/types/item.rb b/lib/ews/types/item.rb index f6016911..673c85ed 100644 --- a/lib/ews/types/item.rb +++ b/lib/ews/types/item.rb @@ -382,7 +382,11 @@ def build_attendees_users(users) return [] if users.nil? users.collect do |u| u[:attendee][:elems].collect do |a| - build_mailbox_user(a[:mailbox][:elems]) if a[:mailbox] + if a[:mailbox] + response_type = u[:attendee][:elems].select{|e| e[:response_type ]}.try(:first) + a[:mailbox][:elems] << response_type if response_type + build_mailbox_user(a[:mailbox][:elems]) + end end end.flatten.compact end diff --git a/lib/ews/types/mailbox_user.rb b/lib/ews/types/mailbox_user.rb index 8db0d6bf..543e51c2 100644 --- a/lib/ews/types/mailbox_user.rb +++ b/lib/ews/types/mailbox_user.rb @@ -28,6 +28,7 @@ class MailboxUser MAILBOX_KEY_PATHS = { name: [:name], email_address: [:email_address], + response_type: [:response_type] } MAILBOX_KEY_TYPES = {} MAILBOX_KEY_ALIAS = { From da16b209e69b08ca09b51b273e9ebc0a1a141189 Mon Sep 17 00:00:00 2001 From: Pramod Date: Tue, 4 Aug 2015 19:50:52 +0530 Subject: [PATCH 2/3] Added contact data parser - Added CONTACT_ITEM_KEY_PATHS and CONTACT_ITEM_KEY_TYPES for Viewpoint::EWS::Types::Contact - Added email_address to resolve an Array of EmailAddress of Viewpoint::EWS::Types::Contact data - Added phone_number to resolve an Array of PhoneNumber of Viewpoint::EWS::Types::Contact data - Added physical_address to resolve an Array of PhysicalAddress of Viewpoint::EWS::Types::Contact data --- lib/ews/types/contact.rb | 56 +++++++++++++++++++++++++++++++ lib/ews/types/email_address.rb | 23 +++++++++++++ lib/ews/types/phone_number.rb | 22 ++++++++++++ lib/ews/types/physical_address.rb | 34 +++++++++++++++++++ lib/viewpoint.rb | 3 ++ 5 files changed, 138 insertions(+) create mode 100644 lib/ews/types/email_address.rb create mode 100644 lib/ews/types/phone_number.rb create mode 100644 lib/ews/types/physical_address.rb diff --git a/lib/ews/types/contact.rb b/lib/ews/types/contact.rb index c68a82f1..2524d1db 100644 --- a/lib/ews/types/contact.rb +++ b/lib/ews/types/contact.rb @@ -3,5 +3,61 @@ class Contact include Viewpoint::EWS include Viewpoint::EWS::Types include Viewpoint::EWS::Types::Item + + CONTACT_ITEM_KEY_PATHS = { + email_addresses: [ :email_addresses, :elems ], + phone_numbers: [ :phone_numbers, :elems ], + physical_addresses: [ :physical_addresses, :elems ], + complete_name: [ :complete_name, :elems ], + company_name: [ :company_name, :text ], + department: [ :department, :text ], + title: [ :job_title, :text ] + } + + CONTACT_ITEM_KEY_TYPES = { + email_addresses: :build_email_addresses, + physical_addresses: :build_addresses, + phone_numbers: :build_phone_numbers, + complete_name: ->(str){ + str.inject({}){|m,o| + m[o.keys.first] = o.values.first[:text]; + m + } + } + } + + private + + def build_addresses(addresses) + return [] if addresses.nil? + elems = addresses.collect do |addrs| + addrs[:entry][:elems] << { address_type: addrs[:entry][:attribs] } + end + build_contact_entity(PhysicalAddress, elems) + end + + def build_email_addresses(emails) + return [] if emails.nil? + elems = emails.collect{ |ele| ele[:entry] } + build_contact_entity(EmailAddress, elems) + end + + def build_phone_numbers(numbers) + return [] if numbers.nil? + elems = numbers.collect{ |ele| ele[:entry] } + build_contact_entity(PhoneNumber, elems) + end + + def build_contact_entity(klass, elems) + elems.collect{ |elem| klass.new(ews, elem) } + end + + def key_types + super.merge(CONTACT_ITEM_KEY_TYPES) + end + + def key_paths + super.merge(CONTACT_ITEM_KEY_PATHS) + end end end diff --git a/lib/ews/types/email_address.rb b/lib/ews/types/email_address.rb new file mode 100644 index 00000000..e03a99c9 --- /dev/null +++ b/lib/ews/types/email_address.rb @@ -0,0 +1,23 @@ +module Viewpoint::EWS::Types + class EmailAddress + include Viewpoint::EWS + include Viewpoint::EWS::Types + + EMAIL_KEY_PATHS = { + email: [ :text ], + name: [ :attribs, :name ], + email_type: [ :attribs, :key ] + } + + def initialize(ews, addresses) + @ews = ews + @ews_item = addresses + end + + private + + def key_paths + super.merge(EMAIL_KEY_PATHS) + end + end +end diff --git a/lib/ews/types/phone_number.rb b/lib/ews/types/phone_number.rb new file mode 100644 index 00000000..5493b72a --- /dev/null +++ b/lib/ews/types/phone_number.rb @@ -0,0 +1,22 @@ +module Viewpoint::EWS::Types + class PhoneNumber + include Viewpoint::EWS + include Viewpoint::EWS::Types + + PHONE_KEY_PATHS = { + phone_number: [ :text ], + phone_type: [ :attribs, :key ] + } + + def initialize(ews, numbers) + @ews = ews + @ews_item = numbers + end + + private + + def key_paths + super.merge(PHONE_KEY_PATHS) + end + end +end diff --git a/lib/ews/types/physical_address.rb b/lib/ews/types/physical_address.rb new file mode 100644 index 00000000..d20634de --- /dev/null +++ b/lib/ews/types/physical_address.rb @@ -0,0 +1,34 @@ +module Viewpoint::EWS::Types + class PhysicalAddress + include Viewpoint::EWS + include Viewpoint::EWS::Types + + ADDRESS_KEY_PATHS = { + street: [ :street, :text ], + city: [ :city, :text ], + state: [ :state, :text ], + country_or_region: [ :country_or_region, :text ], + postal_code: [ :postal_code, :text ], + address_type: [ :address_type, :key ] + } + + def initialize(ews, addresses) + @ews = ews + @ews_item = addresses + simplify! + end + + private + + def simplify! + @ews_item = @ews_item.inject({}){|m,o| + m[o.keys.first] = o.values.first; + m + } + end + + def key_paths + super.merge(ADDRESS_KEY_PATHS) + end + end +end diff --git a/lib/viewpoint.rb b/lib/viewpoint.rb index dfce8991..b93ea106 100644 --- a/lib/viewpoint.rb +++ b/lib/viewpoint.rb @@ -87,6 +87,9 @@ require 'ews/types/out_of_office' require 'ews/types/export_items_response_message' require 'ews/types/post_item' +require 'ews/types/physical_address' +require 'ews/types/email_address' +require 'ews/types/phone_number' # Events require 'ews/types/event' From 09269c71c34372dbac6b0523537ebf97790a7d42 Mon Sep 17 00:00:00 2001 From: Pramod Date: Wed, 5 Aug 2015 18:38:56 +0530 Subject: [PATCH 3/3] Added additiional contact keys in CONTACT_ITEM_KEY_PATHS --- lib/ews/types/contact.rb | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/lib/ews/types/contact.rb b/lib/ews/types/contact.rb index 2524d1db..cfb64452 100644 --- a/lib/ews/types/contact.rb +++ b/lib/ews/types/contact.rb @@ -11,7 +11,14 @@ class Contact complete_name: [ :complete_name, :elems ], company_name: [ :company_name, :text ], department: [ :department, :text ], - title: [ :job_title, :text ] + job_title: [ :job_title, :text ], + birthday: [ :birthday, :text ], + wedding_anniversary: [ :wedding_anniversary, :text ], + business_home_page: [ :business_home_page, :text ], + generation: [ :generation, :text ], + spouse_name: [ :spouse_name, :text ], + surname: [ :surname, :text ] + } CONTACT_ITEM_KEY_TYPES = { @@ -23,7 +30,9 @@ class Contact m[o.keys.first] = o.values.first[:text]; m } - } + }, + birthday: ->(str){ Date.parse(str) }, + wedding_anniversary: ->(str){ Date.parse(str) }, } private