fellowshipone-api 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +3 -0
  3. data/.ruby-gemset +1 -0
  4. data/.ruby-version +1 -0
  5. data/Gemfile +14 -0
  6. data/Gemfile.lock +64 -0
  7. data/README.rdoc +44 -0
  8. data/Rakefile +32 -0
  9. data/fellowshipone_api.gemspec +25 -0
  10. data/lib/api/api_object.rb +141 -0
  11. data/lib/api/communication.rb +59 -0
  12. data/lib/api/contribution.rb +97 -0
  13. data/lib/api/contribution_list.rb +57 -0
  14. data/lib/api/fund.rb +40 -0
  15. data/lib/api/fund_list.rb +53 -0
  16. data/lib/api/household.rb +50 -0
  17. data/lib/api/household_list.rb +78 -0
  18. data/lib/api/member_household_list.rb +73 -0
  19. data/lib/api/mergeable_household_list.rb +79 -0
  20. data/lib/api/mergeable_person_list.rb +110 -0
  21. data/lib/api/person.rb +169 -0
  22. data/lib/api/person_list.rb +85 -0
  23. data/lib/api/search.rb +55 -0
  24. data/lib/auto_load.rb +17 -0
  25. data/lib/common.rb +76 -0
  26. data/lib/exceptions.rb +5 -0
  27. data/lib/fellowship_one.rb +54 -0
  28. data/lib/oauth_monkey_patch.rb +13 -0
  29. data/lib/readers/api_reader.rb +34 -0
  30. data/lib/readers/communication_reader.rb +19 -0
  31. data/lib/readers/contribution_list_reader.rb +37 -0
  32. data/lib/readers/contribution_reader.rb +18 -0
  33. data/lib/readers/fund_list_reader.rb +13 -0
  34. data/lib/readers/fund_reader.rb +14 -0
  35. data/lib/readers/household_list_reader.rb +62 -0
  36. data/lib/readers/household_reader.rb +18 -0
  37. data/lib/readers/member_household_list_reader.rb +27 -0
  38. data/lib/readers/person_list_reader.rb +37 -0
  39. data/lib/readers/person_reader.rb +20 -0
  40. data/lib/writers/api_writer.rb +64 -0
  41. data/lib/writers/communication_writer.rb +27 -0
  42. data/lib/writers/contribution_writer.rb +28 -0
  43. data/lib/writers/household_writer.rb +30 -0
  44. data/lib/writers/person_writer.rb +64 -0
  45. data/spec/api/person_spec.rb +21 -0
  46. data/spec/functional/fellowship_one_spec.rb +17 -0
  47. data/spec/readers/api_reader_spec.rb +7 -0
  48. data/spec/spec_helper.rb +47 -0
  49. data/spec/vcr_setup.rb +5 -0
  50. data/spec/writers/api_writer_spec.rb +7 -0
  51. metadata +129 -0
@@ -0,0 +1,13 @@
1
+ #
2
+ # small monkey patch for the oauth-ruby gem,
3
+ # for compatibility with typhoeus > 0.5.0
4
+ #
5
+ module OAuth::RequestProxy::Typhoeus
6
+ class Request < OAuth::RequestProxy::Base
7
+
8
+ def method
9
+ request.options[:method].to_s.upcase
10
+ end
11
+
12
+ end
13
+ end
@@ -0,0 +1,34 @@
1
+ module FellowshipOne
2
+
3
+ # This adapter is the standard for all loading objects.
4
+ class ApiReader
5
+ attr_reader :headers
6
+
7
+ # Retrieve an empty resource with the proper structure.
8
+ #
9
+ # @return a new empty resource.
10
+ def load_new
11
+ return if @url_new_data_path.nil?
12
+ return _load_data(@url_new_data_path, {})
13
+ end
14
+
15
+ # Loads the list
16
+ #
17
+ # @return the data loaded in a JSON object.
18
+ def load_feed
19
+ @url_data_params ||= {}
20
+ return _load_data(@url_data_path, @url_data_params)
21
+ end
22
+
23
+ private
24
+
25
+ def _load_data(url_data_path, url_data_params)
26
+ response = FellowshipOne::api_request(:get, url_data_path, url_data_params)
27
+ data = JSON.parse(response.body)
28
+ @headers = response.headers
29
+ return data.keys == ['results'] ? data['results'] : data
30
+ end
31
+
32
+ end
33
+
34
+ end
@@ -0,0 +1,19 @@
1
+ module FellowshipOne
2
+
3
+ class CommunicationReader < ApiReader
4
+
5
+ # Constructor.
6
+ #
7
+ # @param person_id The ID of the person to load the communication for.
8
+ # @param communication_id (optional) The ID of the communication to load.
9
+ def initialize(person_id, communication_id)
10
+ if communication_id.nil?
11
+ @url_new_data_path = "/v1/People/#{person_id}/Communications/new"
12
+ else
13
+ @url_data_path = "/v1/People/#{person_id}/Communications/#{communication_id}"
14
+ end
15
+ end
16
+
17
+ end
18
+
19
+ end
@@ -0,0 +1,37 @@
1
+ module FellowshipOne
2
+
3
+ class ContributionListReader < ApiReader
4
+
5
+ # Constructor.
6
+ #
7
+ # Options:
8
+ # :page - (optional) The page number to get. The default is 1.
9
+ # :per_page - (optional) The number of items to return per page.
10
+ # :individual_id - (optional) search for receipts containing the individualID that is passed with this parameter.
11
+ # :household_id - (optional) search for receipts containing the householdID that is passed with this parameter.
12
+ # :start_date - (optional) search for receipts with a received date greater than or equal to this parameter.
13
+ # :end_date - (optional) search for receipts with a received date less than or equal to this parameter. Must be used in conjunction with startReceivedDate.
14
+ def initialize(options = {})
15
+ page = options[:page] || 1
16
+ per_page = options[:per_page] || 500
17
+
18
+ @url_data_params = {}
19
+ @url_data_path = '/giving/v1/contributionreceipts/search'
20
+ if options[:household_id].nil? and
21
+ options[:individual_id].nil? and
22
+ options[:start_date].nil? and
23
+ options[:end_date].nil? and
24
+ @url_data_path = '/giving/v1/contributionreceipts'
25
+ end
26
+
27
+ @url_data_params.merge!({:page => page}) if page
28
+ @url_data_params.merge!({:recordsPerPage => per_page}) if per_page
29
+ @url_data_params.merge!({:individualID => options[:individual_id]}) if options[:individual_id]
30
+ @url_data_params.merge!({:householdID => options[:household_id]}) if options[:household_id]
31
+ @url_data_params.merge!({:startReceivedDate => options[:start_date]}) if options[:start_date]
32
+ @url_data_params.merge!({:endReceivedDate => options[:end_date]}) if options[:end_date]
33
+ end
34
+
35
+ end
36
+
37
+ end
@@ -0,0 +1,18 @@
1
+ module FellowshipOne
2
+
3
+ class ContributionReader < ApiReader
4
+
5
+ # Constructor.
6
+ #
7
+ # @param contribution_id (optional) The ID of the contribution to load.
8
+ def initialize(contribution_id = nil)
9
+ if contribution_id.nil?
10
+ @url_new_data_path = '/giving/v1/contributionreceipts/new'
11
+ else
12
+ @url_data_path = "/giving/v1/contributionreceipts/#{contribution_id}"
13
+ end
14
+ end
15
+
16
+ end
17
+
18
+ end
@@ -0,0 +1,13 @@
1
+ module FellowshipOne
2
+
3
+ class FundListReader < ApiReader
4
+
5
+ # Constructor.
6
+ def initialize(options = {})
7
+ @url_data_params = options[:url_data_params]
8
+ @url_data_path = options[:url_data_path] || "/giving/v1/funds"
9
+ end
10
+
11
+ end
12
+
13
+ end
@@ -0,0 +1,14 @@
1
+ module FellowshipOne
2
+
3
+ class FundReader < ApiReader
4
+
5
+ # Constructor.
6
+ #
7
+ # @param fund_id The ID of the fund to load.
8
+ def initialize(fund_id)
9
+ @url_data_path = "/giving/v1/funds/#{fund_id}"
10
+ end
11
+
12
+ end
13
+
14
+ end
@@ -0,0 +1,62 @@
1
+ module FellowshipOne
2
+
3
+ class HouseholdListReader < ApiReader
4
+
5
+ # Constructor.
6
+ #
7
+ # Options:
8
+ # :page - (optional) The page number to get.
9
+ # :per_page - (optional) The number of items to return per page.
10
+ # :household_id - The household ID to pull the info for.
11
+ # :search_for - (optional) Search for name in the request.
12
+ def initialize(options = {})
13
+ raise 'Household ID not specified' if options[:household_id].nil? and options[:search_for].nil?
14
+
15
+ page = options[:page] || 1
16
+ per_page = options[:per_page] || 100
17
+
18
+ @url_data_params = {}
19
+ @url_data_path = options[:search_for].nil? ? "/v1/Households/#{options[:household_id].to_i}/People" : '/v1/Households/Search'
20
+
21
+ @url_data_params.merge!({:page => page}) if page
22
+ @url_data_params.merge!({:recordsPerPage => per_page}) if per_page
23
+ @url_data_params.merge!({:search_for => options[:search_for]}) if options[:search_for]
24
+ end
25
+
26
+ end
27
+
28
+ end
29
+
30
+
31
+ ######### This will be refactored later.
32
+
33
+
34
+ # # Constructor.
35
+ # #
36
+ # # Options:
37
+ # # :page - (optional) The page number to get.
38
+ # #
39
+ # # Only one of the optional parameters below can be specified.
40
+ # # :search_for - (optional) This parameter will be used as: parameter.searchfor like household.householdName.
41
+ # # :last_activity_date - (optional) This parameter will be used as: parameter.lastActivityDate >= household.lastActivityDate.
42
+ # # :last_updated_date - (optional) This parameter will be used as: parameter.lastUpdatedDate >= household.lastUpdatedDate.
43
+ # # :created_date - (optional) This parameter will be used as: parameter.createdDate >= household.createdDate.
44
+ # def initialize(options = {})
45
+ # page = options[:page] || 1
46
+
47
+ # @url_data_params = {:page => page}
48
+ # @url_data_path = '/v1/Households/Search'
49
+
50
+ # @url_data_params.merge!({:page => page}) if page
51
+ # if options[:search_for]
52
+ # @url_data_params.merge!({:searchfor => options[:search_for]})
53
+ # elsif options[:last_activity_date]
54
+ # @url_data_params.merge!({:lastActivityDate => options[:last_activity_date]})
55
+ # elsif options[:last_updated_date]
56
+ # @url_data_params.merge!({:lastUpdatedDate => options[:last_updated_date]})
57
+ # elsif options[:created_date]
58
+ # @url_data_params.merge!({:createdDate => options[:created_date]})
59
+ # end
60
+ # ....
61
+ # end
62
+
@@ -0,0 +1,18 @@
1
+ module FellowshipOne
2
+
3
+ class HouseholdReader < ApiReader
4
+
5
+ # Constructor.
6
+ #
7
+ # @param household_id (optional) The ID of the household to load.
8
+ def initialize(household_id = nil)
9
+ if household_id.nil?
10
+ @url_new_data_path = '/v1/Households/New'
11
+ else
12
+ @url_data_path = "/v1/Households/#{household_id}"
13
+ end
14
+ end
15
+
16
+ end
17
+
18
+ end
@@ -0,0 +1,27 @@
1
+ module FellowshipOne
2
+
3
+ class MemberHouseholdListReader < ApiReader
4
+
5
+ # Constructor.
6
+ #
7
+ # Options:
8
+ # :page - (optional) The page number to get.
9
+ # :filter - (optional) Filter options for the request.
10
+ # :household_id - The household ID to pull the info for.
11
+ def initialize(options = {})
12
+ raise 'Household ID not specified' if options[:household_id].nil?
13
+
14
+ page = options[:page] || 1
15
+ filter = options[:filter]
16
+ household_id = options[:household_id]
17
+
18
+ @url_data_params = options[:url_data_params] || {}
19
+ @url_data_path = options[:url_data_path] || "/v1/Households/#{household_id}/People"
20
+
21
+ @url_data_params.merge!({:page => page}) if page
22
+ @url_data_params.merge!({:filter => filter}) if filter
23
+ end
24
+
25
+ end
26
+
27
+ end
@@ -0,0 +1,37 @@
1
+ module FellowshipOne
2
+
3
+ class PersonListReader < ApiReader
4
+
5
+ # Constructor.
6
+ #
7
+ # Options:
8
+ # :page - (optional) The page number to get. The default is 1.
9
+ # :per_page - (optional) The number of items to return per page.
10
+ # :search_for - (optional) Search for name in the request.
11
+ # :created_date - (optional) Search for those created on or after specified date.
12
+ #
13
+ # ** search params are mutually exclusive and cannot be used with any other search parameters
14
+ def initialize(options = {})
15
+ page = options[:page] || 1
16
+ per_page = options[:per_page] || 100
17
+
18
+ @url_data_params = {}
19
+ @url_data_path = '/v1/People/Search'
20
+ if options[:search_for].nil? and
21
+ options[:communication].nil? and
22
+ options[:created_date].nil? and
23
+ options[:hsdid].nil?
24
+ @url_data_path = '/v1/People'
25
+ end
26
+
27
+ @url_data_params.merge!({:page => page, :include => 'addresses,communications'}) if page
28
+ @url_data_params.merge!({:recordsPerPage => per_page}) if per_page
29
+ @url_data_params.merge!({:hsdid => options[:hsdid]}) if options[:hsdid]
30
+ @url_data_params.merge!({:searchFor => options[:search_for]}) if options[:search_for]
31
+ @url_data_params.merge!({:communication => options[:communication]}) if options[:communication]
32
+ @url_data_params.merge!({:createdDate => options[:created_date]}) if options[:created_date]
33
+ end
34
+
35
+ end
36
+
37
+ end
@@ -0,0 +1,20 @@
1
+ module FellowshipOne
2
+
3
+ class PersonReader < ApiReader
4
+
5
+ # Constructor.
6
+ #
7
+ # @param person_id (optional) The ID of the person to load.
8
+ def initialize(person_id = nil)
9
+ if person_id.nil?
10
+ @url_new_data_path = '/v1/People/New'
11
+ else
12
+ @url_data_path = "/v1/People/#{person_id}"
13
+ end
14
+ end
15
+
16
+ end
17
+
18
+ end
19
+
20
+
@@ -0,0 +1,64 @@
1
+ module FellowshipOne
2
+
3
+ # This adapter is the standard for all saving objects.
4
+ class ApiWriter
5
+ attr_reader :error_messages, :response_code
6
+
7
+ # Saves this object.
8
+ #
9
+ # @return True or ID on success, otherwise false.
10
+ def save_object
11
+ @url_data_params ||= {}
12
+ success = true
13
+
14
+ if @url_data_path.nil?
15
+ @error_messages = ["#{@url_action.to_s.upcase} not implemented for #{self.class.to_s}"]
16
+ return false
17
+ end
18
+
19
+ if @updatable_fields and !@updatable_fields.empty?
20
+ # fields_to_remove = @url_data_params.keys - @updatable_fields
21
+ # fields_to_remove.each { |ftr| @url_data_params.delete(ftr) }
22
+ end
23
+
24
+ begin
25
+ response = FellowshipOne::api_request(@url_action, @url_data_path, [], @url_data_params.to_json)
26
+ @response_code = response.code
27
+ # No content but is a success
28
+ success = response.code == 204 ? {'success' => true} : JSON.parse(response.body)
29
+ rescue Exception => e
30
+ @error_messages = e.message.split(',')
31
+ success = false
32
+ end
33
+
34
+ return success
35
+ end
36
+
37
+
38
+ # Deletes this object.
39
+ #
40
+ # @return True or ID on success, otherwise false.
41
+ def delete_object
42
+ success = true
43
+
44
+ if @url_data_delete_path.nil?
45
+ @error_messages = ["DELETE not implemented for #{self.class.to_s}"]
46
+ return false
47
+ end
48
+
49
+ begin
50
+ # @url_data_path should be the same as :put if this object is already
51
+ # setup and mapped to an object that exists
52
+ response = FellowshipOne::api_request(:delete, @url_data_delete_path)
53
+ success = response.code == 204 ? true : false # No content but is a success
54
+ rescue Exception => e
55
+ @error_messages = e.message.split(',')
56
+ success = false
57
+ end
58
+
59
+ return success
60
+ end
61
+
62
+ end
63
+
64
+ end
@@ -0,0 +1,27 @@
1
+ module FellowshipOne
2
+
3
+ class CommunicationWriter < ApiWriter
4
+
5
+ # Constructor.
6
+ # Note: writer will get data after it has been mapped to the FellowshipOne
7
+ # resource so the hash keys will be the same as FellowshipOne
8
+ #
9
+ # @param data The json object data to save.
10
+ def initialize(data)
11
+ if data[:id]
12
+ @url_action = :put
13
+ @url_data_path = "/v1/People/#{data['person']['@id']}/Communications/#{data['@id']}"
14
+ else
15
+ @url_action = :post
16
+ @url_data_path = "/v1/People/#{data['person']['@id']}/Communications"
17
+ end
18
+ @url_data_delete_path = "/v1/Communications/#{data['@id']}"
19
+
20
+ @url_data_params = @url_data_params = {:communication => data}
21
+
22
+ @updatable_fields = []
23
+ end
24
+
25
+ end
26
+
27
+ end
@@ -0,0 +1,28 @@
1
+ module FellowshipOne
2
+
3
+ class ContributionWriter < ApiWriter
4
+
5
+ # Constructor.
6
+ #
7
+ # @param data The json object data to save.
8
+ def initialize(data)
9
+ if data[:id]
10
+ @url_action = :put
11
+ @url_data_path = "/giving/v1/contributionreceipts/#{data[:id]}"
12
+ else
13
+ @url_action = :post
14
+ @url_data_path = "/giving/v1/contributionreceipts"
15
+ end
16
+ @url_data_delete_path = "/giving/v1/contributionreceipts/#{data[:id]}"
17
+
18
+ @url_data_params = @url_data_params = {:contributionReceipt => data}
19
+
20
+ @updatable_fields = [:amount,
21
+ :fund, #required
22
+ :received_date, #required
23
+ :contribution_type] #required
24
+ end
25
+
26
+ end
27
+
28
+ end