Skip to content

Commit 99e7f9f

Browse files
authored
Add Rake Tasks for Fetching Past Events (#1064)
1 parent 7861f4f commit 99e7f9f

File tree

6 files changed

+214
-45
lines changed

6 files changed

+214
-45
lines changed

Rakefile

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,14 @@ task :fetch_meetups do
8585
end
8686
end
8787

88+
desc "fetch past meetups"
89+
task :fetch_past_meetups do
90+
MeetupsFile.read.tap do |file|
91+
file.fetch!(past: true)
92+
file.write!
93+
end
94+
end
95+
8896
# to fetch a single group run:
8997
# bundle exec rake fetch_meetup[sfruby]
9098
desc "fetch a single group"
@@ -95,6 +103,16 @@ task :fetch_meetup, [:group_id] do |_, args|
95103
end
96104
end
97105

106+
# to fetch past events of a single group run:
107+
# bundle exec rake fetch_past_meetups[sfruby]
108+
desc "fetch past meetups of a single group"
109+
task :fetch_past_meetup, [:group_id] do |_, args|
110+
MeetupsFile.read.tap do |file|
111+
file.fetch!(args[:group_id], past: true)
112+
file.write!
113+
end
114+
end
115+
98116
desc "fetch write all meetup groups"
99117
task :fetch_and_write_all_meetups do
100118
MeetupGroup.all.each do |group|

src/events/meetup_event.rb

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,10 @@ def event_url
2020
end
2121

2222
def event_status
23-
object.status == "published" ? nil : object.status
23+
return nil if object.status&.downcase == "published"
24+
return nil if object.status&.downcase == "past"
25+
26+
object.status
2427
end
2528

2629
def event_location

src/meetup_graphql_schema.json

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,36 @@
8282
},
8383
"args": []
8484
},
85+
{
86+
"name": "pastEvents",
87+
"type": {
88+
"kind": "OBJECT",
89+
"name": "PastEventConnection"
90+
},
91+
"args": [
92+
{
93+
"name": "sortOrder",
94+
"type": {
95+
"kind": "ENUM",
96+
"name": "SortOrder"
97+
}
98+
},
99+
{
100+
"name": "input",
101+
"type": {
102+
"kind": "INPUT_OBJECT",
103+
"name": "ConnectionInput"
104+
}
105+
},
106+
{
107+
"name": "filter",
108+
"type": {
109+
"kind": "INPUT_OBJECT",
110+
"name": "GroupUpcomingEventsFilter"
111+
}
112+
}
113+
]
114+
},
85115
{
86116
"name": "upcomingEvents",
87117
"type": {
@@ -152,6 +182,31 @@
152182
}
153183
]
154184
},
185+
{
186+
"kind": "OBJECT",
187+
"name": "PastEventConnection",
188+
"fields": [
189+
{
190+
"name": "count",
191+
"type": {
192+
"kind": "SCALAR",
193+
"name": "Int"
194+
},
195+
"args": []
196+
},
197+
{
198+
"name": "edges",
199+
"type": {
200+
"kind": "LIST",
201+
"ofType": {
202+
"kind": "OBJECT",
203+
"name": "PastEventEdge"
204+
}
205+
},
206+
"args": []
207+
}
208+
]
209+
},
155210
{
156211
"kind": "OBJECT",
157212
"name": "EventConnection",
@@ -205,6 +260,28 @@
205260
}
206261
]
207262
},
263+
{
264+
"kind": "OBJECT",
265+
"name": "PastEventEdge",
266+
"fields": [
267+
{
268+
"name": "cursor",
269+
"type": {
270+
"kind": "SCALAR",
271+
"name": "String"
272+
},
273+
"args": []
274+
},
275+
{
276+
"name": "node",
277+
"type": {
278+
"kind": "OBJECT",
279+
"name": "Event"
280+
},
281+
"args": []
282+
}
283+
]
284+
},
208285
{
209286
"kind": "OBJECT",
210287
"name": "EventEdge",

src/meetups_file.rb

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ def find_by(service_id: nil, url: nil)
3232
end
3333
end
3434

35-
def fetch_group!(group)
35+
def fetch_group!(group, past: false)
3636
puts "Fetching #{group.service} Group: #{group.id}"
3737

3838
group.new_events.map { |event| event.meetup_file_entry }.each do |event|
@@ -41,6 +41,14 @@ def fetch_group!(group)
4141
puts "New Meetup: #{event.name} - #{event.date}"
4242
end
4343

44+
if past
45+
group.new_past_events.map { |event| event.meetup_file_entry }.each do |event|
46+
@new_events << event
47+
@events << event
48+
puts "New Past Meetup: #{event.name} - #{event.date}"
49+
end
50+
end
51+
4452
group.cancelled_events.map { |event| event.meetup_file_entry }.each do |event|
4553
event_entry = find_by(url: event.url)
4654

@@ -70,11 +78,11 @@ def fetch_group!(group)
7078
puts
7179
end
7280

73-
def fetch!(id = nil)
81+
def fetch!(id = nil, past: false)
7482
groups = MeetupGroup.all
7583
groups = groups.where(id: id) if id
7684

77-
groups.each { |group| fetch_group!(group) }
85+
groups.each { |group| fetch_group!(group, past: past) }
7886

7987
puts "New Events: #{@new_events.count}"
8088
puts "Updated Events: #{@updated_events.count}"

src/queries/events_query.rb

Lines changed: 67 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,49 @@
11
require_relative "../meetup_client"
22

3+
eventConnection = <<-GRAPHQL
4+
count
5+
edges {
6+
cursor
7+
node {
8+
id
9+
title
10+
eventUrl
11+
shortDescription
12+
description
13+
onlineVenue {
14+
type
15+
url
16+
}
17+
venue {
18+
address
19+
city
20+
state
21+
country
22+
}
23+
host {
24+
id
25+
name
26+
email
27+
}
28+
status
29+
dateTime
30+
endTime
31+
duration
32+
timezone
33+
createdAt
34+
eventType
35+
isOnline
36+
group {
37+
id
38+
name
39+
country
40+
state
41+
city
42+
}
43+
}
44+
}
45+
GRAPHQL
46+
347
EventsQuery = MeetupClient::Client.parse(<<-GRAPHQL
448
query ($groupId: String!) {
549
groupByUrlname(urlname: $groupId) {
@@ -15,47 +59,29 @@
1559
state
1660
city
1761
upcomingEvents(input: { first: 50 }, filter: { includeCancelled: true }, sortOrder: ASC) {
18-
count
19-
edges {
20-
cursor
21-
node {
22-
id
23-
title
24-
eventUrl
25-
shortDescription
26-
description
27-
onlineVenue {
28-
type
29-
url
30-
}
31-
venue {
32-
address
33-
city
34-
state
35-
country
36-
}
37-
host {
38-
id
39-
name
40-
email
41-
}
42-
status
43-
dateTime
44-
endTime
45-
duration
46-
timezone
47-
createdAt
48-
eventType
49-
isOnline
50-
group {
51-
id
52-
name
53-
country
54-
state
55-
city
56-
}
57-
}
58-
}
62+
#{eventConnection}
63+
}
64+
}
65+
}
66+
GRAPHQL
67+
)
68+
69+
PastEventsQuery = MeetupClient::Client.parse(<<-GRAPHQL
70+
query ($groupId: String!) {
71+
groupByUrlname(urlname: $groupId) {
72+
id
73+
logo {
74+
id
75+
baseUrl
76+
preview
77+
source
78+
}
79+
name
80+
country
81+
state
82+
city
83+
pastEvents(input: { first: 1000 }, sortOrder: ASC){
84+
#{eventConnection}
5985
}
6086
}
6187
}

src/static/meetup_group.rb

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,20 @@ def new_events
3737
upcoming_events.select { |event| !existing_ids.include?(event.service_id) }
3838
end
3939

40+
def new_past_events
41+
existing_ids = past_existing_events.map(&:service_id)
42+
43+
past_events.select { |event| !existing_ids.include?(event.service_id) }
44+
end
45+
46+
def past_events
47+
@past_events ||= fetch_past_events.tap do |events|
48+
events.select! { |event| event.event_name.include?(filter) } if filter.present?
49+
events.reject! { |event| Array(exclude).any? { |e| event.event_name.include?(e) } } if exclude.present?
50+
events.sort_by { |event| [event.event_date, event.event_name] }
51+
end
52+
end
53+
4054
def missing_events
4155
upcoming_ids = upcoming_events.map(&:service_id)
4256

@@ -47,6 +61,10 @@ def upcomping_existing_events
4761
existing_events.select { |event| event["date"].between?(Date.today - 1, Date.today + 120) }
4862
end
4963

64+
def past_existing_events
65+
existing_events.select { |event| event["date"] < Date.today }
66+
end
67+
5068
def existing_events
5169
Meetup.for_group(self)
5270
end
@@ -69,6 +87,19 @@ def tz
6987

7088
private
7189

90+
def fetch_past_events
91+
case service
92+
when "meetupdotcom"
93+
fetch_past_meetup_events
94+
when "luma"
95+
fetch_luma_events.select { |event| event.date < Date.today }
96+
when "ical"
97+
fetch_ical_events.select { |event| event.date < Date.today }
98+
else
99+
raise "Unsupported service: #{service}"
100+
end
101+
end
102+
72103
def fetch_events
73104
case service
74105
when "meetupdotcom"
@@ -82,6 +113,12 @@ def fetch_events
82113
end
83114
end
84115

116+
def fetch_past_meetup_events
117+
result = MeetupClient::Client.query(PastEventsQuery, variables: { groupId: id })
118+
events = Array(result.original_hash.dig("data", "groupByUrlname", "pastEvents", "edges"))
119+
events.map { |event| MeetupEvent.new(object: OpenStruct.new(event["node"]), group: self) }
120+
end
121+
85122
def fetch_meetup_events
86123
result = MeetupClient::Client.query(EventsQuery, variables: { groupId: id })
87124
events = Array(result.original_hash.dig("data", "groupByUrlname", "upcomingEvents", "edges"))

0 commit comments

Comments
 (0)