Class: Mysigner::Upload::PlayStoreUploader

Inherits:
Object
  • Object
show all
Defined in:
lib/mysigner/upload/play_store_uploader.rb

Defined Under Namespace

Classes: CredentialsError, PartialUploadError, TrackError, UploadError

Constant Summary collapse

VALID_TRACKS =
%w[internal alpha beta production].freeze
SCOPE =
'https://www.googleapis.com/auth/androidpublisher'

Instance Method Summary collapse

Constructor Details

#initialize(aab_path:, access_token:, package_name:) ⇒ PlayStoreUploader

Phase 0: accepts a short-lived OAuth2 access_token (minted server-side from the customer’s service-account JSON). The JSON no longer leaves the server. google-api-ruby-client accepts a bare string for authorization= and sends it as ‘Authorization: Bearer <token>`.

Raises:



30
31
32
33
34
35
36
37
38
39
# File 'lib/mysigner/upload/play_store_uploader.rb', line 30

def initialize(aab_path:, access_token:, package_name:)
  @aab_path = File.expand_path(aab_path)
  @access_token = access_token
  @package_name = package_name

  raise CredentialsError, 'access_token is required' if @access_token.nil? || @access_token.to_s.empty?

  validate_aab!
  setup_google_client!
end

Instance Method Details

#assign_existing_to_track!(version_code, track:, release_notes: nil, user_fraction: nil) ⇒ Object

Assign an existing version code to a track



139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
# File 'lib/mysigner/upload/play_store_uploader.rb', line 139

def assign_existing_to_track!(version_code, track:, release_notes: nil, user_fraction: nil)
  @current_track = track # Store for error messages
  begin
    edit = create_edit
    assign_to_track(edit.id, track, version_code, release_notes: release_notes, user_fraction: user_fraction)
    commit_edit(edit.id)

    {
      success: true,
      version_code: version_code,
      track: track,
      package_name: @package_name
    }
  rescue Google::Apis::ClientError => e
    error_message = parse_google_error(e)
    raise TrackError, "Failed to assign to track: #{error_message}"
  end
end

#upload!(track: 'internal', release_notes: nil, user_fraction: nil, status: nil, in_app_update_priority: nil, release_name: nil, country_targeting: nil, changes_not_sent_for_review: nil) ⇒ Hash

Upload AAB and optionally assign to a track

Parameters:

  • track (String) (defaults to: 'internal')

    Track to assign: internal, alpha, beta, production

  • release_notes (Hash) (defaults to: nil)

    Localized release notes { ‘en-US’ => ‘What's new…’ }

  • user_fraction (Float) (defaults to: nil)

    Rollout percentage (0.0-1.0) for staged rollouts

  • status (String) (defaults to: nil)

    Explicit release status: draft | inProgress | completed. Overrides the user_fraction-derived default. ‘draft` is useful for “upload, don’t release yet” flows that iOS-MANUAL users expect.

  • in_app_update_priority (Integer) (defaults to: nil)

    0–5 priority hint for in-app update flows

  • release_name (String) (defaults to: nil)

    Optional release name (defaults to AAB versionName)

  • country_targeting (Hash) (defaults to: nil)

    { countries: [‘US’,‘CA’], include_rest_of_world: false }

  • changes_not_sent_for_review (Boolean) (defaults to: nil)

    Skip submitting changes to Play review on commit

Returns:

  • (Hash)

    Upload result with version_code and track info



53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
# File 'lib/mysigner/upload/play_store_uploader.rb', line 53

def upload!(track: 'internal', release_notes: nil, user_fraction: nil,
            status: nil, in_app_update_priority: nil, release_name: nil,
            country_targeting: nil, changes_not_sent_for_review: nil)
  @current_track = track # Store for error messages
  say_uploading(track)

  version_code = nil

  begin
    # 1. Create an edit
    edit = create_edit

    # 2. Upload the AAB
    bundle = upload_bundle(edit.id)
    version_code = bundle.version_code

    say_upload_success(version_code)

    # 3. Assign to track with release
    if track
      assign_to_track(
        edit.id, track, version_code,
        release_notes: release_notes,
        user_fraction: user_fraction,
        status: status,
        in_app_update_priority: in_app_update_priority,
        release_name: release_name,
        country_targeting: country_targeting
      )
    end

    # 4. Commit the edit
    commit_edit(edit.id, changes_not_sent_for_review: changes_not_sent_for_review)

    say_success(track, version_code)

    {
      success: true,
      version_code: version_code,
      track: track,
      package_name: @package_name
    }
  rescue Google::Apis::ClientError => e
    error_message = parse_google_error(e)
    # If AAB was uploaded, raise PartialUploadError so CLI can save the version
    raise PartialUploadError.new("Google Play API error: #{error_message}", version_code: version_code) if version_code

    raise UploadError, "Google Play API error: #{error_message}"
  rescue PartialUploadError
    # Re-raise as-is
    raise
  rescue StandardError => e
    raise PartialUploadError.new("Upload failed: #{e.message}", version_code: version_code) if version_code

    raise UploadError, "Upload failed: #{e.message}"
  end
end

#upload_bundle_only!Object

Upload AAB only (without assigning to track)



112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
# File 'lib/mysigner/upload/play_store_uploader.rb', line 112

def upload_bundle_only!
  say_uploading(nil)

  begin
    edit = create_edit
    bundle = upload_bundle(edit.id)
    version_code = bundle.version_code

    say_upload_success(version_code)

    # Don't assign to track, just commit
    commit_edit(edit.id)

    {
      success: true,
      version_code: version_code,
      package_name: @package_name
    }
  rescue Google::Apis::ClientError => e
    error_message = parse_google_error(e)
    raise UploadError, "Google Play API error: #{error_message}"
  rescue StandardError => e
    raise UploadError, "Upload failed: #{e.message}"
  end
end