Skip to content

Commit eb7e66b

Browse files
committed
Merge pull request #113 from ryanhertz/news-feed-meta
added NewsFeedMeta model
2 parents e7179f7 + 11aad80 commit eb7e66b

File tree

9 files changed

+225
-15
lines changed

9 files changed

+225
-15
lines changed

CHANGELOG

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
v1.3.27
2+
- added NewsFeedMeta model
3+
- updated SavedSearch to use NewsFeedMeta when figuring out if the search qualifies for a news feed
4+
15
v1.3.26
26
- fixed update_attributes method
37

VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1.3.26
1+
1.3.27

lib/spark_api/models.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
require 'spark_api/models/listing_cart'
1919
require 'spark_api/models/market_statistics'
2020
require 'spark_api/models/message'
21+
require 'spark_api/models/news_feed_meta'
2122
require 'spark_api/models/newsfeed'
2223
require 'spark_api/models/note'
2324
require 'spark_api/models/notification'
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
module SparkApi
2+
module Models
3+
class NewsFeedMeta < Base
4+
5+
attr_accessor :data
6+
7+
self.element_name = "newsfeeds/meta"
8+
9+
def initialize
10+
super
11+
@data = connection.get(self.path).first
12+
end
13+
14+
def minimum_core_fields
15+
@data['Subscriptions']['SavedSearches']['MinimumCoreFields']
16+
end
17+
18+
def core_field_names
19+
fields = @data['Subscriptions']['SavedSearches']['CoreSearchFields']
20+
21+
@data['Subscriptions']['SavedSearches']['CoreStandardFields'].each do |field|
22+
fields << field[1]['Label']
23+
end
24+
25+
fields
26+
end
27+
28+
def core_fields
29+
fields = @data['Subscriptions']['SavedSearches']['CoreSearchFields']
30+
31+
@data['Subscriptions']['SavedSearches']['CoreStandardFields'].each do |field|
32+
fields << field.first
33+
end
34+
35+
fields
36+
end
37+
38+
end
39+
end
40+
end

lib/spark_api/models/saved_search.rb

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,6 @@ class SavedSearch < Base
88

99
attr_accessor :newsfeeds
1010

11-
# Newsfeed restriction criteria for saved searches:
12-
# http://alpha.sparkplatform.com/docs/api_services/newsfeed/restrictions#criteria
13-
QUALIFYING_FIELDS_FOR_NEWSFEED = %w(BathsTotal BedsTotal City CountyOrParish ListPrice Location MlsStatus
14-
PostalCode PropertyType RoomsTotal State)
15-
1611
self.element_name="savedsearches"
1712

1813
def initialize(attributes={})
@@ -82,11 +77,11 @@ def can_have_newsfeed?
8277

8378
number_of_filters = 0
8479

85-
QUALIFYING_FIELDS_FOR_NEWSFEED.each do |field|
80+
news_feed_meta.core_fields.each do |field|
8681
number_of_filters += 1 if self.Filter.include? field
8782
end
8883

89-
number_of_filters >= 3
84+
number_of_filters >= news_feed_meta.minimum_core_fields
9085

9186
end
9287

@@ -124,6 +119,10 @@ def update_contacts(method, contact_id)
124119
end
125120
end
126121

122+
def news_feed_meta
123+
@news_feed_meta ||= NewsFeedMeta.new
124+
end
125+
127126
end
128127

129128
end

spec/fixtures/newsfeeds/meta.json

Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
{
2+
"D": {
3+
"Results": [
4+
{
5+
"Events": ["New", "PriceChange", "Sold", "OpenHouse", "Pending", "BackOnMarket", "Extension", "StatusChange", "Recommended", "Shared", "Seeded"],
6+
"Subscriptions": {
7+
"SavedSearches": {
8+
"CoreStandardFields": {
9+
"MlsStatus": {
10+
"ResourceUri": "/v1/standardfields/MlsStatus",
11+
"MlsVisible": ["A", "I", "J", "K", "N"],
12+
"Searchable": true,
13+
"HasList": true,
14+
"MaxListSize": 7,
15+
"Type": "Character",
16+
"MultiSelect": false,
17+
"FieldCategory": "Main",
18+
"Label": "Status"
19+
},
20+
"PropertyType": {
21+
"ResourceUri": "/v1/standardfields/PropertyType",
22+
"MlsVisible": ["A", "I", "J", "K", "N"],
23+
"Searchable": true,
24+
"HasList": false,
25+
"MaxListSize": 0,
26+
"Type": "Character",
27+
"MultiSelect": false,
28+
"FieldCategory": "Main",
29+
"Label": "Property Type"
30+
},
31+
"PostalCode": {
32+
"ResourceUri": "/v1/standardfields/PostalCode",
33+
"MlsVisible": ["A", "I", "J", "K", "N"],
34+
"Searchable": true,
35+
"HasList": false,
36+
"MaxListSize": 0,
37+
"Type": "Character",
38+
"MultiSelect": false,
39+
"FieldCategory": "Main",
40+
"Label": "Postal Code"
41+
},
42+
"ListPrice": {
43+
"ResourceUri": "/v1/standardfields/ListPrice",
44+
"MlsVisible": ["A", "I", "J", "K"],
45+
"Searchable": true,
46+
"HasList": false,
47+
"MaxListSize": 0,
48+
"Type": "Decimal",
49+
"MultiSelect": false,
50+
"Currency": true,
51+
"FieldCategory": "Main",
52+
"Label": "List Price"
53+
},
54+
"BedsTotal": {
55+
"ResourceUri": "/v1/standardfields/BedsTotal",
56+
"MlsVisible": ["A", "K", "N"],
57+
"Searchable": true,
58+
"HasList": false,
59+
"MaxListSize": 0,
60+
"Type": "Integer",
61+
"MultiSelect": false,
62+
"FieldCategory": "Main",
63+
"Label": "Total Bedrooms"
64+
},
65+
"YearBuilt": {
66+
"ResourceUri": "/v1/standardfields/YearBuilt",
67+
"MlsVisible": ["A", "I", "K", "N"],
68+
"Searchable": true,
69+
"HasList": false,
70+
"MaxListSize": 0,
71+
"Type": "Integer",
72+
"MultiSelect": false,
73+
"FieldCategory": "Main",
74+
"Label": "Year Built"
75+
},
76+
"BuildingAreaTotal": {
77+
"ResourceUri": "/v1/standardfields/BuildingAreaTotal",
78+
"MlsVisible": ["A", "I", "K", "N"],
79+
"Searchable": true,
80+
"HasList": false,
81+
"MaxListSize": 0,
82+
"Type": "Decimal",
83+
"MultiSelect": false,
84+
"FieldCategory": "Main",
85+
"Label": "Total SqFt."
86+
},
87+
"PropertySubType": {
88+
"ResourceUri": "/v1/standardfields/PropertySubType",
89+
"MlsVisible": ["A", "I", "J", "K", "N"],
90+
"Searchable": true,
91+
"HasList": true,
92+
"MaxListSize": 9,
93+
"Type": "Character",
94+
"MultiSelect": false,
95+
"FieldCategory": "Main",
96+
"Label": "Sub Type"
97+
},
98+
"SubdivisionName": {
99+
"ResourceUri": "/v1/standardfields/SubdivisionName",
100+
"MlsVisible": ["A", "I", "J", "K", "N"],
101+
"Searchable": true,
102+
"HasList": false,
103+
"MaxListSize": 0,
104+
"Type": "Character",
105+
"MultiSelect": false,
106+
"FieldCategory": "Main",
107+
"Label": "Subdivision"
108+
},
109+
"MLSAreaMinor": {
110+
"ResourceUri": "/v1/standardfields/MLSAreaMinor",
111+
"MlsVisible": ["A", "I", "J", "K", "N"],
112+
"Searchable": true,
113+
"HasList": true,
114+
"MaxListSize": 51,
115+
"Type": "Character",
116+
"MultiSelect": false,
117+
"FieldCategory": "Main",
118+
"Label": "Map Area"
119+
}
120+
},
121+
"CoreSearchFields": [
122+
"Location"
123+
],
124+
"MinimumCoreFields": 3
125+
}
126+
}
127+
}
128+
],
129+
"Success": true
130+
}
131+
}

spec/spec_helper.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ def reset_config
5454
config.alias_example_to :on_post_it, :method => 'POST'
5555
config.alias_example_to :on_delete_it, :method => 'DELETE'
5656
config.before(:all) { reset_config }
57+
config.color_enabled = true
5758
end
5859

5960
def jruby?
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
require './spec/spec_helper'
2+
3+
4+
describe NewsFeedMeta do
5+
6+
let(:news_feed_meta) { NewsFeedMeta.new }
7+
8+
before(:each) do
9+
stub_auth_request
10+
stub_api_get("/newsfeeds/meta", "newsfeeds/meta.json")
11+
end
12+
13+
describe 'minimum_core_fields' do
14+
it 'returns the minimum number of required fields' do
15+
expect(news_feed_meta.minimum_core_fields).to eq 3
16+
end
17+
end
18+
19+
describe 'core_field_names' do
20+
it 'returns an array including both the CoreSearchFields and the CoreStandardFields' do
21+
field_array = ["Location", "Status", "Property Type", "Postal Code", "List Price", "Total Bedrooms",
22+
"Year Built", "Total SqFt.", "Sub Type", "Subdivision", "Map Area"]
23+
expect(news_feed_meta.core_field_names).to eq field_array
24+
end
25+
end
26+
27+
describe 'core_fields' do
28+
it 'returns an array including both the CoreSearchFields and the CoreStandardFields' do
29+
field_array = ["Location", "MlsStatus", "PropertyType", "PostalCode", "ListPrice", "BedsTotal",
30+
"YearBuilt", "BuildingAreaTotal", "PropertySubType", "SubdivisionName", "MLSAreaMinor"]
31+
expect(news_feed_meta.core_fields).to eq field_array
32+
end
33+
end
34+
35+
end

spec/unit/spark_api/models/saved_search_spec.rb

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -178,12 +178,16 @@
178178

179179
describe "can_have_newsfeed?" do
180180

181+
before do
182+
stub_api_get("/newsfeeds/meta", "newsfeeds/meta.json")
183+
end
184+
181185
it "should return false without at least three filter parameters" do
182186
stub_api_get("/#{subject.class.element_name}/#{id}", 'saved_searches/get.json')
183187
resource = subject.class.find(id)
184188
resource.stub(:has_active_newsfeed?) { false }
185189
resource.stub(:has_inactive_newsfeed?) { false }
186-
resource.Filter = "City Eq 'Moorhead' And MlsStatus Eq 'Active'"
190+
resource.Filter = "MlsStatus Eq 'Active' And PropertyType Eq 'A'"
187191
resource.can_have_newsfeed?.should == false
188192
end
189193

@@ -192,6 +196,7 @@
192196
resource = subject.class.find(id)
193197
resource.stub(:has_active_newsfeed?) { false }
194198
resource.stub(:has_inactive_newsfeed?) { false }
199+
resource.Filter = "MlsStatus Eq 'Active' And PropertyType Eq 'A' And ListPrice Eq 1000000"
195200
resource.can_have_newsfeed?.should == true
196201
end
197202

@@ -243,11 +248,5 @@
243248
resource.newsfeeds.should be_an(Array)
244249
end
245250
end
246-
247-
describe "QUALIFYING_FIELDS_FOR_NEWSFEED" do
248-
it "should return an array" do
249-
subject.class::QUALIFYING_FIELDS_FOR_NEWSFEED.should be_an(Array)
250-
end
251-
end
252251

253252
end

0 commit comments

Comments
 (0)