Skip to content

Commit

Permalink
Add version_id column to Deletions
Browse files Browse the repository at this point in the history
So we can use a straightforward foreign key relationship between the version & deletion
  • Loading branch information
segiddins committed Nov 30, 2023
1 parent 2eaabe4 commit af21ab0
Show file tree
Hide file tree
Showing 7 changed files with 53 additions and 1 deletion.
1 change: 1 addition & 0 deletions app/models/deletion.rb
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ def record_metadata
self.rubygem = rubygem_name
self.number = version.number
self.platform = version.platform
self.version_id = version.id
end

def expire_cache
Expand Down
1 change: 1 addition & 0 deletions app/models/user.rb
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ class User < ApplicationRecord
has_many :subscribed_gems, -> { order("name ASC") }, through: :subscriptions, source: :rubygem

has_many :pushed_versions, -> { by_created_at }, dependent: :nullify, inverse_of: :pusher, class_name: "Version", foreign_key: :pusher_id
has_many :yanked_versions, through: :deletions, source: :version

has_many :deletions, dependent: :nullify
has_many :web_hooks, dependent: :destroy
Expand Down
13 changes: 13 additions & 0 deletions app/tasks/maintenance/backfill_deletion_versions_task.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# frozen_string_literal: true

class Maintenance::BackfillDeletionVersionsTask < MaintenanceTasks::Task
def collection
Deletion.all
end

def process(deletion)
return if deletion.version_id?

deletion.update!(version_id: deletion.version.id)
end
end
7 changes: 7 additions & 0 deletions db/migrate/20231129233528_add_version_id_to_deletions.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
class AddVersionIdToDeletions < ActiveRecord::Migration[7.0]
disable_ddl_transaction!

def change
add_reference :deletions, :version, index: {algorithm: :concurrently}
end
end
4 changes: 3 additions & 1 deletion db/schema.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
#
# It's strongly recommended that you check this file into your version control system.

ActiveRecord::Schema[7.0].define(version: 2023_11_20_033411) do
ActiveRecord::Schema[7.0].define(version: 2023_11_29_233528) do
# These are extensions that must be enabled in order to support this database
enable_extension "hstore"
enable_extension "pgcrypto"
Expand Down Expand Up @@ -83,7 +83,9 @@
t.string "platform"
t.datetime "created_at", precision: nil, null: false
t.datetime "updated_at", precision: nil, null: false
t.bigint "version_id"
t.index ["user_id"], name: "index_deletions_on_user_id"
t.index ["version_id"], name: "index_deletions_on_version_id"
end

create_table "dependencies", id: :serial, force: :cascade do |t|
Expand Down
1 change: 1 addition & 0 deletions test/models/deletion_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,7 @@ class DeletionTest < ActiveSupport::TestCase
deletion.valid?

assert_equal deletion.rubygem, @version.rubygem.name
assert_equal @version.id, deletion.version_id
end

context "with restored gem" do
Expand Down
27 changes: 27 additions & 0 deletions test/tasks/maintenance/backfill_deletion_versions_task_test.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# frozen_string_literal: true

require "test_helper"

class Maintenance::BackfillDeletionVersionsTaskTest < ActiveSupport::TestCase
test "#collection" do
assert_equal Deletion.all, Maintenance::BackfillDeletionVersionsTask.collection
end

test "#process" do
version = create(:version)
deletion = create(:deletion, version:)

deletion.update_column(:version_id, nil)

assert_nil deletion.version_id

Maintenance::BackfillDeletionVersionsTask.process(deletion)

assert_equal version.id, deletion.version_id
assert_equal version, deletion.version

assert_no_changes -> { deletion.reload.as_json } do
Maintenance::BackfillDeletionVersionsTask.process(deletion)
end
end
end

0 comments on commit af21ab0

Please sign in to comment.