tryzealot/zealot

View on GitHub
app/services/create_sample_apps_service.rb

Summary

Maintainability
A
2 hrs
Test Coverage
# frozen_string_literal: true

require 'securerandom'

class CreateSampleAppsService
  include ActionView::Helpers::TranslationHelper

  RELEASE_COUNT = 3

  def call(user)
    android_channels_app user
    stardford_app user
  end

  private

  def stardford_app(user)
    app_name = t('demo.app_name1')
    app_bundle_id = 'com.zealot.app-demo'
    channels = %i[Android iOS]
    schemes = [
      t('settings.preset_schemes.beta'),
      t('settings.preset_schemes.adhoc'),
      t('settings.preset_schemes.production'),
    ]
    changelog = [
      {
        author: t('settings.preset_role.developer'),
        date: '2019-10-24 23:0:24 +0800',
        message: 'bump 0.1.0',
        email: 'admin@zealt.com'
      },
      {
        author: t('settings.preset_role.developer'),
        date: '2019-10-23 17:41:41 +0800',
        message: 'fix: xxx',
        email: 'admin@zealt.com'
      },
      {
        author: t('settings.preset_role.developer'),
        date: '2019-10-22 11:11:11 +0800',
        message: 'feat: xxx done',
        email: 'admin@zealt.com'
      }
    ]

    app = create_app(app_name, user)

    schemes.each do |scheme_name|
      scheme = app.schemes.find_or_create_by name: scheme_name
      channels.each do |channel_name|
        channel = scheme.channels.find_or_create_by name: channel_name,
                                                    device_type: channel_name.downcase.to_sym
        bundle_id = generate_bundle_id app_bundle_id, channel
        release_type = case scheme.name
                       when t('settings.preset_schemes.beta')
                         'beta'
                       when t('settings.preset_schemes.adhoc')
                         'adhoc'
                       when t('settings.preset_schemes.production')
                         'release'
                       end

        RELEASE_COUNT.times do |i|
          generate_release(
            channel,
            bundle_id,
            release_type,
            changelog,
            build_version: (i + 1).to_s,
            device_type: 'iPhone'
          )
        end
      end
    end
  end

  def android_channels_app(user)
    app_name = t('demo.app_name2')
    app_bundle_id = 'com.zealot.android.app-demo'
    schemes = [ t('settings.preset_schemes.production') ]
    channels = t('demo.android_channels').values
    changelog = "bump 0.1.0\nfix: xxx\nfeat: xxx done"

    app = create_app(app_name, user)

    schemes.each do |scheme_name|
      scheme = app.schemes.find_or_create_by name: scheme_name
      channels.each_with_index do |channel_name, i|
        channel = scheme.channels.find_or_create_by name: channel_name,
                                                    device_type: :android
        generate_release(
          channel,
          app_bundle_id,
          'release',
          changelog,
          build_version: (i + 1).to_s,
          device_type: 'Phone'
        )
      end
    end
  end

  def generate_release(channel, app_bundle_id, release_type, changelog, build_version: '1', device_type: nil)
    Release.new(
      channel: channel,
      bundle_id: app_bundle_id,
      release_version: '1.0.0',
      build_version: build_version,
      release_type: release_type,
      source: 'API',
      branch: 'develop',
      device_type: device_type || channel.device_type,
      git_commit: SecureRandom.hex,
      changelog: changelog
    ).save(validate: false)
  end

  def generate_devices(release, count)
    count.times do
      release.devices << Device.create(
        udid: SecureRandom.uuid,
        model: DEVICE_MODEL[rand(DEVICE_MODEL.size - 1)],
        platform: 'IOS',
        status: 'ENABLED'
      )
    end
  end

  DEVICE_MODEL = [
    'iPhone 6',
    'iPhone 6s',
    'iPhone 6 Plus',
    'iPhone 7',
    'iPhone 7 Plus',
    'iPhone 8',
    'iPhone 8 Plus',
    'iPhone X',
    'iPhone XR',
    'iPhone XS',
    'iPhone XS Max',
    'iPhone 11',
    'iPhone 11 Pro',
    'iPhone 11 Pro Max',
    'iPhone 12',
    'iPhone 12 mini',
    'iPhone 12 Pro',
    'iPhone 12 Pro Max',
    'iPhone 13',
    'iPhone 13 Pro',
    'iPhone 13 Pro Max'
  ]

  def generate_bundle_id(app_bundle_id, channel)
    "#{app_bundle_id}.#{channel.name.downcase}"
  end

  def create_app(name, user)
    App.find_or_create_by name: name do |a|
      a.users << user
    end
  end
end