Skip to content

Commit

Permalink
feat: 🎸 データベースサーバが落ちていたため取得漏れしていたDMのデータをリカバリする (#224)
Browse files Browse the repository at this point in the history
  • Loading branch information
nikukyugamer authored Jul 3, 2022
1 parent 938d8ff commit 4d8bc77
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 13 deletions.
8 changes: 8 additions & 0 deletions app/models/direct_message.rb
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,14 @@ def self.for_spreadsheet
.order(id_number: :asc)
end

def self.missing_records
where(id_number: 1540436647376031755..1540790299618066435)
end

def is_missing_record?
id_number.in?(1540436647376031755..1540790299618066435)
end

# self.user と同義
def sender
User.find_by(id_number: sender_id_number)
Expand Down
20 changes: 12 additions & 8 deletions app/services/dm/importer.rb
Original file line number Diff line number Diff line change
Expand Up @@ -9,18 +9,20 @@ class Importer
INTERVAL_SECONDS = 10

# 最新のものから過去のものに向かって取得していき、取得できなくなったら抜ける
def self.exec(twitter_client: nil, number_of_getters: 1)
def self.exec(twitter_client: nil, number_of_getters: 1, get_dm_per_request: 50)
twitter_client = TwitterRestApi.client(account_key: :gensosenkyo) if twitter_client.blank?

next_cursor = nil
loop_counter = 0

while true
# count は 1 にしておくのが望ましい(それでも28とか取ってきちゃうので)
# count は ループ段階に入ったら 1 にしておくのが望ましい(それでも28とか取ってきちゃうので)
if next_cursor.nil?
dm_events = twitter_client.direct_messages_events(count: 1)
# ここで API リクエスト が発生する
dm_events = twitter_client.direct_messages_events(count: get_dm_per_request)
else
dm_events = twitter_client.direct_messages_events(count: 1, cursor: next_cursor)
# ここで API リクエスト が発生する
dm_events = twitter_client.direct_messages_events(count: get_dm_per_request, cursor: next_cursor)
end

dm_events = dm_events.to_h
Expand All @@ -33,8 +35,6 @@ def self.exec(twitter_client: nil, number_of_getters: 1)

create_user_record(dm, twitter_client)
create_direct_message_record(dm, event)

sleep INTERVAL_SECONDS
end
end

Expand All @@ -43,7 +43,8 @@ def self.exec(twitter_client: nil, number_of_getters: 1)
break if next_cursor.nil?
break if loop_counter >= number_of_getters

sleep INTERVAL_SECONDS * 5
# ループの最初に API リクエスト が発生したので待つ
sleep INTERVAL_SECONDS * 3
end

"[DONE] Dm::Importer.exec"
Expand All @@ -57,7 +58,7 @@ def self.create_user_record(dm, twitter_client)
existing_user = User.find_by(id_number: user_id_number)

if existing_user.blank?
# Twitter API によりユーザー情報を取得する
# Twitter API によりユーザー情報を取得する(API リクエスト が発生する)
target_user = twitter_client.user(user_id_number)

user = User.new(
Expand All @@ -70,6 +71,9 @@ def self.create_user_record(dm, twitter_client)
)

user.save!

# API リクエスト が発生したので待つ
sleep INTERVAL_SECONDS
end
end

Expand Down
32 changes: 27 additions & 5 deletions app/services/sheets/write_and_update/direct_messages.rb
Original file line number Diff line number Diff line change
@@ -1,13 +1,20 @@
module Sheets
module WriteAndUpdate
class DirectMessages
def self.exec
direct_messages = DirectMessage.for_spreadsheet
# データベースサーバが停止していたため、落ちていた際のレコードは別扱いにする
def self.exec(complement_missing_messages: false)
direct_messages = if complement_missing_messages
DirectMessage.missing_records.for_spreadsheet
else
DirectMessage.for_spreadsheet
end

direct_messages.each_slice(100).with_index do |dm_100, index_on_hundred|
prepared_written_data_by_array_in_hash = []

dm_100.each_with_index do |dm, i|
next if complement_missing_messages == false && dm.is_missing_record?

inserted_hash = {}

inserted_hash['screen_name'] = dm.user.screen_name
Expand All @@ -20,16 +27,31 @@ def self.exec
prepared_written_data_by_array_in_hash << inserted_hash
end

two_digit_number = format('%02<number>d', number: index_on_hundred + 1)
sheet_name = "集計_#{two_digit_number}"
two_digit_number = if complement_missing_messages
# 取得漏れは '集計_15' から記録する
format(
'%02<number>d',
number: (index_on_hundred + 14) + 1
)
else
format(
'%02<number>d',
number: index_on_hundred + 1
)
end

sheet_name = "集計_#{two_digit_number}"
written_data = []

prepared_written_data_by_array_in_hash.each_with_index do |written_data_hash, index|
row = []

# TODO: 取得漏れには 10001 始まりを付与したい
id_on_sheet = (index_on_hundred * 100) + (index + 1)
id_on_sheet = if complement_missing_messages
((index_on_hundred + 14) * 100) + (index + 1)
else
(index_on_hundred * 100) + (index + 1)
end

# TODO: ハードコーディングをしたくない
row[0] = id_on_sheet
Expand Down

0 comments on commit 4d8bc77

Please sign in to comment.