Skip to content

Commit

Permalink
[spaceship] implement resolution center API in Spaceship::ConnectAPI (#…
Browse files Browse the repository at this point in the history
…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 <addbrick@gmail.com>
Co-authored-by: Josh Holtz <me@joshholtz.com>
  • Loading branch information
3 people committed Nov 12, 2022
1 parent 4b30089 commit 2263403
Show file tree
Hide file tree
Showing 7 changed files with 181 additions and 0 deletions.
5 changes: 5 additions & 0 deletions spaceship/lib/spaceship/connect_api.rb
Expand Up @@ -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:
Expand Down
26 changes: 26 additions & 0 deletions 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
@@ -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
@@ -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
19 changes: 19 additions & 0 deletions 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
12 changes: 12 additions & 0 deletions spaceship/lib/spaceship/connect_api/models/review_submission.rb
Expand Up @@ -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
23 changes: 23 additions & 0 deletions spaceship/lib/spaceship/connect_api/tunes/tunes.rb
Expand Up @@ -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
Expand Down

0 comments on commit 2263403

Please sign in to comment.