Skip to content

[WIP]Create recently events task #278

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
c02f95c
touch events.html.haml and add static_pages_controller_spec test
AnaTofuZ Feb 28, 2018
2a0529a
modofied namespace statiscs/providers/ to providers/
AnaTofuZ Mar 5, 2018
1a03b3c
remove module Statistics namespace for lib/providers/*.rb
AnaTofuZ Mar 5, 2018
cb0a915
Merge branch 'add_events_pages' of ssh://github.com/AnaTofuZ/coderdoj…
AnaTofuZ Mar 5, 2018
4b8f227
lib/statistics.rbでの `providers` の名前空間からstatisticsを外した
AnaTofuZ Mar 5, 2018
ec1f07b
名前空間の変更に伴うlib/tasks/statistics.rakeでのStatistics::Providersの名前修正
AnaTofuZ Mar 5, 2018
1e412e4
git mv spec/lib/statistics/providers -> spec/lib/providers/*
AnaTofuZ Mar 5, 2018
4721898
spec/lib/providers* でのテスト対象の名前空間の修正
AnaTofuZ Mar 5, 2018
6219af4
rm `/events` components
AnaTofuZ Mar 5, 2018
f341803
remove spec/controller/static_pages_controller_spec for /evens
AnaTofuZ Mar 5, 2018
f609b2d
git mv providers/* -> eventservice/providers/*
AnaTofuZ Mar 5, 2018
b30cdbd
move providers.rb to eventservice/providers.rb and new eventservice.r…
AnaTofuZ Mar 5, 2018
fd426de
add eventservice name space for lib/**/*.rb
AnaTofuZ Mar 5, 2018
d044d00
modified lib/eventservice/providers/*.rb indents
AnaTofuZ Mar 5, 2018
a20eac9
git mv spec/lib/providers -> spec/lib/eventservice/providers
AnaTofuZ Mar 5, 2018
0fd4ef8
modofied spec/lib/eventservice/providers use Providers -> EventServic…
AnaTofuZ Mar 5, 2018
4fc5347
modofied lib/task/statistics use Providers -> EventService::Providers
AnaTofuZ Mar 5, 2018
5e052ab
use Everything namespace for lib/statistics/tasks/*.rb
AnaTofuZ Mar 5, 2018
1482972
generate migration create_recent_events_table
AnaTofuZ Mar 6, 2018
2fe30dc
create recently_events table and migrateion
AnaTofuZ Mar 6, 2018
4d14b16
create RecentlyEvent model
AnaTofuZ Mar 7, 2018
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions app/models/recently_event.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
class RecentlyEvent < ApplicationRecord
EXTERNAL_SERVICES = %i( connpass doorkeeper facebook )
INTERNAL_SERVICES = %i( static_yaml )

belongs_to :dojo
enum name: EXTERNAL_SERVICES + INTERNAL_SERVICES

validates :name, presence: true

scope :for, ->(service) { where(name: service) }
end
17 changes: 17 additions & 0 deletions db/migrate/20180306024000_create_recently_events.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
class CreateRecentlyEvents < ActiveRecord::Migration[5.1]
def change
create_table :recently_events do |t|
t.integer :dojo_id, null: false
t.string :dojo_name, null: false
t.string :service_name, null: false
t.string :service_group_id
t.string :event_id, null: false
t.string :event_url, null: false
t.datetime :event_at, null: false

t.index ["dojo_id"], name: "index_recently_events_on_dojo_id"
t.index ["event_at"], name: "index_recently_events_on_event_at"
t.index ["event_at", "dojo_id"], name: "index_recently_events_on_event_at_and_dojo_id"
end
end
end
15 changes: 14 additions & 1 deletion db/schema.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
#
# It's strongly recommended that you check this file into your version control system.

ActiveRecord::Schema.define(version: 20180117164209) do
ActiveRecord::Schema.define(version: 20180306024000) do

# These are extensions that must be enabled in order to support this database
enable_extension "plpgsql"
Expand Down Expand Up @@ -61,6 +61,19 @@
t.index ["region"], name: "index_prefectures_on_region"
end

create_table "recently_events", force: :cascade do |t|
t.integer "dojo_id", null: false
t.string "dojo_name", null: false
t.string "service_name", null: false
t.string "service_group_id"
t.string "event_id", null: false
t.string "event_url", null: false
t.datetime "event_at", null: false
t.index ["dojo_id"], name: "index_recently_events_on_dojo_id"
t.index ["event_at", "dojo_id"], name: "index_recently_events_on_event_at_and_dojo_id"
t.index ["event_at"], name: "index_recently_events_on_event_at"
end

add_foreign_key "dojo_event_services", "dojos"
add_foreign_key "event_histories", "dojos"
end
3 changes: 3 additions & 0 deletions lib/eventservice.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
module EventService; end

require_relative 'eventservice/providers'
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
module Statistics
module EventService
module Providers
end
end
Expand Down
42 changes: 42 additions & 0 deletions lib/eventservice/providers/connpass.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
module EventService
module Providers
class Connpass
ENDPOINT = 'https://connpass.com/api/v1'.freeze

def initialize
@client = Statistics::Client.new(ENDPOINT)
end

def search(keyword:)
@client.get('event/', { keyword: keyword, count: 100 })
end

def fetch_events(series_id:, yyyymm: nil, yyyymmdd: nil)
params = {
series_id: series_id,
start: 1,
count: 100
}
params[:ym] = yyyymm if yyyymm
params[:ymd] = yyyymmdd if yyyymmdd
events = []

loop do
part = @client.get('event/', params)

break if part['results_returned'].zero?

events.push(*part.fetch('events'))

break if part.size < params[:count]

break if params[:start] + params[:count] > part['results_available']

params[:start] += params[:count]
end

events
end
end
end
end
51 changes: 51 additions & 0 deletions lib/eventservice/providers/doorkeeper.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
module EventService
module Providers
class Doorkeeper
ENDPOINT = 'https://api.doorkeeper.jp'.freeze

def initialize
@client = Statistics::Client.new(ENDPOINT) do |c|
c.authorization(:Bearer, ENV.fetch('DOORKEEPER_API_TOKEN'))
end
@default_since = Time.zone.parse('2010-07-01')
@default_until = Time.zone.now.end_of_day
end

def search(keyword:)
@client.get('events', q: keyword, since: @default_since, expand: 'group')
end

def fetch_events(group_id:, since_at: @default_since, until_at: @default_until)
begin
params = {
page: 1,
since: since_at,
until: until_at
}
events = []

loop do
part = @client.get("groups/#{group_id}/events", params)

break if part.size.zero?

events.push(*part.map { |e| e['event'] })

break if part.size < 25 # 25 items / 1 request

params[:page] += 1
end

events
rescue Faraday::ClientError => e
raise e unless e.response[:status] == 429

puts 'API rate limit exceeded.'
puts "This task will retry in 60 seconds from now(#{Time.zone.now})."
sleep 60
retry
end
end
end
end
end
34 changes: 34 additions & 0 deletions lib/eventservice/providers/facebook.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
module EventService
module Providers
class Facebook
class_attribute :access_token

def initialize
@client = Koala::Facebook::API.new(self.access_token)
end

def fetch_events(group_id:, since_at: nil, until_at: nil)
params = {
fields: %i(attending_count start_time owner),
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 = []

collection = @client.get_object("#{group_id}/events", params)
events.push(*collection.to_a)
while !collection.empty? && collection.paging['next'] do
events.push(*collection.next_page.to_a)
end

events
end
end
end
end
11 changes: 11 additions & 0 deletions lib/eventservice/providers/static_yaml.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
module EventService
module Providers
class StaticYaml
YAML_FILE = Rails.root.join('db', 'static_event_histories.yaml')

def fetch_events
YAML.load_file(YAML_FILE) || []
end
end
end
end
2 changes: 1 addition & 1 deletion lib/statistics.rb
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
module Statistics; end

require_relative 'statistics/client'
require_relative 'statistics/providers'
require_relative 'statistics/tasks'
require_relative 'statistics/aggregation'
require_relative 'eventservice'
42 changes: 0 additions & 42 deletions lib/statistics/providers/connpass.rb

This file was deleted.

51 changes: 0 additions & 51 deletions lib/statistics/providers/doorkeeper.rb

This file was deleted.

34 changes: 0 additions & 34 deletions lib/statistics/providers/facebook.rb

This file was deleted.

11 changes: 0 additions & 11 deletions lib/statistics/providers/static_yaml.rb

This file was deleted.

2 changes: 1 addition & 1 deletion lib/statistics/tasks/connpass.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ def self.delete_event_histories(period)
end

def initialize(dojos, date, weekly)
@client = Providers::Connpass.new
@client = EventService::Providers::Connpass.new
@dojos = dojos
@params = build_params(date, weekly)
end
Expand Down
2 changes: 1 addition & 1 deletion lib/statistics/tasks/doorkeeper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ def self.delete_event_histories(period)
end

def initialize(dojos, date, weekly)
@client = Providers::Doorkeeper.new
@client = EventService::Providers::Doorkeeper.new
@dojos = dojos
@params = build_params(date, weekly)
end
Expand Down
2 changes: 1 addition & 1 deletion lib/statistics/tasks/facebook.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ def self.delete_event_histories(period)
end

def initialize(dojos, date, weekly)
@client = Providers::Facebook.new
@client = EventService::Providers::Facebook.new
@dojos = dojos
@params = build_params(date, weekly)
end
Expand Down
2 changes: 1 addition & 1 deletion lib/statistics/tasks/static_yaml.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ def self.delete_event_histories(_period)
end

def initialize(dojos, _date, _weekly)
@client = Providers::StaticYaml.new
@client = EventService::Providers::StaticYaml.new
@dojos = dojos
end

Expand Down
Loading