fix(app-store): address follow-up review comments
This commit is contained in:
@@ -2,12 +2,15 @@ class Inboxes::FetchAppStoreReviewInboxesJob < ApplicationJob
|
||||
queue_as :scheduled_jobs
|
||||
|
||||
def perform
|
||||
Inbox.where(channel_type: 'Channel::AppStore').find_each(batch_size: 100) do |inbox|
|
||||
next if inbox.account.suspended?
|
||||
next unless inbox.account.feature_enabled?(:channel_app_store)
|
||||
next unless inbox.channel.sync_due?
|
||||
Inbox.includes(:account, :channel).where(channel_type: 'Channel::AppStore').find_each(batch_size: 100) do |inbox|
|
||||
account = inbox.account
|
||||
channel = inbox.channel
|
||||
|
||||
::Inboxes::FetchAppStoreReviewsJob.perform_later(inbox.channel)
|
||||
next if account.suspended?
|
||||
next unless account.feature_enabled?(:channel_app_store)
|
||||
next unless channel.sync_due?
|
||||
|
||||
::Inboxes::FetchAppStoreReviewsJob.perform_later(channel)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -32,15 +32,11 @@ class Channel::AppStore < ApplicationRecord
|
||||
end
|
||||
|
||||
def fetch_reviews
|
||||
app_store_client.fetch_reviews
|
||||
app_store_client.fetch_reviews(since: last_synced_at)
|
||||
end
|
||||
|
||||
def reply_to_review(review_id, response_body, response_id: nil)
|
||||
response = if response_id.present?
|
||||
app_store_client.update_review_response(review_id, response_body)
|
||||
else
|
||||
app_store_client.create_review_response(review_id, response_body)
|
||||
end
|
||||
def reply_to_review(review_id, response_body)
|
||||
response = app_store_client.create_or_update_review_response(review_id, response_body)
|
||||
|
||||
response['id']
|
||||
end
|
||||
|
||||
@@ -8,7 +8,7 @@ class AppStore::SendOnAppStoreService < Base::SendOnChannelService
|
||||
def perform_reply
|
||||
validate_feature_enabled!
|
||||
validate_message_support!
|
||||
source_id = channel.reply_to_review(review_id, reply_content, response_id: existing_response_id)
|
||||
source_id = channel.reply_to_review(review_id, reply_content)
|
||||
message.update!(source_id: source_id) if source_id.present?
|
||||
Messages::StatusUpdateService.new(message, 'delivered').perform
|
||||
rescue StandardError => e
|
||||
@@ -33,13 +33,4 @@ class AppStore::SendOnAppStoreService < Base::SendOnChannelService
|
||||
def reply_content
|
||||
message.outgoing_content.presence || message.content
|
||||
end
|
||||
|
||||
def existing_response_id
|
||||
message.conversation.messages
|
||||
.outgoing
|
||||
.where.not(id: message.id)
|
||||
.where.not(source_id: [nil, ''])
|
||||
.order(created_at: :desc)
|
||||
.pick(:source_id)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -7,14 +7,18 @@ class AppStoreConnect::Client
|
||||
get("/v1/apps/#{channel.app_id}")['data']
|
||||
end
|
||||
|
||||
def fetch_reviews
|
||||
def fetch_reviews(since: nil)
|
||||
reviews = []
|
||||
next_url = nil
|
||||
|
||||
loop do
|
||||
payload = next_url ? get_url(next_url) : get(reviews_path, reviews_query)
|
||||
included = Array(payload['included'])
|
||||
reviews.concat(Array(payload['data']).map { |review| normalize_review(review, included) })
|
||||
review_payloads = Array(payload['data']).map { |review| normalize_review(review, included) }
|
||||
fresh_payloads = fresh_review_payloads(review_payloads, since)
|
||||
reviews.concat(fresh_payloads)
|
||||
|
||||
break if since.present? && fresh_payloads.size < review_payloads.size
|
||||
|
||||
next_url = payload.dig('links', 'next')
|
||||
break if next_url.blank?
|
||||
@@ -24,10 +28,10 @@ class AppStoreConnect::Client
|
||||
end
|
||||
|
||||
def create_review_response(review_id, response_body)
|
||||
post('/v1/customerReviewResponses', review_response_payload(review_id, response_body))['data']
|
||||
create_or_update_review_response(review_id, response_body)
|
||||
end
|
||||
|
||||
def update_review_response(review_id, response_body)
|
||||
def create_or_update_review_response(review_id, response_body)
|
||||
post('/v1/customerReviewResponses', review_response_payload(review_id, response_body))['data']
|
||||
end
|
||||
|
||||
@@ -55,6 +59,21 @@ class AppStoreConnect::Client
|
||||
}
|
||||
end
|
||||
|
||||
def fresh_review_payloads(review_payloads, since)
|
||||
return review_payloads if since.blank?
|
||||
|
||||
review_payloads.select { |review_payload| review_created_after?(review_payload, since) }
|
||||
end
|
||||
|
||||
def review_created_after?(review_payload, since)
|
||||
created_at = Time.zone.parse(review_payload.dig('review', 'attributes', 'createdDate').to_s)
|
||||
return true if created_at.blank?
|
||||
|
||||
created_at > since
|
||||
rescue StandardError
|
||||
true
|
||||
end
|
||||
|
||||
def get(path, query = {})
|
||||
request(:get, "#{Channel::AppStore::API_BASE_URL}#{path}", query: query)
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user