Skip to content

Commit 5f80b82

Browse files
authored
Merge pull request #1550 from takatama/multiple-series-ids-for-connpass-api
connpass APIの呼び出し回数を削減する
2 parents b15112c + 4aa0eb7 commit 5f80b82

File tree

6 files changed

+81
-45
lines changed

6 files changed

+81
-45
lines changed

lib/event_service/client.rb

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,6 @@ def connection_for(endpoint)
2323

2424
f.adapter Faraday.default_adapter
2525
end
26-
# TODO: According to the report by users, the following code fails to aggregate data for /events page.
27-
# connpass は https://connpass.com/robots.txt を守らない場合は、アクセス制限を施すので、下記の sleep を入れるようにした https://connpass.com/about/api/
28-
#sleep 5 if endpoint.include?(EventService::Providers::Connpass::ENDPOINT)
2926
end
3027
end
3128
end

lib/event_service/providers/connpass.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ def search(keyword:)
1414

1515
# NOTE: yyyymm, yyyymmdd は文字列を要素とする配列(Array[String])で指定
1616
def fetch_events(series_id:, yyyymm: nil, yyyymmdd: nil)
17+
series_id = series_id.join(',') if series_id.is_a?(Array)
18+
1719
params = {
1820
series_id: series_id,
1921
start: 1,
@@ -33,6 +35,8 @@ def fetch_events(series_id:, yyyymm: nil, yyyymmdd: nil)
3335

3436
param_period_patern.each do |param_period|
3537
loop do
38+
# connpass は https://connpass.com/robots.txt を守らない場合は、アクセス制限を施すので、下記の sleep を入れるようにした https://connpass.com/about/api/
39+
sleep 5
3640
part = @client.get('event/', params.merge(param_period))
3741

3842
break if part['results_returned'].zero?

lib/statistics/tasks/connpass.rb

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -14,24 +14,25 @@ def initialize(dojos, period)
1414
end
1515

1616
def run
17-
@dojos.each do |dojo|
18-
dojo.dojo_event_services.for(:connpass).each do |dojo_event_service|
19-
@client.fetch_events(**@params.merge(series_id: dojo_event_service.group_id)).each do |e|
20-
next unless e.dig('series', 'id').to_s == dojo_event_service.group_id
21-
22-
EventHistory.create!(dojo_id: dojo.id,
23-
dojo_name: dojo.name,
24-
service_name: dojo_event_service.name,
25-
service_group_id: dojo_event_service.group_id,
26-
event_id: e['event_id'],
27-
event_url: e['event_url'],
28-
participants: e['accepted'],
29-
evented_at: Time.zone.parse(e['started_at']))
30-
end
31-
end
17+
group_ids = @dojos.flat_map do |dojo|
18+
dojo.dojo_event_services.for(:connpass).pluck(:group_id)
19+
end
20+
21+
@client.fetch_events(**@params.merge(series_id: group_ids)).each do |e|
22+
dojo_event_service = DojoEventService.find_by(group_id: e.dig('series', 'id').to_s)
23+
next unless dojo_event_service
24+
25+
EventHistory.create!(dojo_id: dojo_event_service.dojo_id,
26+
dojo_name: dojo_event_service.dojo.name,
27+
service_name: dojo_event_service.name,
28+
service_group_id: dojo_event_service.group_id,
29+
event_id: e['event_id'],
30+
event_url: e['event_url'],
31+
participants: e['accepted'],
32+
evented_at: Time.zone.parse(e['started_at']))
3233
end
3334
end
34-
35+
3536
private
3637

3738
def build_params(period)

lib/upcoming_events/tasks/connpass.rb

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -8,24 +8,25 @@ def initialize(dojos, period)
88
end
99

1010
def run
11-
@dojos.each do |dojo|
12-
dojo.dojo_event_services.for(:connpass).each do |dojo_event_service|
13-
@client.fetch_events(**@params.merge(series_id: dojo_event_service.group_id)).each do |e|
14-
next unless e.dig('series', 'id').to_s == dojo_event_service.group_id
15-
16-
record = dojo_event_service.upcoming_events.find_or_initialize_by(event_id: e['event_id'])
17-
record.update!(service_name: dojo_event_service.name,
18-
event_title: e['title'],
19-
event_url: e['event_url'],
20-
event_at: Time.zone.parse(e['started_at']),
21-
event_end_at: Time.zone.parse(e['ended_at']),
22-
participants: e['accepted'],
23-
event_update_at: Time.zone.parse(e['updated_at']),
24-
address: e['address'],
25-
place: e['place'],
26-
limit: e['limit'])
27-
end
28-
end
11+
group_ids = @dojos.flat_map do |dojo|
12+
dojo.dojo_event_services.for(:connpass).pluck(:group_id)
13+
end
14+
15+
@client.fetch_events(**@params.merge(series_id: group_ids)).each do |e|
16+
dojo_event_service = DojoEventService.find_by(group_id: e.dig('series', 'id').to_s)
17+
next unless dojo_event_service
18+
19+
record = dojo_event_service.upcoming_events.find_or_initialize_by(event_id: e['event_id'])
20+
record.update!(service_name: dojo_event_service.name,
21+
event_title: e['title'],
22+
event_url: e['event_url'],
23+
event_at: Time.zone.parse(e['started_at']),
24+
event_end_at: Time.zone.parse(e['ended_at']),
25+
participants: e['accepted'],
26+
event_update_at: Time.zone.parse(e['updated_at']),
27+
address: e['address'],
28+
place: e['place'],
29+
limit: e['limit'])
2930
end
3031
end
3132

spec/lib/event_service/providers/connpass_spec.rb

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,31 @@
1818
end
1919

2020
describe '#fetch_events' do
21-
subject { described_class.new.fetch_events(series_id: 9876) }
21+
context 'when a single series_id is given' do
22+
subject { described_class.new.fetch_events(series_id: 9876) }
2223

23-
it do
24-
expect(subject).to be_instance_of(Array)
25-
expect(subject.size).to eq 1
26-
expect(subject.first['event_id']).to eq 12345
27-
expect(subject.first['series']['url']).to eq 'https://coderdojo-okutama.connpass.com/'
28-
expect(subject.first['series']['id']).to eq 9876
24+
it do
25+
expect(subject).to be_instance_of(Array)
26+
expect(subject.size).to eq 1
27+
expect(subject.first['event_id']).to eq 12345
28+
expect(subject.first['series']['url']).to eq 'https://coderdojo-okutama.connpass.com/'
29+
expect(subject.first['series']['id']).to eq 9876
30+
end
31+
end
32+
33+
context 'when multiple series_ids are given' do
34+
subject { described_class.new.fetch_events(series_id: [9876, 9877]) }
35+
36+
it do
37+
expect(subject).to be_instance_of(Array)
38+
expect(subject.size).to eq 2
39+
expect(subject.first['event_id']).to eq 12345
40+
expect(subject.first['series']['url']).to eq 'https://coderdojo-okutama.connpass.com/'
41+
expect(subject.first['series']['id']).to eq 9876
42+
expect(subject.second['event_id']).to eq 12346 # assuming the second event has id 12346
43+
expect(subject.second['series']['url']).to eq 'https://coderdojo-okutama2.connpass.com/'
44+
expect(subject.second['series']['id']).to eq 9877
45+
end
2946
end
3047
end
3148
end

spec/support/shared_contexts/statistics.rb

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,13 @@
44
f.response :json, :content_type => /\bjson$/
55
f.adapter :test, Faraday::Adapter::Test::Stubs.new do |stub|
66
# connpass
7-
stub.get('/event/') { connpass_response }
7+
stub.get('/event/') do |env|
8+
if env.params["series_id"] == '9876,9877'
9+
multiple_series_ids_response
10+
else
11+
connpass_response
12+
end
13+
end
814

915
# doorkeeper
1016
stub.get('/events') { doorkeeper_response }
@@ -21,6 +27,16 @@
2127
RSpec.shared_context 'Use stubs for Connpass' do
2228
include_context 'Use stub connection of Faraday'
2329

30+
# response for multiple series_ids 9876 and 9877
31+
let(:multiple_series_ids_response) do
32+
[
33+
200,
34+
{ 'Content-Type' => 'application/json' },
35+
'{"results_returned": 2, "events": [{"event_url": "https://coderdojo-okutama.connpass.com/event/12345/", "event_type": "participation", "owner_nickname": "nalabjp", "series": {"url": "https://coderdojo-okutama.connpass.com/", "id": 9876, "title": "CoderDojo series"}, "updated_at": "2017-04-29T14:59:30+09:00", "lat": "35.801763000000", "started_at": "2017-05-07T10:00:00+09:00", "hash_tag": "CoderDojo", "title": "CoderDojo title", "event_id": 12345, "lon": "139.087656000000", "waiting": 2, "limit": 10, "owner_id": 2525, "owner_display_name": "nalabjp", "description": "CoderDojo description", "address": "Okutama-cho Tokyo", "catch": "CoderDojo catch", "accepted": 10, "ended_at": "2017-05-07T12:00:00+09:00", "place": "Tokyo"},{"event_url": "https://coderdojo-okutama.connpass.com/event/12346/", "event_type": "participation", "owner_nickname": "nalabjp", "series": {"url": "https://coderdojo-okutama2.connpass.com/", "id": 9877, "title": "CoderDojo series"}, "updated_at": "2017-04-29T14:59:30+09:00", "lat": "35.801763000000", "started_at": "2017-05-07T10:00:00+09:00", "hash_tag": "CoderDojo", "title": "CoderDojo title", "event_id": 12346, "lon": "139.087656000000", "waiting": 2, "limit": 10, "owner_id": 2525, "owner_display_name": "nalabjp", "description": "CoderDojo description", "address": "Okutama-cho Tokyo", "catch": "CoderDojo catch", "accepted": 10, "ended_at": "2017-05-07T12:00:00+09:00", "place": "Tokyo"}], "results_start": 200, "results_available": 518}'
36+
]
37+
end
38+
39+
# response for single series_id 9876, and for search
2440
let(:connpass_response) do
2541
[
2642
200,

0 commit comments

Comments
 (0)