From 2ac935581571a680a827f879e8dde9c7b8ae0de8 Mon Sep 17 00:00:00 2001 From: Ryan Vasios Date: Thu, 12 Mar 2026 15:46:38 -0400 Subject: [PATCH 1/2] Add rake task and spec --- .../legacy_user_permissions_to_comments.rake | 44 +++++++++++++++ ...egacy_user_permissions_to_comments_spec.rb | 55 +++++++++++++++++++ 2 files changed, 99 insertions(+) create mode 100644 lib/tasks/legacy_user_permissions_to_comments.rake create mode 100644 spec/tasks/legacy_user_permissions_to_comments_spec.rb diff --git a/lib/tasks/legacy_user_permissions_to_comments.rake b/lib/tasks/legacy_user_permissions_to_comments.rake new file mode 100644 index 000000000..b31480158 --- /dev/null +++ b/lib/tasks/legacy_user_permissions_to_comments.rake @@ -0,0 +1,44 @@ +namespace :legacy do + desc "Convert legacy user_permissions rows into User comments" + task user_permissions_to_comments: :environment do + say = ->(msg) { puts "[legacy:user_permissions_to_comments] #{msg}" } + + connection = ActiveRecord::Base.connection + + rows = connection.exec_query(<<~SQL) + SELECT up.user_id, p.security_cat AS permission_name + FROM user_permissions up + INNER JOIN permissions p ON p.id = up.permission_id + SQL + + say.call "Found #{rows.rows.size} legacy user_permissions rows to process" + + processed = 0 + skipped = 0 + + rows.each do |row| + user_id = row["user_id"] + permission_name = row["permission_name"] + + user = User.find_by(id: user_id) + unless user + skipped += 1 + next + end + + body = "Legacy data note: user had permission to #{permission_name}. " \ + "Deleted legacy permission tracking for all users on 2026-03-05." + + # Avoid creating duplicate comments if the task is re-run + unless user.comments.where(body: body).exists? + user.comments.create!(body: body) + processed += 1 + else + skipped += 1 + end + end + + say.call "Created #{processed} comments on users (skipped #{skipped})." + end +end + diff --git a/spec/tasks/legacy_user_permissions_to_comments_spec.rb b/spec/tasks/legacy_user_permissions_to_comments_spec.rb new file mode 100644 index 000000000..e6116ee7e --- /dev/null +++ b/spec/tasks/legacy_user_permissions_to_comments_spec.rb @@ -0,0 +1,55 @@ +require "rails_helper" +require "rake" + +RSpec.describe "legacy:user_permissions_to_comments" do + before(:all) do + Rails.application.load_tasks + end + + before do + Rake::Task["legacy:user_permissions_to_comments"].reenable + + # Define lightweight AR models if they don't exist yet, so the task can run. + unless defined?(Permission) + class Permission < ApplicationRecord + self.table_name = "permissions" + end + end + + unless defined?(UserPermission) + class UserPermission < ApplicationRecord + self.table_name = "user_permissions" + end + end + end + + def run_task + Rake::Task["legacy:user_permissions_to_comments"].invoke + end + + let!(:user) { create(:user) } + let!(:permission) { Permission.create!(security_cat: "Manage Reports") } + + it "creates a legacy comment on the user for each permission" do + UserPermission.create!(user_id: user.id, permission_id: permission.id) + + expect { run_task }.to change { user.comments.count }.by(1) + + comment = user.comments.last + expect(comment.body).to eq( + "Legacy data note: user had permission to Manage Reports. " \ + "Deleted legacy permission tracking for all users on 2026-03-05.", + ) + end + + it "is idempotent when run multiple times" do + UserPermission.create!(user_id: user.id, permission_id: permission.id) + + run_task + first_count = user.comments.count + + expect { run_task }.not_to change { user.comments.count } + expect(user.comments.count).to eq(first_count) + end +end + From bbf32aa321f433f0ff7889dfdaef05b53fbff92f Mon Sep 17 00:00:00 2001 From: Ryan Vasios Date: Sun, 15 Mar 2026 13:07:03 -0400 Subject: [PATCH 2/2] Fix trailing spaces --- lib/tasks/legacy_user_permissions_to_comments.rake | 1 - spec/tasks/legacy_user_permissions_to_comments_spec.rb | 1 - 2 files changed, 2 deletions(-) diff --git a/lib/tasks/legacy_user_permissions_to_comments.rake b/lib/tasks/legacy_user_permissions_to_comments.rake index b31480158..123ec8413 100644 --- a/lib/tasks/legacy_user_permissions_to_comments.rake +++ b/lib/tasks/legacy_user_permissions_to_comments.rake @@ -41,4 +41,3 @@ namespace :legacy do say.call "Created #{processed} comments on users (skipped #{skipped})." end end - diff --git a/spec/tasks/legacy_user_permissions_to_comments_spec.rb b/spec/tasks/legacy_user_permissions_to_comments_spec.rb index e6116ee7e..a4feb6b6c 100644 --- a/spec/tasks/legacy_user_permissions_to_comments_spec.rb +++ b/spec/tasks/legacy_user_permissions_to_comments_spec.rb @@ -52,4 +52,3 @@ def run_task expect(user.comments.count).to eq(first_count) end end -