Skip to content
This repository was archived by the owner on Dec 3, 2019. It is now read-only.

Commit 8ac8f19

Browse files
Merge pull request #416 from BRIMIL01/meetup_user_sync_job
Added meetup api member search and sync to update user data with meetup data
2 parents 64d6a1b + ac73757 commit 8ac8f19

File tree

6 files changed

+161
-0
lines changed

6 files changed

+161
-0
lines changed

.editorconfig

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# EditorConfig is awesome: https://EditorConfig.org
2+
3+
# top-most EditorConfig file
4+
root = true
5+
6+
# Unix-style newlines with a newline ending every file
7+
[*]
8+
end_of_line = lf
9+
insert_final_newline = true
10+
trim_trailing_whitespace = true
11+
12+
# Tab indentation (no size specified)
13+
[Makefile]
14+
indent_style = tab
15+
16+
[**.rb]
17+
indent_style = space
18+
indent_size = 2
19+
20+
# Matches the exact files either package.json or .travis.yml
21+
[.travis.yml]
22+
indent_style = space
23+
indent_size = 2

app/jobs/meetup_member_sync_job.rb

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
class MeetupMemberSyncJob
2+
include Sidekiq::Worker
3+
4+
def perform
5+
meetup_client = Meetup.new
6+
members = meetup_client.members_by_email
7+
8+
User.where(email: members.keys).each do |user|
9+
member = members[user.email]
10+
user.latitude ||= member['lat']
11+
user.longitude ||= member['lon']
12+
user.city ||= member['city']
13+
user.state ||= member['state']
14+
15+
# Only update a user if values have changed
16+
user.save if user.changed?
17+
end
18+
end
19+
end

app/lib/meetup.rb

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,40 @@ def operationcode_data
2020
return_value_for response
2121
end
2222

23+
# GET all Operation Code Pro members
24+
### Member
25+
# chapters - Pro organization groups that the member belongs to
26+
# id - Id of the group
27+
# name - Name of the group
28+
# urlname - Urlname used to identify the group on meetup.com
29+
# city - City of the member
30+
# country - Country of the member
31+
# email - Email address of the member if the member opted to share it with the organization
32+
# events_attended - The number of attended events
33+
# is_organizer - Organizer status of the member
34+
# join_time - The time when the member joined Meetup
35+
# last_access_time - The time when the last activity occured
36+
# lat - Latitude
37+
# lon - Longitude
38+
# member_id - Id of the member
39+
# member_name - Name of the member
40+
# photo_thumb_url - Url of the photo thumbnail of the member
41+
# state - State of the member, if in US or Canada
42+
def members
43+
response = self.class.get('/pro/operationcode/members', options)
44+
return_value_for response
45+
end
46+
47+
# List of members indexed by email for easy access
48+
def members_by_email
49+
member_map = {}
50+
members.map do |member|
51+
member_map[member['email']] = member
52+
end
53+
54+
member_map
55+
end
56+
2357
# GET events for each group
2458
def get_events_for(urlname)
2559
response = self.class.get("/#{urlname}/events", options)
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
require 'test_helper'
2+
3+
class MeetupMemberSyncJobTest < ActiveSupport::TestCase
4+
member = {
5+
'email' => '[email protected]',
6+
'lat' => 36.900001525878906,
7+
'lon' => -76.20999908447266,
8+
'city' => 'Norfolk',
9+
'state' => 'VA'
10+
}
11+
12+
test 'it only updates nil fields on a found user' do
13+
job = MeetupMemberSyncJob.new
14+
user_id = FactoryGirl.create(:user, email: '[email protected]', city: nil).id
15+
Meetup.any_instance.expects(:members_by_email).returns('[email protected]' => member)
16+
job.perform
17+
18+
user = User.find(user_id)
19+
assert user.city == 'Norfolk'
20+
assert user.state != 'VA'
21+
end
22+
23+
test 'it only updates users with matching emails' do
24+
job = MeetupMemberSyncJob.new
25+
FactoryGirl.create(:user, email: '[email protected]', city: nil)
26+
user2 = FactoryGirl.create(:user, email: '[email protected]', city: nil)
27+
28+
Meetup.any_instance.expects(:members_by_email).returns('[email protected]' => member)
29+
job.perform
30+
31+
assert user2 == User.find(user2.id)
32+
end
33+
end

test/lib/meetup_test.rb

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,25 @@ class MeetupTest < ActiveSupport::TestCase
2323
assert_raises(Exception) { Meetup.new.operationcode_data }
2424
end
2525

26+
test 'members response code of 200 returns response' do
27+
Meetup.stubs(:get).with('/pro/operationcode/members', options).returns(member_endpoint_response)
28+
29+
assert_nothing_raised { Meetup.new.members }
30+
end
31+
32+
test 'members response code not equal to 200 raises error' do
33+
Meetup.stubs(:get).with('/pro/operationcode/members', options).returns(build_response(400))
34+
35+
assert_raises(Exception) { Meetup.new.members }
36+
end
37+
38+
test 'members by email returns a hash indexed by email addresses from the response' do
39+
Meetup.stubs(:get).with('/pro/operationcode/members', options).returns(member_endpoint_response)
40+
41+
members_by_email = Meetup.new.members_by_email
42+
refute_nil members_by_email['[email protected]']
43+
end
44+
2645
test 'event response code of 200 returns response' do
2746
url = 'Operation-Code-Hampton-Roads'
2847

test/support/meetups/sample_api_responses.rb

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,12 @@ def event_endpoint_response
1212
response
1313
end
1414

15+
def member_endpoint_response
16+
response = build_response
17+
response.parsed_response = member_parsed_response
18+
response
19+
end
20+
1521
def build_response(code = 200)
1622
response_struct = OpenStruct.new
1723
response_struct.code = code
@@ -322,3 +328,30 @@ def group_endpoint_parsed_response
322328
}
323329
].as_json
324330
end
331+
332+
def member_parsed_response
333+
[
334+
{
335+
"chapters": [
336+
{
337+
"id": 1,
338+
"name": 'group',
339+
"urlname": 'groupname'
340+
}
341+
],
342+
"city": 'Virginia Beach',
343+
"country": 'us',
344+
"email": '[email protected]',
345+
"events_attended": 4,
346+
"is_organizer": false,
347+
"join_time": 1483543375000,
348+
"last_access_time": 1506171600000,
349+
"lat": 36.844764709472656,
350+
"lon": -75.97899627685547,
351+
"member_id": 10,
352+
"member_name": 'test account',
353+
"photo_thumb_url": 'https://secure.meetupstatic.com/photos/event/b/d/1/4/600_457308404.jpeg',
354+
"state": 'VA'
355+
}
356+
].as_json
357+
end

0 commit comments

Comments
 (0)