tab/db/migrate/20190508204803_add_rpush.rb
2019-05-08 22:50:19 +02:00

402 lines
16 KiB
Ruby

# NOTE TO THE CURIOUS.
#
# Congratulations on being a diligent developer and vetting the migrations
# added to your project!
#
# You're probably thinking "This migration is huge!". It is, but that doesn't
# mean it'll take a long time to run, or that the reason for it being
# this size is because of lousy developers.
#
# Rpush used to be known as Rapns. In an effort to reduce clutter in db/migrate
# for new users of Rpush, what you see below is a concatenation of the
# migrations added to Rapns over its lifetime.
#
# The reason for concatenating old migrations - instead of producing a new
# one that attempts to recreate their accumulative state - is that I don't
# want to introduce any bugs by writing a new migration.
#
# So while this looks like a scary amount of code, it is in fact the safest
# approach. The constituent parts of this migration have been executed
# many times, by many people!
class AddRpush < ActiveRecord::VERSION::MAJOR >= 5 ? ActiveRecord::Migration[5.0] : ActiveRecord::Migration
def self.migrations
[CreateRapnsNotifications, CreateRapnsFeedback,
AddAlertIsJsonToRapnsNotifications, AddAppToRapns,
CreateRapnsApps, AddGcm, AddWpns, AddAdm, RenameRapnsToRpush,
AddFailAfterToRpushNotifications]
end
def self.up
migrations.map(&:up)
end
def self.down
migrations.reverse.each do |m|
begin
m.down
rescue ActiveRecord::StatementInvalid => e
p e
end
end
end
class CreateRapnsNotifications < ActiveRecord::VERSION::MAJOR >= 5 ? ActiveRecord::Migration[5.0] : ActiveRecord::Migration
def self.up
create_table :rapns_notifications do |t|
t.integer :badge, null: true
t.string :device_token, null: false, limit: 64
t.string :sound, null: true, default: "1.aiff"
t.string :alert, null: true
t.text :attributes_for_device, null: true
t.integer :expiry, null: false, default: 1.day.to_i
t.boolean :delivered, null: false, default: false
t.timestamp :delivered_at, null: true
t.boolean :failed, null: false, default: false
t.timestamp :failed_at, null: true
t.integer :error_code, null: true
t.string :error_description, null: true
t.timestamp :deliver_after, null: true
t.timestamps
end
add_index :rapns_notifications, [:delivered, :failed, :deliver_after], name: 'index_rapns_notifications_multi'
end
def self.down
if ActiveRecord.version >= Gem::Version.new('5.1')
if index_name_exists?(:rapns_notifications, 'index_rapns_notifications_multi')
remove_index :rapns_notifications, name: 'index_rapns_notifications_multi'
end
else
if index_name_exists?(:rapns_notifications, 'index_rapns_notifications_multi', true)
remove_index :rapns_notifications, name: 'index_rapns_notifications_multi'
end
end
drop_table :rapns_notifications
end
end
class CreateRapnsFeedback < ActiveRecord::VERSION::MAJOR >= 5 ? ActiveRecord::Migration[5.0] : ActiveRecord::Migration
def self.up
create_table :rapns_feedback do |t|
t.string :device_token, null: false, limit: 64
t.timestamp :failed_at, null: false
t.timestamps
end
add_index :rapns_feedback, :device_token
end
def self.down
if ActiveRecord.version >= Gem::Version.new('5.1')
if index_name_exists?(:rapns_feedback, :index_rapns_feedback_on_device_token)
remove_index :rapns_feedback, name: :index_rapns_feedback_on_device_token
end
else
if index_name_exists?(:rapns_feedback, :index_rapns_feedback_on_device_token, true)
remove_index :rapns_feedback, name: :index_rapns_feedback_on_device_token
end
end
drop_table :rapns_feedback
end
end
class AddAlertIsJsonToRapnsNotifications < ActiveRecord::VERSION::MAJOR >= 5 ? ActiveRecord::Migration[5.0] : ActiveRecord::Migration
def self.up
add_column :rapns_notifications, :alert_is_json, :boolean, null: true, default: false
end
def self.down
remove_column :rapns_notifications, :alert_is_json
end
end
class AddAppToRapns < ActiveRecord::VERSION::MAJOR >= 5 ? ActiveRecord::Migration[5.0] : ActiveRecord::Migration
def self.up
add_column :rapns_notifications, :app, :string, null: true
add_column :rapns_feedback, :app, :string, null: true
end
def self.down
remove_column :rapns_notifications, :app
remove_column :rapns_feedback, :app
end
end
class CreateRapnsApps < ActiveRecord::VERSION::MAJOR >= 5 ? ActiveRecord::Migration[5.0] : ActiveRecord::Migration
def self.up
create_table :rapns_apps do |t|
t.string :key, null: false
t.string :environment, null: false
t.text :certificate, null: false
t.string :password, null: true
t.integer :connections, null: false, default: 1
t.timestamps
end
end
def self.down
drop_table :rapns_apps
end
end
class AddGcm < ActiveRecord::VERSION::MAJOR >= 5 ? ActiveRecord::Migration[5.0] : ActiveRecord::Migration
module Rapns
class App < ActiveRecord::Base
self.table_name = 'rapns_apps'
end
class Notification < ActiveRecord::Base
belongs_to :app
self.table_name = 'rapns_notifications'
end
end
def self.up
add_column :rapns_notifications, :type, :string, null: true
add_column :rapns_apps, :type, :string, null: true
AddGcm::Rapns::Notification.update_all type: 'Rapns::Apns::Notification'
AddGcm::Rapns::App.update_all type: 'Rapns::Apns::App'
change_column :rapns_notifications, :type, :string, null: false
change_column :rapns_apps, :type, :string, null: false
change_column :rapns_notifications, :device_token, :string, { null: true, limit: 64 }
change_column :rapns_notifications, :expiry, :integer, { null: true, default: 1.day.to_i }
change_column :rapns_apps, :environment, :string, null: true
change_column :rapns_apps, :certificate, :text, null: true, default: nil
change_column :rapns_notifications, :error_description, :text, null: true, default: nil
change_column :rapns_notifications, :sound, :string, default: 'default'
rename_column :rapns_notifications, :attributes_for_device, :data
rename_column :rapns_apps, :key, :name
add_column :rapns_apps, :auth_key, :string, null: true
add_column :rapns_notifications, :collapse_key, :string, null: true
add_column :rapns_notifications, :delay_while_idle, :boolean, null: false, default: false
reg_ids_type = ActiveRecord::Base.connection.adapter_name.include?('Mysql') ? :mediumtext : :text
add_column :rapns_notifications, :registration_ids, reg_ids_type, null: true
add_column :rapns_notifications, :app_id, :integer, null: true
add_column :rapns_notifications, :retries, :integer, null: true, default: 0
AddGcm::Rapns::Notification.reset_column_information
AddGcm::Rapns::App.reset_column_information
AddGcm::Rapns::App.all.each do |app|
AddGcm::Rapns::Notification.where(app: app.name).update_all(app_id: app.id)
end
change_column :rapns_notifications, :app_id, :integer, null: false
remove_column :rapns_notifications, :app
if ActiveRecord.version >= Gem::Version.new('5.1')
if index_name_exists?(:rapns_notifications, "index_rapns_notifications_multi")
remove_index :rapns_notifications, name: "index_rapns_notifications_multi"
elsif index_name_exists?(:rapns_notifications, "index_rapns_notifications_on_delivered_failed_deliver_after")
remove_index :rapns_notifications, name: "index_rapns_notifications_on_delivered_failed_deliver_after"
end
else
if index_name_exists?(:rapns_notifications, "index_rapns_notifications_multi", true)
remove_index :rapns_notifications, name: "index_rapns_notifications_multi"
elsif index_name_exists?(:rapns_notifications, "index_rapns_notifications_on_delivered_failed_deliver_after", false)
remove_index :rapns_notifications, name: "index_rapns_notifications_on_delivered_failed_deliver_after"
end
end
add_index :rapns_notifications, [:app_id, :delivered, :failed, :deliver_after], name: "index_rapns_notifications_multi"
end
def self.down
AddGcm::Rapns::Notification.where(type: 'Rapns::Gcm::Notification').delete_all
remove_column :rapns_notifications, :type
remove_column :rapns_apps, :type
change_column :rapns_notifications, :device_token, :string, { null: false, limit: 64 }
change_column :rapns_notifications, :expiry, :integer, { null: false, default: 1.day.to_i }
change_column :rapns_apps, :environment, :string, null: false
change_column :rapns_apps, :certificate, :text, null: false
change_column :rapns_notifications, :error_description, :string, null: true, default: nil
change_column :rapns_notifications, :sound, :string, default: '1.aiff'
rename_column :rapns_notifications, :data, :attributes_for_device
rename_column :rapns_apps, :name, :key
remove_column :rapns_apps, :auth_key
remove_column :rapns_notifications, :collapse_key
remove_column :rapns_notifications, :delay_while_idle
remove_column :rapns_notifications, :registration_ids
remove_column :rapns_notifications, :retries
add_column :rapns_notifications, :app, :string, null: true
AddGcm::Rapns::Notification.reset_column_information
AddGcm::Rapns::App.reset_column_information
AddGcm::Rapns::App.all.each do |app|
AddGcm::Rapns::Notification.where(app_id: app.id).update_all(app: app.key)
end
if ActiveRecord.version >= Gem::Version.new('5.1')
if index_name_exists?(:rapns_notifications, :index_rapns_notifications_multi)
remove_index :rapns_notifications, name: :index_rapns_notifications_multi
end
else
if index_name_exists?(:rapns_notifications, :index_rapns_notifications_multi, true)
remove_index :rapns_notifications, name: :index_rapns_notifications_multi
end
end
remove_column :rapns_notifications, :app_id
add_index :rapns_notifications, [:delivered, :failed, :deliver_after], name: :index_rapns_notifications_multi
end
end
class AddWpns < ActiveRecord::VERSION::MAJOR >= 5 ? ActiveRecord::Migration[5.0] : ActiveRecord::Migration
module Rapns
class Notification < ActiveRecord::Base
self.table_name = 'rapns_notifications'
end
end
def self.up
add_column :rapns_notifications, :uri, :string, null: true
end
def self.down
AddWpns::Rapns::Notification.where(type: 'Rapns::Wpns::Notification').delete_all
remove_column :rapns_notifications, :uri
end
end
class AddAdm < ActiveRecord::VERSION::MAJOR >= 5 ? ActiveRecord::Migration[5.0] : ActiveRecord::Migration
module Rapns
class Notification < ActiveRecord::Base
self.table_name = 'rapns_notifications'
end
end
def self.up
add_column :rapns_apps, :client_id, :string, null: true
add_column :rapns_apps, :client_secret, :string, null: true
add_column :rapns_apps, :access_token, :string, null: true
add_column :rapns_apps, :access_token_expiration, :datetime, null: true
end
def self.down
AddAdm::Rapns::Notification.where(type: 'Rapns::Adm::Notification').delete_all
remove_column :rapns_apps, :client_id
remove_column :rapns_apps, :client_secret
remove_column :rapns_apps, :access_token
remove_column :rapns_apps, :access_token_expiration
end
end
class RenameRapnsToRpush < ActiveRecord::VERSION::MAJOR >= 5 ? ActiveRecord::Migration[5.0] : ActiveRecord::Migration
module Rpush
class App < ActiveRecord::Base
self.table_name = 'rpush_apps'
end
class Notification < ActiveRecord::Base
self.table_name = 'rpush_notifications'
end
end
def self.update_type(model, from, to)
model.where(type: from).update_all(type: to)
end
def self.up
rename_table :rapns_notifications, :rpush_notifications
rename_table :rapns_apps, :rpush_apps
rename_table :rapns_feedback, :rpush_feedback
if ActiveRecord.version >= Gem::Version.new('5.1')
if index_name_exists?(:rpush_notifications, :index_rapns_notifications_multi)
rename_index :rpush_notifications, :index_rapns_notifications_multi, :index_rpush_notifications_multi
end
else
if index_name_exists?(:rpush_notifications, :index_rapns_notifications_multi, true)
rename_index :rpush_notifications, :index_rapns_notifications_multi, :index_rpush_notifications_multi
end
end
if ActiveRecord.version >= Gem::Version.new('5.1')
if index_name_exists?(:rpush_feedback, :index_rapns_feedback_on_device_token)
rename_index :rpush_feedback, :index_rapns_feedback_on_device_token, :index_rpush_feedback_on_device_token
end
else
if index_name_exists?(:rpush_feedback, :index_rapns_feedback_on_device_token, true)
rename_index :rpush_feedback, :index_rapns_feedback_on_device_token, :index_rpush_feedback_on_device_token
end
end
update_type(RenameRapnsToRpush::Rpush::Notification, 'Rapns::Apns::Notification', 'Rpush::Apns::Notification')
update_type(RenameRapnsToRpush::Rpush::Notification, 'Rapns::Gcm::Notification', 'Rpush::Gcm::Notification')
update_type(RenameRapnsToRpush::Rpush::Notification, 'Rapns::Adm::Notification', 'Rpush::Adm::Notification')
update_type(RenameRapnsToRpush::Rpush::Notification, 'Rapns::Wpns::Notification', 'Rpush::Wpns::Notification')
update_type(RenameRapnsToRpush::Rpush::App, 'Rapns::Apns::App', 'Rpush::Apns::App')
update_type(RenameRapnsToRpush::Rpush::App, 'Rapns::Gcm::App', 'Rpush::Gcm::App')
update_type(RenameRapnsToRpush::Rpush::App, 'Rapns::Adm::App', 'Rpush::Adm::App')
update_type(RenameRapnsToRpush::Rpush::App, 'Rapns::Wpns::App', 'Rpush::Wpns::App')
end
def self.down
update_type(RenameRapnsToRpush::Rpush::Notification, 'Rpush::Apns::Notification', 'Rapns::Apns::Notification')
update_type(RenameRapnsToRpush::Rpush::Notification, 'Rpush::Gcm::Notification', 'Rapns::Gcm::Notification')
update_type(RenameRapnsToRpush::Rpush::Notification, 'Rpush::Adm::Notification', 'Rapns::Adm::Notification')
update_type(RenameRapnsToRpush::Rpush::Notification, 'Rpush::Wpns::Notification', 'Rapns::Wpns::Notification')
update_type(RenameRapnsToRpush::Rpush::App, 'Rpush::Apns::App', 'Rapns::Apns::App')
update_type(RenameRapnsToRpush::Rpush::App, 'Rpush::Gcm::App', 'Rapns::Gcm::App')
update_type(RenameRapnsToRpush::Rpush::App, 'Rpush::Adm::App', 'Rapns::Adm::App')
update_type(RenameRapnsToRpush::Rpush::App, 'Rpush::Wpns::App', 'Rapns::Wpns::App')
if ActiveRecord.version >= Gem::Version.new('5.1')
if index_name_exists?(:rpush_notifications, :index_rpush_notifications_multi)
rename_index :rpush_notifications, :index_rpush_notifications_multi, :index_rapns_notifications_multi
end
else
if index_name_exists?(:rpush_notifications, :index_rpush_notifications_multi, true)
rename_index :rpush_notifications, :index_rpush_notifications_multi, :index_rapns_notifications_multi
end
end
if ActiveRecord.version >= Gem::Version.new('5.1')
if index_name_exists?(:rpush_feedback, :index_rpush_feedback_on_device_token)
rename_index :rpush_feedback, :index_rpush_feedback_on_device_token, :index_rapns_feedback_on_device_token
end
else
if index_name_exists?(:rpush_feedback, :index_rpush_feedback_on_device_token, true)
rename_index :rpush_feedback, :index_rpush_feedback_on_device_token, :index_rapns_feedback_on_device_token
end
end
rename_table :rpush_notifications, :rapns_notifications
rename_table :rpush_apps, :rapns_apps
rename_table :rpush_feedback, :rapns_feedback
end
end
class AddFailAfterToRpushNotifications < ActiveRecord::VERSION::MAJOR >= 5 ? ActiveRecord::Migration[5.0] : ActiveRecord::Migration
def self.up
add_column :rpush_notifications, :fail_after, :timestamp, null: true
end
def self.down
remove_column :rpush_notifications, :fail_after
end
end
end