0fc9f9d3e7
DB schema generated by a migration may look different in rails 4 and 5 (because rails 5 may use different default values). For this reason it's important to explicitly set for which rails version a migration was written for. See https://stackoverflow.com/questions/35929869/activerecordmigration-deprecation-warning-asks-for-rails-version-but-im-no/35930912#35930912
73 lines
2.7 KiB
Ruby
73 lines
2.7 KiB
Ruby
class MigrateJiraToGem < ActiveRecord::Migration[4.2]
|
|
DOWNTIME = true
|
|
|
|
DOWNTIME_REASON = <<-HEREDOC
|
|
Refactor all Jira services properties(serialized field) to use new jira-ruby gem.
|
|
There were properties on old Jira service that are not needed anymore after the
|
|
service refactoring: api_url, project_url, new_issue_url, issues_url.
|
|
We extract the new necessary some properties from old keys and delete them:
|
|
taking project_key from project_url and url from api_url
|
|
HEREDOC
|
|
|
|
def up
|
|
active_services_query = "SELECT id, properties FROM services WHERE services.type IN ('JiraService') AND services.active = true"
|
|
|
|
select_all(active_services_query).each do |service|
|
|
id = service['id']
|
|
properties = JSON.parse(service['properties'])
|
|
properties_was = properties.clone
|
|
|
|
# Migrate `project_url` to `project_key`
|
|
# Ignore if `project_url` doesn't have jql project query with project key
|
|
if properties['project_url'].present?
|
|
jql = properties['project_url'].match('project=([A-Za-z]*)')
|
|
properties['project_key'] = jql.captures.first if jql
|
|
end
|
|
|
|
# Migrate `api_url` to `url`
|
|
if properties['api_url'].present?
|
|
url = properties['api_url'].match('(.*)\/rest\/api')
|
|
properties['url'] = url.captures.first if url
|
|
end
|
|
|
|
# Delete now unnecessary properties
|
|
properties.delete('api_url')
|
|
properties.delete('project_url')
|
|
properties.delete('new_issue_url')
|
|
properties.delete('issues_url')
|
|
|
|
# Update changes properties
|
|
if properties != properties_was
|
|
execute("UPDATE services SET properties = '#{quote_string(properties.to_json)}' WHERE id = #{id}")
|
|
end
|
|
end
|
|
end
|
|
|
|
def down
|
|
active_services_query = "SELECT id, properties FROM services WHERE services.type IN ('JiraService') AND services.active = true"
|
|
|
|
select_all(active_services_query).each do |service|
|
|
id = service['id']
|
|
properties = JSON.parse(service['properties'])
|
|
properties_was = properties.clone
|
|
|
|
# Rebuild old properties based on sane defaults
|
|
if properties['url'].present?
|
|
properties['api_url'] = "#{properties['url']}/rest/api/2"
|
|
properties['project_url'] =
|
|
"#{properties['url']}/issues/?jql=project=#{properties['project_key']}"
|
|
properties['issues_url'] = "#{properties['url']}/browse/:id"
|
|
properties['new_issue_url'] = "#{properties['url']}/secure/CreateIssue.jspa"
|
|
end
|
|
|
|
# Delete the new properties
|
|
properties.delete('url')
|
|
properties.delete('project_key')
|
|
|
|
# Update changes properties
|
|
if properties != properties_was
|
|
execute("UPDATE services SET properties = '#{quote_string(properties.to_json)}' WHERE id = #{id}")
|
|
end
|
|
end
|
|
end
|
|
end
|