From 22634038da055a8c103d5e8f928b63e921d9538c Mon Sep 17 00:00:00 2001 From: Hiroto Nakamura Date: Sun, 13 Nov 2022 05:11:49 +1300 Subject: [PATCH] [spaceship] implement resolution center API in Spaceship::ConnectAPI (#20726) * Get resolution center threads * Add models for resolution messages and rejections * Add resolution center calls to tunes client * fix rubocop findings * Add ability to get resolution center messages from ReviewSubmission (#1) * Fix list issues * Added comment about only available with Apple ID auth Co-authored-by: Addison Brickey Co-authored-by: Josh Holtz --- spaceship/lib/spaceship/connect_api.rb | 5 ++ .../lib/spaceship/connect_api/models/actor.rb | 26 +++++++ .../models/resolution_center_message.rb | 29 ++++++++ .../models/resolution_center_thread.rb | 67 +++++++++++++++++++ .../connect_api/models/review_rejection.rb | 19 ++++++ .../connect_api/models/review_submission.rb | 12 ++++ .../lib/spaceship/connect_api/tunes/tunes.rb | 23 +++++++ 7 files changed, 181 insertions(+) create mode 100644 spaceship/lib/spaceship/connect_api/models/actor.rb create mode 100644 spaceship/lib/spaceship/connect_api/models/resolution_center_message.rb create mode 100644 spaceship/lib/spaceship/connect_api/models/resolution_center_thread.rb create mode 100644 spaceship/lib/spaceship/connect_api/models/review_rejection.rb diff --git a/spaceship/lib/spaceship/connect_api.rb b/spaceship/lib/spaceship/connect_api.rb index 1349cdcfe16..ab993b1a5b6 100644 --- a/spaceship/lib/spaceship/connect_api.rb +++ b/spaceship/lib/spaceship/connect_api.rb @@ -68,6 +68,11 @@ require 'spaceship/connect_api/models/sandbox_tester' require 'spaceship/connect_api/models/territory' +require 'spaceship/connect_api/models/resolution_center_message' +require 'spaceship/connect_api/models/resolution_center_thread' +require 'spaceship/connect_api/models/review_rejection' +require 'spaceship/connect_api/models/actor' + module Spaceship class ConnectAPI # Defined in the App Store Connect API docs: diff --git a/spaceship/lib/spaceship/connect_api/models/actor.rb b/spaceship/lib/spaceship/connect_api/models/actor.rb new file mode 100644 index 00000000000..080d38c7ab7 --- /dev/null +++ b/spaceship/lib/spaceship/connect_api/models/actor.rb @@ -0,0 +1,26 @@ +require_relative '../model' +module Spaceship + class ConnectAPI + class Actor + include Spaceship::ConnectAPI::Model + + attr_accessor :actor_type + attr_accessor :user_first_name + attr_accessor :user_last_name + attr_accessor :user_email + attr_accessor :api_key_id + + attr_mapping({ + actorType: 'actor_type', + userFirstName: 'user_first_name', + userLastName: 'user_last_name', + userEmail: 'user_email', + apiKeyId: 'api_key_id' + }) + + def self.type + return 'actors' + end + end + end +end diff --git a/spaceship/lib/spaceship/connect_api/models/resolution_center_message.rb b/spaceship/lib/spaceship/connect_api/models/resolution_center_message.rb new file mode 100644 index 00000000000..d0efb0f7091 --- /dev/null +++ b/spaceship/lib/spaceship/connect_api/models/resolution_center_message.rb @@ -0,0 +1,29 @@ +require_relative '../model' +require_relative './actor' +require_relative './review_rejection' + +module Spaceship + class ConnectAPI + class ResolutionCenterMessage + include Spaceship::ConnectAPI::Model + + attr_accessor :message_body + attr_accessor :created_date + attr_accessor :rejections + attr_accessor :from_actor + + attr_mapping({ + messageBody: 'message_body', + createdDate: 'created_date', + + # includes + rejections: 'rejections', + fromActor: 'from_actor' + }) + + def self.type + return 'resolutionCenterMessages' + end + end + end +end diff --git a/spaceship/lib/spaceship/connect_api/models/resolution_center_thread.rb b/spaceship/lib/spaceship/connect_api/models/resolution_center_thread.rb new file mode 100644 index 00000000000..bad296a31b1 --- /dev/null +++ b/spaceship/lib/spaceship/connect_api/models/resolution_center_thread.rb @@ -0,0 +1,67 @@ +require_relative '../model' + +module Spaceship + class ConnectAPI + class ResolutionCenterThread + include Spaceship::ConnectAPI::Model + + attr_accessor :state + attr_accessor :can_developer_add_node + attr_accessor :objectionable_content + attr_accessor :thread_type + attr_accessor :created_date + attr_accessor :last_message_response_date + + attr_accessor :resolution_center_messages + attr_accessor :app_store_version + + module ThreadType + REJECTION_BINARY = 'REJECTION_BINARY' + REJECTION_METADATA = 'REJECTION_METADATA' + REJECTION_REVIEW_SUBMISSION = 'REJECTION_REVIEW_SUBMISSION' + APP_MESSAGE_ARC = 'APP_MESSAGE_ARC' + APP_MESSAGE_ARB = 'APP_MESSAGE_ARB' + APP_MESSAGE_COMM = 'APP_MESSAGE_COMM' + end + + attr_mapping({ + state: 'state', + canDeveloperAddNote: 'can_developer_add_node', + objectionableContent: 'objectionable_content', + threadType: 'thread_type', + createdDate: 'created_date', + lastMessageResponseDate: 'last_message_response_date', + + # includes + resolutionCenterMessages: 'resolution_center_messages', + appStoreVersion: 'app_store_version' + }) + + def self.type + return "resolutionCenterThreads" + end + + # + # API + # + + def self.all(client: nil, filter:, includes: nil) + client ||= Spaceship::ConnectAPI + resps = client.get_resolution_center_threads(filter: filter, includes: includes).all_pages + return resps.flat_map(&:to_models) + end + + def fetch_messages(client: nil, filter: {}, includes: nil) + client ||= Spaceship::ConnectAPI + resps = client.get_resolution_center_messages(thread_id: id, filter: filter, includes: includes).all_pages + return resps.flat_map(&:to_models) + end + + def fetch_rejection_reasons(client: nil, includes: nil) + client ||= Spaceship::ConnectAPI + resp = client.get_review_rejection(filter: { 'resolutionCenterMessage.resolutionCenterThread': id }, includes: includes) + return resp.to_models + end + end + end +end diff --git a/spaceship/lib/spaceship/connect_api/models/review_rejection.rb b/spaceship/lib/spaceship/connect_api/models/review_rejection.rb new file mode 100644 index 00000000000..9ae4b7a2af5 --- /dev/null +++ b/spaceship/lib/spaceship/connect_api/models/review_rejection.rb @@ -0,0 +1,19 @@ +require_relative '../model' + +module Spaceship + class ConnectAPI + class ReviewRejection + include Spaceship::ConnectAPI::Model + + attr_accessor :reasons + + attr_mapping({ + reasons: 'reasons' + }) + + def self.type + return 'reviewRejections' + end + end + end +end diff --git a/spaceship/lib/spaceship/connect_api/models/review_submission.rb b/spaceship/lib/spaceship/connect_api/models/review_submission.rb index 67ae3e699b0..ab78bbb2c54 100644 --- a/spaceship/lib/spaceship/connect_api/models/review_submission.rb +++ b/spaceship/lib/spaceship/connect_api/models/review_submission.rb @@ -69,6 +69,18 @@ def add_app_store_version_to_review_items(client: nil, app_store_version_id:) resp = client.post_review_submission_item(review_submission_id: id, app_store_version_id: app_store_version_id) return resp.to_models.first end + + def fetch_resolution_center_threads(client: nil) + client ||= Spaceship::ConnectAPI + resp = client.get_resolution_center_threads(filter: { reviewSubmission: id }, includes: 'reviewSubmission') + return resp.to_models + end + + def latest_resolution_center_messages(client: nil) + client ||= Spaceship::ConnectAPI + threads = fetch_resolution_center_threads(client: client) + threads.first.fetch_messages(client: client) + end end end end diff --git a/spaceship/lib/spaceship/connect_api/tunes/tunes.rb b/spaceship/lib/spaceship/connect_api/tunes/tunes.rb index 02d5ff8b157..74778094974 100644 --- a/spaceship/lib/spaceship/connect_api/tunes/tunes.rb +++ b/spaceship/lib/spaceship/connect_api/tunes/tunes.rb @@ -1252,6 +1252,29 @@ def get_territories(filter: {}, includes: nil, limit: nil, sort: nil) params = tunes_request_client.build_params(filter: nil, includes: nil, limit: nil, sort: nil) tunes_request_client.get("territories", params) end + + # + # resolutionCenter + # + # As of 2022-11-11: + # This is not official available throught the App Store Connect API using an API Key. + # This is only works with Apple ID auth. + # + + def get_resolution_center_threads(filter: {}, includes: nil) + params = tunes_request_client.build_params(filter: filter, includes: includes) + tunes_request_client.get('resolutionCenterThreads', params) + end + + def get_resolution_center_messages(thread_id:, filter: {}, includes: nil) + params = tunes_request_client.build_params(filter: filter, includes: includes) + tunes_request_client.get("resolutionCenterThreads/#{thread_id}/resolutionCenterMessages", params) + end + + def get_review_rejection(filter: {}, includes: nil) + params = tunes_request_client.build_params(filter: filter, includes: includes) + tunes_request_client.get("reviewRejections", params) + end end end end