class Fastlane::Helper::HuaweiAppgalleryHelperV2

Public Class Methods

get_upload_url(client_id, access_token, app_id) click to toggle source
# File lib/fastlane/plugin/huawei_appgallery/helper/huawei_appgallery_helper_v2.rb, line 68
def self.get_upload_url(client_id, access_token, app_id)
  UI.message("Obtaining upload url ...")

  uri = URI("https://connect-api.cloud.huawei.com/api/publish/v2/upload-url?appId=#{app_id}&suffix=apk")
  http = Net::HTTP.new(uri.host, uri.port)
  http.use_ssl = true
  request = Net::HTTP::Get.new(uri)
  request['Authorization'] = "Bearer #{access_token}"
  request['client_id'] = client_id
  result = http.request(request)

  if result.code.to_i != 200
    UI.user_error!("Could not apk upload url from app gallery api. (HTTP #{result.code} - #{result.message})")
  end

  # result json containing "authCode", "uploadUrl"
  result_json = JSON.parse(result.body)
  result_json
end
launch_submit_request(client_id, access_token, app_id) click to toggle source
# File lib/fastlane/plugin/huawei_appgallery/helper/huawei_appgallery_helper_v2.rb, line 191
def self.launch_submit_request(client_id, access_token, app_id)
  # should be in format yyyy-MM-dd'T'HH:mm:ssZZ, must be escaped to be GET param
  # https://apidock.com/ruby/DateTime/strftime
  # https://www.shortcutfoo.com/app/dojos/ruby-date-format-strftime/cheatsheet
  release_time = CGI::escape(Time.now.utc.strftime("%FT%T%z")) # as soon as possible
  UI.message("Use release time #{release_time}")

  uri = URI("https://connect-api.cloud.huawei.com/api/publish/v2/app-submit?appId=#{app_id}&releaseTime=#{release_time}")
  http = Net::HTTP.new(uri.host, uri.port)
  http.use_ssl = true
  request = Net::HTTP::Post.new(uri)
  request['Content-Type'] = "application/json"
  request['Accept'] = 'application/json'
  request['Authorization'] = "Bearer #{access_token}"
  request['client_id'] = client_id
  result = http.request(request)

  if result.code.to_i != 200
    UI.user_error!("Could not submit app for review. (HTTP #{result.code} - #{result.message})")
  end

  result_json = JSON.parse(result.body)
  json_ret = result_json['ret']
  UI.message("app-submit ret: #{json_ret}")
  result_code = json_ret['code']

  if result_code == 0
    UI.message('Submission was successfull!')
  end

  return result_code
end
request_access_token(client_id, client_secret) click to toggle source
# File lib/fastlane/plugin/huawei_appgallery/helper/huawei_appgallery_helper_v2.rb, line 10
def self.request_access_token(client_id, client_secret)
  UI.message("Requesting access token from Huawei AppGallery ...")

  content = {'grant_type' => 'client_credentials', 'client_id' => client_id, 'client_secret' => client_secret}

  result = Net::HTTP.post(
    URI("https://connect-api.cloud.huawei.com/api/oauth2/v1/token"),
    content.to_json.encode('utf-8'),
    "Content-Type" => "application/json"
  )

  if result.code.to_i != 200
    UI.user_error!("Could not get access token from app gallery api. (HTTP #{result.code} - #{result.message})")
  end

  result_json = JSON.parse(result.body)
  access_token = result_json['access_token']
  access_token
end
submit_app(client_id, access_token, app_id) click to toggle source
# File lib/fastlane/plugin/huawei_appgallery/helper/huawei_appgallery_helper_v2.rb, line 176
def self.submit_app(client_id, access_token, app_id)
  UI.message('Submitting app for review ...')
  result_code = launch_submit_request(client_id, access_token, app_id)
  if result_code == 204144660 # https://developer.huawei.com/consumer/en/doc/development/AppGallery-connect-References/agcapi-returncode_v2
    UI.message('Submission failed, waiting some time and try again.')
    sleep(120)
    if launch_submit_request(client_id, access_token, app_id) != 0
      UI.user_error!('Submission failed again.')
    end
  elsif result_code != 0 
    UI.user_error!('Submission failed.')
  end
end
update_app_file_information(client_id, access_token, app_id, apk_server_path) click to toggle source
# File lib/fastlane/plugin/huawei_appgallery/helper/huawei_appgallery_helper_v2.rb, line 145
def self.update_app_file_information(client_id, access_token, app_id, apk_server_path)
  UI.message("Updating app file information ...")

  content = {
    'fileType' => 5, # type 5 = RPK or APK
    'files' => [{
      'fileName' => 'naviki-release.apk', 
      'fileDestUrl' => apk_server_path
    }]
  }

  uri = URI("https://connect-api.cloud.huawei.com/api/publish/v2/app-file-info?appId=#{app_id}")
  http = Net::HTTP.new(uri.host, uri.port)
  http.use_ssl = true
  request = Net::HTTP::Put.new(uri)
  request.body = content.to_json.encode('utf-8')
  request['Content-Type'] = "application/json"
  request['Authorization'] = "Bearer #{access_token}"
  request['client_id'] = client_id
  result = http.request(request)

  if result.code.to_i != 200
    UI.user_error!("Could not update app file information. (HTTP #{result.code} - #{result.message})")
  end

  result_json = JSON.parse(result.body)
  json_ret = result_json['ret']
  UI.message("app-file-info ret: #{json_ret}")
end
update_release_notes(client_id, access_token, app_id, release_notes) click to toggle source
# File lib/fastlane/plugin/huawei_appgallery/helper/huawei_appgallery_helper_v2.rb, line 31
def self.update_release_notes(client_id, access_token, app_id, release_notes)
  release_notes.each do |lang, notes|
    UI.message("Updating release notes for language #{lang} ...")

    content = {'lang' => lang, 'newFeatures' => notes}

    uri = URI("https://connect-api.cloud.huawei.com/api/publish/v2/app-language-info?appId=#{app_id}")
    http = Net::HTTP.new(uri.host, uri.port)
    http.use_ssl = true
    request = Net::HTTP::Put.new(uri)
    request.body = content.to_json.encode('utf-8')
    request['Content-Type'] = "application/json"
    request['Authorization'] = "Bearer #{access_token}"
    request['client_id'] = client_id
    result = http.request(request)

    if result.code.to_i != 200
      UI.user_error!("Could not update release notes for #{lang}. (HTTP #{result.code} - #{result.message})")
    end
  end
end
upload_apk(client_id, access_token, app_id, apk_path) click to toggle source
# File lib/fastlane/plugin/huawei_appgallery/helper/huawei_appgallery_helper_v2.rb, line 54
def self.upload_apk(client_id, access_token, app_id, apk_path)
  # get upload url and auth code
  upload_url_result = self.get_upload_url(client_id, access_token, app_id)
  auth_code = upload_url_result['authCode']
  upload_url = upload_url_result['uploadUrl']

  # upload apk
  server_apk_url = self.upload_apk_to_api(auth_code, upload_url, apk_path)

  # update app file information
  self.update_app_file_information(client_id, access_token, app_id, server_apk_url)
end
upload_apk_to_api(auth_code, upload_url, apk_path) click to toggle source
# File lib/fastlane/plugin/huawei_appgallery/helper/huawei_appgallery_helper_v2.rb, line 89
def self.upload_apk_to_api(auth_code, upload_url, apk_path)
  UI.message("Uploading apk to #{upload_url} ...")

  boundary = "-----------------755754302457647"

  uri = URI(upload_url)
  http = Net::HTTP.new(uri.host, uri.port)
  http.use_ssl = true
  request = Net::HTTP::Post.new(uri)
  request['Accept'] = 'application/json'
  request['Content-Type'] = "multipart/form-data; boundary=#{boundary}"

  post_body = []
  # add auth code
  post_body << "--#{boundary}\r\n"
  post_body << "Content-Disposition: form-data; name=\"authCode\"\r\n\r\n"
  post_body << auth_code
  post_body << "\r\n"
  # add file count
  post_body << "--#{boundary}\r\n"
  post_body << "Content-Disposition: form-data; name=\"fileCount\"\r\n\r\n"
  post_body << "1"
  post_body << "\r\n"
  # add parse type
  post_body << "--#{boundary}\r\n"
  post_body << "Content-Disposition: form-data; name=\"parseType\"\r\n\r\n"
  post_body << "0"
  post_body << "\r\n"
  # add apk
  post_body << "--#{boundary}\r\n"
  post_body << "Content-Disposition: form-data; name=\"file\"; filename=\"release.apk\"\r\n"
  post_body << "Content-Type: multipart/form-data\r\n\r\n"
  post_body << File.read(apk_path).encode('utf-8')
  post_body << "\r\n"

  post_body << "--#{boundary}--\r\n"
  request.body = post_body.join
  result = http.request(request)

  if result.code.to_i != 200
    UI.user_error!("Could not upload apk to gallery api. (HTTP #{result.code} - #{result.message})")
  end

  # example response
  # {"result":{"UploadFileRsp":{"fileInfoList":[{"fileDestUlr":"https://developerfile7.hicloud.com/FileServer/getFile/7/appapktemp/20200727/appapk/000/000/410/0890049000000000410.20200727174607.32489040188051103716016542322538:20200727174634:2500:AD10C3C4138E988C7A1C3680440C84559E2DD6184DF5A2E1C457C23868E5F277.apk","size":86803266}],"ifSuccess":1},"resultCode":"0"}}
  result_json = JSON.parse(result.body)
  json_result_obj = result_json['result']
  json_upload_file_rsp = json_result_obj['UploadFileRsp']
  json_file_info_list = json_upload_file_rsp['fileInfoList']
  json_file_info = json_file_info_list.first()
  file_dest_url = json_file_info['fileDestUlr'] # ulr is correct

  file_dest_url
end