flexmls_api 0.4.5 → 0.6.4
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +2 -17
- data/Gemfile.lock +35 -27
- data/README.md +23 -1
- data/Rakefile +18 -5
- data/VERSION +1 -1
- data/bin/flexmls_api +8 -0
- data/lib/flexmls_api.rb +2 -0
- data/lib/flexmls_api/authentication.rb +5 -6
- data/lib/flexmls_api/authentication/api_auth.rb +4 -2
- data/lib/flexmls_api/authentication/oauth2.rb +51 -99
- data/lib/flexmls_api/authentication/oauth2_impl/grant_type_base.rb +85 -0
- data/lib/flexmls_api/authentication/oauth2_impl/grant_type_code.rb +48 -0
- data/lib/flexmls_api/authentication/oauth2_impl/grant_type_password.rb +45 -0
- data/lib/flexmls_api/authentication/oauth2_impl/grant_type_refresh.rb +36 -0
- data/lib/flexmls_api/authentication/oauth2_impl/middleware.rb +39 -0
- data/lib/flexmls_api/cli.rb +132 -0
- data/lib/flexmls_api/cli/api_auth.rb +8 -0
- data/lib/flexmls_api/cli/oauth2.rb +43 -0
- data/lib/flexmls_api/cli/setup.rb +44 -0
- data/lib/flexmls_api/configuration.rb +6 -6
- data/lib/flexmls_api/faraday.rb +11 -21
- data/lib/flexmls_api/models.rb +3 -0
- data/lib/flexmls_api/models/account.rb +48 -5
- data/lib/flexmls_api/models/base.rb +27 -2
- data/lib/flexmls_api/models/contact.rb +28 -9
- data/lib/flexmls_api/models/listing_cart.rb +72 -0
- data/lib/flexmls_api/models/note.rb +0 -2
- data/lib/flexmls_api/models/saved_search.rb +16 -0
- data/lib/flexmls_api/models/shared_listing.rb +35 -0
- data/lib/flexmls_api/multi_client.rb +37 -0
- data/lib/flexmls_api/paginate.rb +5 -0
- data/lib/flexmls_api/request.rb +7 -3
- data/script/console +6 -0
- data/script/example.rb +27 -0
- data/spec/fixtures/accounts/all.json +160 -0
- data/spec/fixtures/accounts/my.json +74 -0
- data/spec/fixtures/accounts/my_portal.json +20 -0
- data/spec/fixtures/accounts/my_put.json +5 -0
- data/spec/fixtures/accounts/my_save.json +5 -0
- data/spec/fixtures/accounts/office.json +142 -0
- data/spec/fixtures/base.json +13 -0
- data/spec/fixtures/contact_my.json +19 -0
- data/spec/fixtures/contact_new.json +11 -0
- data/spec/fixtures/contact_new_empty.json +8 -0
- data/spec/fixtures/contact_new_notify.json +11 -0
- data/spec/fixtures/contact_tags.json +11 -0
- data/spec/fixtures/contacts.json +6 -3
- data/spec/fixtures/contacts_post.json +10 -0
- data/spec/fixtures/empty.json +3 -0
- data/spec/fixtures/errors/failure.json +5 -0
- data/spec/fixtures/listing_cart.json +19 -0
- data/spec/fixtures/listing_cart_add_listing.json +13 -0
- data/spec/fixtures/listing_cart_add_listing_post.json +5 -0
- data/spec/fixtures/listing_cart_empty.json +5 -0
- data/spec/fixtures/listing_cart_new.json +12 -0
- data/spec/fixtures/listing_cart_post.json +10 -0
- data/spec/fixtures/listing_cart_remove_listing.json +13 -0
- data/spec/fixtures/note_new.json +5 -0
- data/spec/fixtures/{oauth2_access.json → oauth2/access.json} +0 -0
- data/spec/fixtures/oauth2/access_with_old_refresh.json +5 -0
- data/spec/fixtures/oauth2/access_with_refresh.json +5 -0
- data/spec/fixtures/oauth2/authorization_code_body.json +7 -0
- data/spec/fixtures/oauth2/error.json +3 -0
- data/spec/fixtures/oauth2/password_body.json +7 -0
- data/spec/fixtures/oauth2/refresh_body.json +7 -0
- data/spec/fixtures/saved_search.json +17 -0
- data/spec/fixtures/shared_listing_new.json +9 -0
- data/spec/fixtures/shared_listing_post.json +10 -0
- data/spec/mock_helper.rb +123 -0
- data/spec/oauth2_helper.rb +69 -0
- data/spec/spec_helper.rb +1 -57
- data/spec/unit/flexmls_api/authentication/api_auth_spec.rb +1 -0
- data/spec/unit/flexmls_api/authentication/oauth2_impl/grant_type_base_spec.rb +10 -0
- data/spec/unit/flexmls_api/authentication/oauth2_spec.rb +74 -79
- data/spec/unit/flexmls_api/configuration_spec.rb +25 -4
- data/spec/unit/flexmls_api/models/account_spec.rb +152 -85
- data/spec/unit/flexmls_api/models/base_spec.rb +69 -25
- data/spec/unit/flexmls_api/models/contact_spec.rb +48 -34
- data/spec/unit/flexmls_api/models/document_spec.rb +1 -7
- data/spec/unit/flexmls_api/models/listing_cart_spec.rb +114 -0
- data/spec/unit/flexmls_api/models/listing_spec.rb +8 -56
- data/spec/unit/flexmls_api/models/note_spec.rb +8 -38
- data/spec/unit/flexmls_api/models/photo_spec.rb +1 -11
- data/spec/unit/flexmls_api/models/saved_search_spec.rb +34 -0
- data/spec/unit/flexmls_api/models/shared_listing_spec.rb +30 -0
- data/spec/unit/flexmls_api/models/standard_fields_spec.rb +50 -30
- data/spec/unit/flexmls_api/models/tour_of_home_spec.rb +1 -7
- data/spec/unit/flexmls_api/models/video_spec.rb +1 -10
- data/spec/unit/flexmls_api/models/virtual_tour_spec.rb +1 -7
- data/spec/unit/flexmls_api/multi_client_spec.rb +48 -0
- data/spec/unit/flexmls_api/request_spec.rb +42 -5
- metadata +239 -93
- data/spec/unit/flexmls_api/standard_fields_spec.rb +0 -86
@@ -0,0 +1,44 @@
|
|
1
|
+
require "rubygems"
|
2
|
+
require 'pp'
|
3
|
+
|
4
|
+
if ENV["FLEXMLS_API_CONSOLE"].nil?
|
5
|
+
require 'flexmls_api'
|
6
|
+
else
|
7
|
+
puts "Enabling console mode for local gem"
|
8
|
+
Bundler.require(:default, "development") if defined?(Bundler)
|
9
|
+
path = File.expand_path(File.dirname(__FILE__) + "/../../../lib/")
|
10
|
+
$LOAD_PATH.unshift(path) unless $LOAD_PATH.include?(path)
|
11
|
+
require path + '/flexmls_api'
|
12
|
+
end
|
13
|
+
|
14
|
+
IRB.conf[:AUTO_INDENT]=true
|
15
|
+
IRB.conf[:PROMPT][:FLEXMLS]= {
|
16
|
+
:PROMPT_I => "flexmlsApi:%03n:%i> ",
|
17
|
+
:PROMPT_S => "flexmlsApi:%03n:%i%l ",
|
18
|
+
:PROMPT_C => "flexmlsApi:%03n:%i* ",
|
19
|
+
:RETURN => "%s\n"
|
20
|
+
}
|
21
|
+
|
22
|
+
IRB.conf[:PROMPT_MODE] = :FLEXMLS
|
23
|
+
|
24
|
+
path = File.expand_path(File.dirname(__FILE__) + "/../../../lib/")
|
25
|
+
$LOAD_PATH.unshift(path) unless $LOAD_PATH.include?(path)
|
26
|
+
require path + '/flexmls_api'
|
27
|
+
|
28
|
+
module FlexmlsApi
|
29
|
+
def self.logger
|
30
|
+
if @logger.nil?
|
31
|
+
@logger = Logger.new(STDOUT)
|
32
|
+
@logger.level = ENV["VERBOSE"].nil? ? Logger::WARN : Logger::DEBUG
|
33
|
+
end
|
34
|
+
@logger
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
FlexmlsApi.logger.info("Client configured!")
|
39
|
+
|
40
|
+
include FlexmlsApi::Models
|
41
|
+
|
42
|
+
def c
|
43
|
+
FlexmlsApi.client
|
44
|
+
end
|
@@ -2,7 +2,7 @@ module FlexmlsApi
|
|
2
2
|
module Configuration
|
3
3
|
# valid configuration options
|
4
4
|
VALID_OPTION_KEYS = [:api_key, :api_secret, :api_user, :endpoint, :user_agent, :version, :ssl, :oauth2_provider, :authentication_mode].freeze
|
5
|
-
|
5
|
+
|
6
6
|
DEFAULT_API_KEY = nil
|
7
7
|
DEFAULT_API_SECRET = nil
|
8
8
|
DEFAULT_API_USER = nil
|
@@ -11,6 +11,8 @@ module FlexmlsApi
|
|
11
11
|
DEFAULT_USER_AGENT = "flexmls API Ruby Gem #{VERSION}"
|
12
12
|
DEFAULT_SSL = false
|
13
13
|
DEFAULT_OAUTH2 = nil
|
14
|
+
|
15
|
+
X_FLEXMLS_API_USER_AGENT = "X-flexmlsApi-User-Agent"
|
14
16
|
|
15
17
|
attr_accessor *VALID_OPTION_KEYS
|
16
18
|
def configure
|
@@ -21,24 +23,22 @@ module FlexmlsApi
|
|
21
23
|
base.reset_configuration
|
22
24
|
end
|
23
25
|
|
24
|
-
|
25
26
|
def options
|
26
27
|
VALID_OPTION_KEYS.inject({}) do |opt,key|
|
27
28
|
opt.merge(key => send(key))
|
28
29
|
end
|
29
30
|
end
|
30
31
|
|
31
|
-
|
32
32
|
def reset_configuration
|
33
33
|
self.api_key = DEFAULT_API_KEY
|
34
34
|
self.api_secret = DEFAULT_API_SECRET
|
35
35
|
self.api_user = DEFAULT_API_USER
|
36
|
+
self.authentication_mode = FlexmlsApi::Authentication::ApiAuth
|
36
37
|
self.endpoint = DEFAULT_ENDPOINT
|
37
|
-
self.
|
38
|
+
self.oauth2_provider = DEFAULT_OAUTH2
|
38
39
|
self.user_agent = DEFAULT_USER_AGENT
|
39
40
|
self.ssl = DEFAULT_SSL
|
40
|
-
self.
|
41
|
-
self.authentication_mode = FlexmlsApi::Authentication::ApiAuth
|
41
|
+
self.version = DEFAULT_VERSION
|
42
42
|
self
|
43
43
|
end
|
44
44
|
end
|
data/lib/flexmls_api/faraday.rb
CHANGED
@@ -2,21 +2,12 @@ module FlexmlsApi
|
|
2
2
|
module FaradayExt
|
3
3
|
#=Flexmls API Faraday middleware
|
4
4
|
# HTTP Response after filter to package api responses and bubble up basic api errors.
|
5
|
-
class FlexmlsMiddleware < Faraday::Response::
|
6
|
-
begin
|
7
|
-
def self.register_on_complete(env)
|
8
|
-
env[:response].on_complete do |finished_env|
|
9
|
-
validate_and_build_response(finished_env)
|
10
|
-
end
|
11
|
-
end
|
12
|
-
rescue LoadError, NameError => e
|
13
|
-
self.load_error = e
|
14
|
-
end
|
5
|
+
class FlexmlsMiddleware < Faraday::Response::ParseJson
|
15
6
|
|
16
7
|
# Handles pretty much all the api response parsing and error handling. All responses that
|
17
8
|
# indicate a failure will raise a FlexmlsApi::ClientError exception
|
18
|
-
def
|
19
|
-
body = finished_env[:body]
|
9
|
+
def on_complete(finished_env)
|
10
|
+
body = parse(finished_env[:body])
|
20
11
|
FlexmlsApi.logger.debug("Response Body: #{body.inspect}")
|
21
12
|
unless body.is_a?(Hash) && body.key?("D")
|
22
13
|
raise InvalidResponse, "The server response could not be understood"
|
@@ -24,30 +15,29 @@ module FlexmlsApi
|
|
24
15
|
response = ApiResponse.new body
|
25
16
|
case finished_env[:status]
|
26
17
|
when 400, 409
|
27
|
-
raise BadResourceRequest.
|
18
|
+
raise BadResourceRequest, {:message => response.message, :code => response.code, :status => finished_env[:status]}
|
28
19
|
when 401
|
29
20
|
# Handle the WWW-Authenticate Response Header Field if present. This can be returned by
|
30
21
|
# OAuth2 implementations and wouldn't hurt to log.
|
31
22
|
auth_header_error = finished_env[:request_headers]["WWW-Authenticate"]
|
32
23
|
FlexmlsApi.logger.warn("Authentication error #{auth_header_error}") unless auth_header_error.nil?
|
33
|
-
raise PermissionDenied.
|
24
|
+
raise PermissionDenied, {:message => response.message, :code => response.code, :status => finished_env[:status]}
|
34
25
|
when 404
|
35
|
-
raise NotFound.
|
26
|
+
raise NotFound, {:message => response.message, :code => response.code, :status => finished_env[:status]}
|
36
27
|
when 405
|
37
|
-
|
28
|
+
raise NotAllowed, {:message => response.message, :code => response.code, :status => finished_env[:status]}
|
38
29
|
when 500
|
39
|
-
raise ClientError.
|
30
|
+
raise ClientError, {:message => response.message, :code => response.code, :status => finished_env[:status]}
|
40
31
|
when 200..299
|
41
32
|
FlexmlsApi.logger.debug("Success!")
|
42
33
|
else
|
43
|
-
raise ClientError.
|
34
|
+
raise ClientError, {:message => response.message, :code => response.code, :status => finished_env[:status]}
|
44
35
|
end
|
45
36
|
finished_env[:body] = response
|
46
37
|
end
|
47
|
-
|
38
|
+
|
48
39
|
def initialize(app)
|
49
|
-
super
|
50
|
-
@parser = nil
|
40
|
+
super(app)
|
51
41
|
end
|
52
42
|
|
53
43
|
end
|
data/lib/flexmls_api/models.rb
CHANGED
@@ -17,6 +17,9 @@ require File.expand_path('../models/tour_of_home', __FILE__)
|
|
17
17
|
require File.expand_path('../models/virtual_tour', __FILE__)
|
18
18
|
require File.expand_path('../models/document', __FILE__)
|
19
19
|
require File.expand_path('../models/note', __FILE__)
|
20
|
+
require File.expand_path('../models/listing_cart.rb', __FILE__)
|
21
|
+
require File.expand_path('../models/shared_listing.rb', __FILE__)
|
22
|
+
require File.expand_path('../models/saved_search.rb', __FILE__)
|
20
23
|
|
21
24
|
module FlexmlsApi
|
22
25
|
module Models
|
@@ -1,22 +1,65 @@
|
|
1
1
|
module FlexmlsApi
|
2
2
|
module Models
|
3
3
|
class Account < Base
|
4
|
+
extend Finders
|
4
5
|
self.element_name="accounts"
|
5
6
|
|
6
7
|
SUBELEMENTS = [:emails, :phones, :websites, :addresses, :images]
|
7
|
-
attr_accessor *SUBELEMENTS
|
8
|
+
attr_accessor :my_account, *SUBELEMENTS
|
8
9
|
|
9
10
|
def initialize(attributes={})
|
10
11
|
@emails = subresource(Email, "Emails", attributes)
|
11
12
|
@phones = subresource(Phone, "Phones", attributes)
|
12
13
|
@websites = subresource(Website, "Websites", attributes)
|
13
14
|
@addresses = subresource(Address, "Addresses", attributes)
|
14
|
-
|
15
|
+
if attributes["Images"]
|
16
|
+
@images = []
|
17
|
+
attributes["Images"].each { |i| @images << Image.new(i) }
|
18
|
+
else
|
19
|
+
@images = nil
|
20
|
+
end
|
21
|
+
@my_account = false
|
15
22
|
super(attributes)
|
16
23
|
end
|
17
24
|
|
18
25
|
def self.my(arguments={})
|
19
|
-
collect(connection.get("/my/account", arguments)).first
|
26
|
+
account = collect(connection.get("/my/account", arguments)).first
|
27
|
+
account.my_account = true
|
28
|
+
account
|
29
|
+
end
|
30
|
+
|
31
|
+
def my_account?
|
32
|
+
@my_account
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.by_office(office_id, arguments={})
|
36
|
+
collect(connection.get("#{self.path()}/by/office/#{office_id}", arguments))
|
37
|
+
end
|
38
|
+
|
39
|
+
def primary_img(typ)
|
40
|
+
if @images.is_a?(Array)
|
41
|
+
matches = @images.select {|i| i.Type == typ}
|
42
|
+
matches.sort {|a,b| a.Name <=> b.Name }.first
|
43
|
+
else
|
44
|
+
nil
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def save(arguments={})
|
49
|
+
begin
|
50
|
+
return save!(arguments)
|
51
|
+
rescue NotFound, BadResourceRequest => e
|
52
|
+
FlexmlsApi.logger.error("Failed to save resource #{self}: #{e.message}")
|
53
|
+
end
|
54
|
+
false
|
55
|
+
end
|
56
|
+
def save!(arguments={})
|
57
|
+
# The long-term idea is that any setting in the user's account could be updated by including
|
58
|
+
# an attribute and calling PUT /my/account, but for now only the GetEmailUpdates attribute
|
59
|
+
# is supported
|
60
|
+
save_path = my_account? ? "/my/account" : self.class.path
|
61
|
+
results = connection.put save_path, {"GetEmailUpdates" => self.GetEmailUpdates }, arguments
|
62
|
+
true
|
20
63
|
end
|
21
64
|
|
22
65
|
private
|
@@ -46,10 +89,10 @@ module FlexmlsApi
|
|
46
89
|
class Address < Base
|
47
90
|
include Primary
|
48
91
|
end
|
92
|
+
|
49
93
|
class Image < Base
|
50
|
-
include Primary
|
51
94
|
end
|
52
95
|
end
|
53
96
|
end
|
54
97
|
|
55
|
-
end
|
98
|
+
end
|
@@ -68,12 +68,37 @@ module FlexmlsApi
|
|
68
68
|
attributes[$`] = arguments.first
|
69
69
|
# TODO figure out a nice way to present setters for the standard fields
|
70
70
|
when "?"
|
71
|
-
attributes
|
71
|
+
if attributes.include?($`)
|
72
|
+
attributes[$`] ? true : false
|
73
|
+
else
|
74
|
+
raise NoMethodError
|
75
|
+
end
|
72
76
|
end
|
73
77
|
else
|
74
78
|
return attributes[method_name] if attributes.include?(method_name)
|
75
79
|
super # GTFO
|
76
|
-
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
def respond_to?(method_symbol, include_private=false)
|
84
|
+
if super
|
85
|
+
return true
|
86
|
+
else
|
87
|
+
method_name = method_symbol.to_s
|
88
|
+
|
89
|
+
if method_name =~ /=$/
|
90
|
+
true
|
91
|
+
elsif method_name =~ /(\?)$/
|
92
|
+
attributes.include?($`)
|
93
|
+
else
|
94
|
+
attributes.include?(method_name)
|
95
|
+
end
|
96
|
+
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
def parse_id(uri)
|
101
|
+
uri[/\/.*\/(.+)$/, 1]
|
77
102
|
end
|
78
103
|
end
|
79
104
|
end
|
@@ -4,23 +4,42 @@ module FlexmlsApi
|
|
4
4
|
extend Finders
|
5
5
|
self.element_name="contacts"
|
6
6
|
|
7
|
-
def save
|
7
|
+
def save(arguments={})
|
8
8
|
begin
|
9
|
-
return save!
|
10
|
-
rescue BadResourceRequest => e
|
11
|
-
|
12
|
-
# log and leave
|
13
|
-
FlexmlsApi.logger.error("Failed to save contact #{self}: #{e.message}")
|
9
|
+
return save!(arguments)
|
10
|
+
rescue NotFound, BadResourceRequest => e
|
11
|
+
FlexmlsApi.logger.error("Failed to save resource #{self}: #{e.message}")
|
14
12
|
end
|
15
13
|
false
|
16
14
|
end
|
17
|
-
def save!
|
18
|
-
results = connection.post self.class.path, "Contacts" => [ attributes ]
|
15
|
+
def save!(arguments={})
|
16
|
+
results = connection.post self.class.path, {"Contacts" => [ attributes ], "Notify" => notify? }, arguments
|
19
17
|
result = results.first
|
20
18
|
attributes['ResourceUri'] = result['ResourceUri']
|
21
|
-
attributes['Id'] = result['ResourceUri']
|
19
|
+
attributes['Id'] = parse_id(result['ResourceUri'])
|
22
20
|
true
|
23
21
|
end
|
22
|
+
|
23
|
+
def self.by_tag(tag_name, arguments={})
|
24
|
+
collect(connection.get("#{path}/tags/#{tag_name}", arguments))
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.tags(arguments={})
|
28
|
+
connection.get("#{path}/tags", arguments)
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.my(arguments={})
|
32
|
+
new(connection.get('/my/contact', arguments).first)
|
33
|
+
end
|
34
|
+
|
35
|
+
# Notify the agent of contact creation via a flexmls message.
|
36
|
+
def notify?
|
37
|
+
@notify == true
|
38
|
+
end
|
39
|
+
def notify=(notify_me=true)
|
40
|
+
@notify = notify_me
|
41
|
+
end
|
42
|
+
|
24
43
|
end
|
25
44
|
end
|
26
45
|
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
module FlexmlsApi
|
2
|
+
module Models
|
3
|
+
class ListingCart < Base
|
4
|
+
extend Finders
|
5
|
+
self.element_name="listingcarts"
|
6
|
+
|
7
|
+
def ListingIds=(listing_ids)
|
8
|
+
attributes["ListingIds"] = Array(listing_ids)
|
9
|
+
end
|
10
|
+
def Name=(name)
|
11
|
+
attributes["Name"] = name
|
12
|
+
end
|
13
|
+
|
14
|
+
def add_listing(listing)
|
15
|
+
id = listing.respond_to?(:Id) ? listing.Id : listing.to_s
|
16
|
+
results = connection.post("#{self.class.path}/#{self.Id}", {"ListingIds" => [ listing ]})
|
17
|
+
self.ListingCount = results.first["ListingCount"]
|
18
|
+
end
|
19
|
+
|
20
|
+
def remove_listing(listing)
|
21
|
+
id = listing.respond_to?(:Id) ? listing.Id : listing.to_s
|
22
|
+
results = connection.delete("#{self.class.path}/#{self.Id}/listings/#{id}")
|
23
|
+
self.ListingCount = results.first["ListingCount"]
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.for(listings,arguments={})
|
27
|
+
keys = Array(listings).map { |l| l.respond_to?(:Id) ? l.Id : l.to_s }
|
28
|
+
collect(connection.get("/#{self.element_name}/for/#{keys.join(",")}", arguments))
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.my(arguments={})
|
32
|
+
collect(connection.get("/my/#{self.element_name}", arguments))
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.portal(arguments={})
|
36
|
+
collect(connection.get("/#{self.element_name}/portal", arguments))
|
37
|
+
end
|
38
|
+
|
39
|
+
def save(arguments={})
|
40
|
+
begin
|
41
|
+
return save!(arguments)
|
42
|
+
rescue BadResourceRequest => e
|
43
|
+
rescue NotFound => e
|
44
|
+
# log and leave
|
45
|
+
FlexmlsApi.logger.error("Failed to save contact #{self}: #{e.message}")
|
46
|
+
end
|
47
|
+
false
|
48
|
+
end
|
49
|
+
def save!(arguments={})
|
50
|
+
attributes['Id'].nil? ? create!(arguments) : update!(arguments)
|
51
|
+
end
|
52
|
+
|
53
|
+
def delete(args={})
|
54
|
+
connection.delete("#{self.class.path}/#{self.Id}", args)
|
55
|
+
end
|
56
|
+
|
57
|
+
private
|
58
|
+
def create!(arguments={})
|
59
|
+
results = connection.post self.class.path, {"ListingCarts" => [ attributes ]}, arguments
|
60
|
+
result = results.first
|
61
|
+
attributes['ResourceUri'] = result['ResourceUri']
|
62
|
+
attributes['Id'] = parse_id(result['ResourceUri'])
|
63
|
+
true
|
64
|
+
end
|
65
|
+
def update!(arguments={})
|
66
|
+
results = connection.put "#{self.class.path}/#{self.Id}", {"ListingCarts" => [ {"Name" => attributes["Name"], "ListingIds" => attributes["ListingIds"]} ] }, arguments
|
67
|
+
true
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module FlexmlsApi
|
2
|
+
module Models
|
3
|
+
class SavedSearch < Base
|
4
|
+
extend Finders
|
5
|
+
self.element_name="savedsearches"
|
6
|
+
|
7
|
+
def self.provided()
|
8
|
+
Class.new(self).tap do |provided|
|
9
|
+
provided.element_name = '/savedsearches'
|
10
|
+
provided.prefix = '/provided'
|
11
|
+
FlexmlsApi.logger.info("#{self.name}.path: #{provided.path}")
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|