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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy