diff --git a/app/models/dojo.rb b/app/models/dojo.rb index c7dfdf9f4..af4c957b1 100644 --- a/app/models/dojo.rb +++ b/app/models/dojo.rb @@ -4,8 +4,8 @@ class Dojo < ApplicationRecord NUM_OF_JAPAN_DOJOS = Dojo.count.to_s belongs_to :prefecture - has_one :dojo_event_service, dependent: :destroy - has_many :event_histories, dependent: :destroy + has_many :dojo_event_services, dependent: :destroy + has_many :event_histories, dependent: :destroy serialize :tags default_scope -> { order(order: :asc) } diff --git a/lib/statistics/aggregation.rb b/lib/statistics/aggregation.rb index f88a2827a..d519d896f 100644 --- a/lib/statistics/aggregation.rb +++ b/lib/statistics/aggregation.rb @@ -2,9 +2,9 @@ module Statistics class Aggregation class << self def run(date:) - cnps_dojos = Dojo.joins(:dojo_event_service).where(dojo_event_services: { name: :connpass }).to_a - drkp_dojos = Dojo.joins(:dojo_event_service).where(dojo_event_services: { name: :doorkeeper }).to_a - fsbk_dojos = Dojo.joins(:dojo_event_service).where(dojo_event_services: { name: :facebook }).to_a + cnps_dojos = Dojo.joins(:dojo_event_services).where(dojo_event_services: { name: :connpass }).to_a + drkp_dojos = Dojo.joins(:dojo_event_services).where(dojo_event_services: { name: :doorkeeper }).to_a + fsbk_dojos = Dojo.joins(:dojo_event_services).where(dojo_event_services: { name: :facebook }).to_a Connpass.run(cnps_dojos, date) Doorkeeper.run(drkp_dojos, date) @@ -21,17 +21,19 @@ def run(dojos, date) } dojos.each do |dojo| - cnps.fetch_events(params.merge(series_id: dojo.dojo_event_service.group_id)).each do |e| - next unless e.dig('series', 'id').to_s == dojo.dojo_event_service.group_id + dojo.dojo_event_services.each do |dojo_event_service| + cnps.fetch_events(params.merge(series_id: dojo_event_service.group_id)).each do |e| + next unless e.dig('series', 'id').to_s == dojo_event_service.group_id - EventHistory.create!(dojo_id: dojo.id, - dojo_name: dojo.name, - service_name: dojo.dojo_event_service.name, - service_group_id: dojo.dojo_event_service.group_id, - event_id: e['event_id'], - event_url: e['event_url'], - participants: e['accepted'], - evented_at: Time.zone.parse(e['started_at'])) + EventHistory.create!(dojo_id: dojo.id, + dojo_name: dojo.name, + service_name: dojo_event_service.name, + service_group_id: dojo_event_service.group_id, + event_id: e['event_id'], + event_url: e['event_url'], + participants: e['accepted'], + evented_at: Time.zone.parse(e['started_at'])) + end end end end @@ -48,17 +50,19 @@ def run(dojos, date) } dojos.each do |dojo| - drkp.fetch_events(params.merge(group_id: dojo.dojo_event_service.group_id)).each do |e| - next unless e['group'].to_s == dojo.dojo_event_service.group_id + dojo.dojo_event_services.each do |dojo_event_service| + drkp.fetch_events(params.merge(group_id: dojo_event_service.group_id)).each do |e| + next unless e['group'].to_s == dojo_event_service.group_id - EventHistory.create!(dojo_id: dojo.id, - dojo_name: dojo.name, - service_name: dojo.dojo_event_service.name, - service_group_id: dojo.dojo_event_service.group_id, - event_id: e['id'], - event_url: e['public_url'], - participants: e['participants'], - evented_at: Time.zone.parse(e['starts_at'])) + EventHistory.create!(dojo_id: dojo.id, + dojo_name: dojo.name, + service_name: dojo_event_service.name, + service_group_id: dojo_event_service.group_id, + event_id: e['id'], + event_url: e['public_url'], + participants: e['participants'], + evented_at: Time.zone.parse(e['starts_at'])) + end end end end @@ -75,17 +79,19 @@ def run(dojos, date) } dojos.each do |dojo| - fsbk.fetch_events(params.merge(group_id: dojo.dojo_event_service.group_id)).each do |e| - next unless e.dig('owner', 'id') == dojo.dojo_event_service.group_id + dojo.dojo_event_services.each do |dojo_event_service| + fsbk.fetch_events(params.merge(group_id: dojo_event_service.group_id)).each do |e| + next unless e.dig('owner', 'id') == dojo_event_service.group_id - EventHistory.create!(dojo_id: dojo.id, - dojo_name: dojo.name, - service_name: dojo.dojo_event_service.name, - service_group_id: dojo.dojo_event_service.group_id, - event_id: e['id'], - event_url: "https://www.facebook.com/events/#{e['id']}", - participants: e['attending_count'], - evented_at: Time.zone.parse(e['start_time'])) + EventHistory.create!(dojo_id: dojo.id, + dojo_name: dojo.name, + service_name: dojo_event_service.name, + service_group_id: dojo_event_service.group_id, + event_id: e['id'], + event_url: "https://www.facebook.com/events/#{e['id']}", + participants: e['attending_count'], + evented_at: Time.zone.parse(e['start_time'])) + end end end end diff --git a/lib/statistics/client.rb b/lib/statistics/client.rb index 817e03611..987c2ff60 100644 --- a/lib/statistics/client.rb +++ b/lib/statistics/client.rb @@ -121,10 +121,14 @@ def initialize def fetch_events(group_id:, since_at: nil, until_at: nil) params = { fields: %i(attending_count start_time owner), - limit: 100, - since: since_at, - until: until_at - }.compact + limit: 100 + }.tap do |h| + # @note FacebookのGraph APIはPDTがタイムゾーンとなっており、 + # JST<->PDTのオフセット8時間を追加した時刻をパラメータとする必要がある + # @see https://github.com/coderdojo-japan/coderdojo.jp/pull/182#discussion_r148935458 + h[:since] = since_at.since(8.hours).to_i if since_at + h[:until] = until_at.since(8.hours).to_i if until_at + end events = [] diff --git a/lib/tasks/dojo_event_services.rake b/lib/tasks/dojo_event_services.rake index e187644f3..721fd82d9 100644 --- a/lib/tasks/dojo_event_services.rake +++ b/lib/tasks/dojo_event_services.rake @@ -19,23 +19,19 @@ namespace :dojo_event_services do next end - insert = false - unless dojo.dojo_event_service - dojo.build_dojo_event_service - insert = true - end - - dojo.dojo_event_service.assign_attributes(des.except('dojo_id')) - if dojo.dojo_event_service.changed? - changes = dojo.dojo_event_service.changes - dojo.dojo_event_service.save! - (insert ? result[:inserted] : result[:updated]) << [des['dojo_id'], changes] + dojo_event_service = dojo.dojo_event_services.find_or_initialize_by(des) + if dojo_event_service.changed? + changes = dojo_event_service.changes + new_record = dojo_event_service.new_record? + dojo_event_service.save! + (new_record ? result[:inserted] : result[:updated]) << ["#{des['dojo_id']}:#{dojo_event_service.id}", changes] else - result[:kept] << [des['dojo_id']] + result[:kept] << ["#{des['dojo_id']}:#{dojo_event_service.id}"] end end # Dump result + result[:skipped] = result[:skipped].uniq {|s| s.first } result.except!(:kept, :skipped) unless ENV.key?('DEBUG') sorted = result.sort_by {|_, v| v.length }.reverse.to_h puts