class Fastlane::Helper::HuaweiAppgalleryConnectHelper

Public Class Methods

get_app_info(token, client_id, app_id) click to toggle source
# File lib/fastlane/plugin/huawei_appgallery_connect/helper/huawei_appgallery_connect_helper.rb, line 23
def self.get_app_info(token, client_id, app_id)
  UI.message("Fetching App Info")

  uri = URI.parse("https://connect-api.cloud.huawei.com/api/publish/v2/app-info?appId=#{app_id}")

  http = Net::HTTP.new(uri.host, uri.port)
  http.use_ssl = true
  request = Net::HTTP::Get.new(uri.request_uri)
  request["client_id"] = client_id
  request["Authorization"] = "Bearer #{token}"
  response = http.request(request)
  if !response.kind_of? Net::HTTPSuccess
    UI.user_error!("Cannot obtain app info, please check API Token / Permissions (status code: #{response.code})")
    return false
  end
  result_json = JSON.parse(response.body)

  if result_json['ret']['code'] == 0
    UI.success("Successfully getting app info")
    return result_json['appInfo']
  else
    UI.user_error!(result_json)
    UI.user_error!("Failed to get app info")
  end

end
get_token(client_id, client_secret) click to toggle source
# File lib/fastlane/plugin/huawei_appgallery_connect/helper/huawei_appgallery_connect_helper.rb, line 8
def self.get_token(client_id, client_secret)
  UI.important("Fetching app access token")

  uri = URI('https://connect-api.cloud.huawei.com/api/oauth2/v1/token')
  http = Net::HTTP.new(uri.host, uri.port)
  http.use_ssl = true
  req = Net::HTTP::Post.new(uri.path, 'Content-Type' => 'application/json')
  req.body = {client_id: client_id, grant_type: 'client_credentials', client_secret: client_secret }.to_json
  res = http.request(req)

  result_json = JSON.parse(res.body)

  return result_json['access_token']
end
query_aab_compilation_status(token,params, pkgVersion) click to toggle source
# File lib/fastlane/plugin/huawei_appgallery_connect/helper/huawei_appgallery_connect_helper.rb, line 185
def self.query_aab_compilation_status(token,params, pkgVersion)
  UI.important("Checking aab compilation status")

  uri = URI.parse("https://connect-api.cloud.huawei.com/api/publish/v2/aab/complile/status?appId=#{params[:app_id]}&pkgVersion=#{pkgVersion}")

  http = Net::HTTP.new(uri.host, uri.port)
  http.use_ssl = true
  request = Net::HTTP::Get.new(uri.request_uri)
  request["client_id"] = params[:client_id]
  request["Authorization"] = "Bearer #{token}"

  response = http.request(request)

  if !response.kind_of? Net::HTTPSuccess
    UI.user_error!("Cannot query compilation status (status code: #{response.code}, body: #{response.body})")
    return false
  end

  result_json = JSON.parse(response.body)

  if result_json['ret']['code'] == 0
    return result_json['aabCompileStatus']
  else
    UI.user_error!(result_json)
    return -999
  end
end
submit_app_for_review(token, params) click to toggle source
# File lib/fastlane/plugin/huawei_appgallery_connect/helper/huawei_appgallery_connect_helper.rb, line 213
def self.submit_app_for_review(token, params)
  UI.important("Submitting app for review")

  release_type = ''
  release_time = ''

  if (params[:phase_wise_release] != nil && params[:phase_wise_release]) && (
        params[:phase_release_start_time] == nil ||
        params[:phase_release_end_time] == nil ||
        params[:phase_release_percent] == nil ||
        params[:phase_release_description] == nil
  )
    UI.user_error!("Submit for review failed. Phase wise release requires Start time, End time Release Percent & Descrption")
    return
  elsif params[:phase_wise_release] != nil && params[:phase_wise_release]
    release_type = '&releaseType=3'
  end

  if params[:release_time] != nil
    params[:release_time] = URI::encode(params[:release_time], /\W/)
    release_time = "&releaseTime=#{params[:release_time]}"
  end

  changelog = ''

  if params[:changelog_path] != nil
    changelog_data = File.read(params[:changelog_path])

    if changelog_data.length < 3 || changelog_data.length > 300
      UI.user_error!("Failed to submit app for review. Changelog file length is invalid")
      return
    else
      changelog = "&remark=" + URI::encode(changelog_data)
    end
  end

  uri = URI.parse("https://connect-api.cloud.huawei.com/api/publish/v2/app-submit?appId=#{params[:app_id]}" + changelog + release_type + release_time)

  http = Net::HTTP.new(uri.host, uri.port)
  http.use_ssl = true
  request = Net::HTTP::Post.new(uri.request_uri)
  request["client_id"] = params[:client_id]
  request["Authorization"] = "Bearer #{token}"
  request["Content-Type"] = "application/json"

  if params[:phase_wise_release] != nil && params[:phase_wise_release]
    request.body = {
        phasedReleaseStartTime: params[:phase_release_start_time],
        phasedReleaseEndTime: params[:phase_release_end_time],
        phasedReleasePercent: params[:phase_release_percent],
        phasedReleaseDescription: params[:phase_release_description]
    }.to_json
  end


  response = http.request(request)

  if !response.kind_of? Net::HTTPSuccess
    UI.user_error!("Cannot submit app for review (status code: #{response.code}, body: #{response.body})")
    return false
  end

  result_json = JSON.parse(response.body)

  if result_json['ret']['code'] == 0
      UI.success("Successfully submitted app for review")
  elsif result_json['ret']['code'] == 204144660 && result_json['ret']['msg'].include?("It may take 2-5 minutes")
    UI.important(result_json)
    UI.important("Build is currently processing, waiting for 2 minutes before submitting again...")
    sleep(120)
    self.submit_app_for_review(token, params)
  else
    UI.user_error!(result_json)
    UI.user_error!("Failed to submit app for review.")
  end

end
update_appinfo(client_id, token, app_id, privacy_policy_url) click to toggle source
# File lib/fastlane/plugin/huawei_appgallery_connect/helper/huawei_appgallery_connect_helper.rb, line 50
def self.update_appinfo(client_id, token, app_id, privacy_policy_url)
  UI.important("Updating app info")

  uri = URI.parse("https://connect-api.cloud.huawei.com/api/publish/v2/app-info?appId=#{app_id}")

  http = Net::HTTP.new(uri.host, uri.port)
  http.use_ssl = true
  request = Net::HTTP::Put.new(uri.request_uri)
  request["client_id"] = client_id
  request["Authorization"] = "Bearer #{token}"
  request["Content-Type"] = "application/json"

  request.body = {privacyPolicy: privacy_policy_url}.to_json

  response = http.request(request)
  if !response.kind_of? Net::HTTPSuccess
    UI.user_error!("Cannot update app info, please check API Token / Permissions (status code: #{response.code})")
    return false
  end
  result_json = JSON.parse(response.body)

  if result_json['ret']['code'] == 0
    UI.success("Successfully updated app info")
  else
    UI.user_error!(result_json)
    UI.user_error!("Failed to update app info")
  end
end
upload_app(token, client_id, app_id, apk_path, is_aab) click to toggle source
# File lib/fastlane/plugin/huawei_appgallery_connect/helper/huawei_appgallery_connect_helper.rb, line 80
def self.upload_app(token, client_id, app_id, apk_path, is_aab)
  UI.message("Fetching upload URL")

  responseData = JSON.parse("{}")
  responseData["success"] = false
  responseData["code"] = 0

  if(is_aab)
    uri = URI.parse("https://connect-api.cloud.huawei.com/api/publish/v2/upload-url?appId=#{app_id}&suffix=aab")
    upload_filename = "release.aab"
  else
    uri = URI.parse("https://connect-api.cloud.huawei.com/api/publish/v2/upload-url?appId=#{app_id}&suffix=apk")
    upload_filename = "release.apk"
  end

  http = Net::HTTP.new(uri.host, uri.port)
  http.use_ssl = true
  request = Net::HTTP::Get.new(uri.request_uri)
  request["client_id"] = client_id
  request["Authorization"] = "Bearer #{token}"
  request["Content-Type"] = "application/json"

  response = http.request(request)

  if !response.kind_of? Net::HTTPSuccess
    UI.user_error!("Cannot obtain upload url, please check API Token / Permissions (status code: #{response.code})")
    responseData["success"] = false
    return responseData
  end

  result_json = JSON.parse(response.body)

  if result_json['uploadUrl'].nil?
    UI.user_error!('Cannot obtain upload url')
    responseData["success"] = false
    return responseData
  else
    UI.important('Uploading app')
    # Upload App
    boundary = "755754302457647"
    uri = URI(result_json['uploadUrl'])
    # uri = URI("http://localhost/dashboard/test")
    http = Net::HTTP.new(uri.host, uri.port)
    http.use_ssl = true
    request = Net::HTTP::Post.new(uri)

    form_data = [['file', File.open(apk_path.to_s)],['authCode', result_json['authCode']],['fileCount', '1']]
    request.set_form form_data, 'multipart/form-data'

    result = http.request(request)
    if !result.kind_of? Net::HTTPSuccess
      UI.user_error!("Cannot upload app, please check API Token / Permissions (status code: #{result.code})")
      responseData["success"] = false
      return responseData
    end
    result_json = JSON.parse(result.body)

    if result_json['result']['result_code'].to_i == 0
      UI.success('Upload app to AppGallery Connect successful')
      UI.important("Saving app information")

      uri = URI.parse("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_uri)
      request["client_id"] = client_id
      request["Authorization"] = "Bearer #{token}"
      request["Content-Type"] = "application/json"

      data = {fileType: 5, files: [{

          fileName: upload_filename,
          fileDestUrl: result_json['result']['UploadFileRsp']['fileInfoList'][0]['fileDestUlr'],
          size: result_json['result']['UploadFileRsp']['fileInfoList'][0]['size'].to_s

      }] }.to_json

      request.body = data
      response = http.request(request)
      if !response.kind_of? Net::HTTPSuccess
        UI.user_error!("Cannot save app info, please check API Token / Permissions (status code: #{response.code})")
        responseData["success"] = false
        return responseData
      end
      result_json = JSON.parse(response.body)

      if result_json['ret']['code'] == 0
        UI.success("App information saved.")
        responseData["success"] = true
        responseData["pkgVersion"] = result_json["pkgVersion"][0]
        return responseData
      else
        UI.user_error!(result_json)
        UI.user_error!("Failed to save app information")
        responseData["success"] = false
        return responseData
      end
    else
      responseData["success"] = false
      return responseData
    end
  end
end