tmecklem/shipmate

View on GitHub
app/controllers/ios_apps_controller.rb

Summary

Maintainability
A
0 mins
Test Coverage
require 'shipmate/ipa_parser'

class IosAppsController < AppsController

  include AppListingModule

  APP_ASSET_INDEX = 0
  ICON_ASSET_INDEX = 1

  attr_accessor :ios_dir

  def initialize
    @ios_dir = Shipmate::Application.config.ios_dir
    FileUtils.mkdir_p(@ios_dir)
    super
  end

  def list_app_releases
    @app_name = params[:app_name]
    app_builds = self.app_builds(@app_name, @ios_dir, IOS_APP_TYPE)

    @most_recent_build_hash = most_recent_build_by_release(app_builds)
    @app_releases = @most_recent_build_hash.keys.sort{|x,y| y.to_version_string<=>x.to_version_string }
    @mobileprovision = mobileprovision_file_url(@app_name)
    @mobileprovision_file_name = mobileprovision_file_name(@app_name)

  end

  def mobileprovision_file_url(app_name)
    mobileprovision_file = Dir.glob(@ios_dir.join(app_name,"*.mobileprovision")).first
    if mobileprovision_file
      "#{request.base_url}/apps/ios/#{app_name}/#{mobileprovision_file.split('/').last}"
    else
      nil
    end
  end

  def mobileprovision_file_name(app_name)
    mobileprovision_file = Dir.glob(@ios_dir.join(app_name,"*.mobileprovision")).first
    if mobileprovision_file
      "#{mobileprovision_file.split('/').last}"
    else
      nil
    end
  end

  def list_app_builds
    @app_name = params[:app_name]
    @app_release = params[:app_release]

    @app_builds = self.app_builds(@app_name, @ios_dir, IOS_APP_TYPE).select do |app_build|
      app_build.release.eql?(@app_release)
    end
  end

  def most_recent_build_by_release(app_builds)
    most_recent_builds_hash = {}
    app_builds.each do |app_build|
      most_recent_builds_hash[app_build.release] ||= app_build
    end
    most_recent_builds_hash
  end

  def show_build
    expires_now
    @app_build = IosBuild.new(@ios_dir, params[:app_name], params[:build_version])
  end

  def show_build_manifest
    expires_now
    @app_name = params[:app_name]
    build_version = params[:build_version]
    
    respond_to do |format|
      format.plist { render :text => gen_plist_hash(@app_name, build_version).to_plist(plist_format: CFPropertyList::List::FORMAT_XML) }
    end
  end

  def gen_plist_hash(app_name, build_version)
    app_build = IosBuild.new(@ios_dir, app_name, build_version)
    plist_hash = app_build.manifest_plist_hash
    replace_url_in_plist_hash APP_ASSET_INDEX, "#{public_url_for_build_directory(@app_name, build_version)}/#{@app_name}-#{build_version}.ipa", plist_hash
    replace_url_in_plist_hash ICON_ASSET_INDEX, "#{public_url_for_build_directory(@app_name, build_version)}/Icon.png", plist_hash
    plist_hash
  end

  def public_url_for_build_directory(app_name, build_version)
    "#{request.base_url}/apps/ios/#{app_name}/#{build_version}"
  end

  def replace_url_in_plist_hash(asset_type, url, plist_hash)
    plist_hash["items"][0]["assets"][asset_type]['url'] = URI.escape(url)
  end

  def upload_mobileprovision
    @mobile_provisioning_file = params[:upload_mobileprovision][:file]

    delete_mobileprovision_files_for_app(params[:app_name])

    File.open("public/apps/ios/#{params[:app_name]}/#{@mobile_provisioning_file.original_filename}", 'wb') do |f|
      if f.write @mobile_provisioning_file.read
        flash[:notice] = "Successfully saved the mobileprovision file for #{params[:app_name]}"
      else
        flash[:error] = "There was a problem saving the mobileprovision file for #{params[:app_name]}"
      end
    end

    # TODO why isn't this working?
    redirect_to list_ios_app_releases_path
  end

  private

  def delete_mobileprovision_files_for_app(app_name)
    mobileprovision_files = Dir.glob(@ios_dir.join(app_name,"*.mobileprovision"))
    mobileprovision_files.each do |file|
      File.delete(file)
    end
  end

end