Skip to content

Commit

Permalink
Add migration method
Browse files Browse the repository at this point in the history
  • Loading branch information
joshuap committed Sep 26, 2020
1 parent 2662baa commit 2ac945c
Show file tree
Hide file tree
Showing 7 changed files with 113 additions and 4 deletions.
2 changes: 1 addition & 1 deletion CHANGELOG.md
Expand Up @@ -7,7 +7,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased]
### Changed
- Added the `step_gid` column to the `heya_campaign_memberships` table. This
change requires running a migration to upgrade.
change requires running a migration to upgrade. [Instructions](./UPGRADING.md#0-0-4). (#83)

## [0.3.0] - 2020-06-02
### Added
Expand Down
6 changes: 3 additions & 3 deletions Gemfile.lock
@@ -1,7 +1,7 @@
PATH
remote: .
specs:
heya (0.2.1)
heya (0.3.0)
rails (>= 5.2.3, < 6.1.0)

GEM
Expand Down Expand Up @@ -91,7 +91,7 @@ GEM
minitest (5.14.2)
minitest-ci (3.4.0)
minitest (>= 5.0.6)
nio4r (2.5.3)
nio4r (2.5.4)
nokogiri (1.10.10)
mini_portile2 (~> 2.4.0)
parallel (1.19.2)
Expand Down Expand Up @@ -158,7 +158,7 @@ GEM
sprockets (4.0.2)
concurrent-ruby (~> 1.0)
rack (> 1, < 3)
sprockets-rails (3.2.1)
sprockets-rails (3.2.2)
actionpack (>= 4.0)
activesupport (>= 4.0)
sprockets (>= 3.0.0)
Expand Down
7 changes: 7 additions & 0 deletions README.md
Expand Up @@ -543,6 +543,13 @@ Yep. Use the `restart` option to resend a campaign to a user (if they are alread
Yep. By default, Heya sends campaigns ain order of `priority`. Use the `concurrent` option to send campaigns concurrently.
</details>

## Upgrading
Heya adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html), and
should be considered **unstable** until version 1.0.0. Always check
[CHANGELOG.md](./CHANGELOG.md) prior to upgrading (breaking changes will always
be called out there). Upgrade instructions for breaking changes are in
[UPGRADING.md](./UPGRADING.md).

## Roadmap
See [here](https://github.com/honeybadger-io/heya/projects/1) for things we're
considering adding to Heya.
Expand Down
22 changes: 22 additions & 0 deletions UPGRADING.md
@@ -0,0 +1,22 @@
# Upgrading Heya
Heya adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html), and
should be considered unstable until version 1.0.

## 0.0.4
If you're upgrading from Heya `<= 0.0.3`, you will need the following migration:

```
class AddStepGidToHeyaCampaignMemberships < ActiveRecord::Migration[6.0]
def up
add_column :heya_campaign_memberships, :step_gid, :string
Heya::CampaignMembership.migrate_next_step!
change_column :heya_campaign_memberships, :step_gid, :string, null: false
end
def down
remove_column :heya_campaign_memberships, :step_gid, :string
end
end
```

See [CHANGELOG.md](./CHANGELOG.md) for more info.
23 changes: 23 additions & 0 deletions app/models/heya/campaign_membership.rb
Expand Up @@ -5,5 +5,28 @@ class CampaignMembership < ApplicationRecord
before_create do
self.last_sent_at = Time.now
end

def self.migrate_next_step!
find_each do |membership|
campaign = GlobalID::Locator.locate(membership.campaign_gid)
receipt = campaign && CampaignReceipt.where(user: membership.user, step_gid: campaign.steps.map(&:gid)).order('created_at desc').first

next_step = if receipt
last_step = GlobalID::Locator.locate(receipt.step_gid)
current_index = campaign.steps.index(last_step)
campaign.steps[current_index + 1]
else
campaign&.steps&.first
end

if next_step
membership.update(step_gid: next_step.gid)
else
membership.destroy
end
end

CampaignReceipt.where(sent_at: nil).destroy_all
end
end
end
1 change: 1 addition & 0 deletions test/dummy/app/campaigns/first_campaign.rb
@@ -1,4 +1,5 @@
class FirstCampaign < Heya::Campaigns::Base
step :one, subject: "First subject"
step :two, subject: "Second subject"
step :three, subject: "Third subject"
end
56 changes: 56 additions & 0 deletions test/models/heya/campaign_membership_test.rb
Expand Up @@ -13,5 +13,61 @@ class CampaignMembershipTest < ActiveSupport::TestCase

assert membership.last_sent_at.is_a?(Time)
end

test ".migrate_next_step! selects first step" do
membership = CampaignMembership.create(
campaign_gid: FirstCampaign.gid,
step_gid: "gid://heya/null",
user: contacts(:one)
)

CampaignMembership.migrate_next_step!

assert_equal FirstCampaign.steps.first.gid, membership.reload.step_gid
end

test ".migrate_next_step! selects next step" do
membership = CampaignMembership.create(
campaign_gid: FirstCampaign.gid,
step_gid: "gid://heya/null",
user: contacts(:one)
)
CampaignReceipt.create(user: contacts(:one), step_gid: FirstCampaign.steps.first.gid, sent_at: Time.now)
CampaignReceipt.create(user: contacts(:one), step_gid: FirstCampaign.steps.second.gid, sent_at: Time.now)

assert_no_difference "CampaignReceipt.count" do
CampaignMembership.migrate_next_step!
end

assert_equal FirstCampaign.steps.third.gid, membership.reload.step_gid
end

test ".migrate_next_step! removes orphaned memberships" do
CampaignMembership.create(
campaign_gid: 'gid://heya/null',
step_gid: "gid://heya/null",
user: contacts(:one)
)

assert_difference "CampaignMembership.count", -1 do
CampaignMembership.migrate_next_step!
end
end

test ".migrate_next_step! removes unsent receipts" do
membership = CampaignMembership.create(
campaign_gid: FirstCampaign.gid,
step_gid: "gid://heya/null",
user: contacts(:one)
)
CampaignReceipt.create(user: contacts(:one), step_gid: FirstCampaign.steps.first.gid, sent_at: nil)
CampaignReceipt.create(user: contacts(:one), step_gid: FirstCampaign.steps.second.gid, sent_at: Time.now)

assert_difference "CampaignReceipt.count", -1 do
CampaignMembership.migrate_next_step!
end

assert_equal FirstCampaign.steps.third.gid, membership.reload.step_gid
end
end
end

0 comments on commit 2ac945c

Please sign in to comment.