From 122a228ed43bc03fd90d4cd17f37a43b293320dd Mon Sep 17 00:00:00 2001 From: "Stanko K.R." Date: Mon, 19 Jan 2026 12:58:30 +0100 Subject: [PATCH] Use convention to create boilerplate record sets --- .../data_transfer/access_record_set.rb | 48 ----------- .../data_transfer/account_record_set.rb | 4 + .../action_text_rich_text_record_set.rb | 4 + .../active_storage_attachment_record_set.rb | 47 ----------- .../active_storage_blob_record_set.rb | 50 ------------ .../data_transfer/assignment_record_set.rb | 47 ----------- .../data_transfer/blob_file_record_set.rb | 4 + .../board_publication_record_set.rb | 46 ----------- .../account/data_transfer/board_record_set.rb | 47 ----------- .../card_activity_spike_record_set.rb | 45 ----------- .../data_transfer/card_goldness_record_set.rb | 45 ----------- .../data_transfer/card_not_now_record_set.rb | 46 ----------- .../account/data_transfer/card_record_set.rb | 52 ------------ .../data_transfer/closure_record_set.rb | 46 ----------- .../data_transfer/column_record_set.rb | 48 ----------- .../data_transfer/comment_record_set.rb | 46 ----------- .../data_transfer/entropy_record_set.rb | 51 ------------ .../account/data_transfer/event_record_set.rb | 50 ------------ .../data_transfer/filter_record_set.rb | 47 ----------- app/models/account/data_transfer/manifest.rb | 79 ++++++++++--------- .../data_transfer/mention_record_set.rb | 54 ------------- .../notification_bundle_record_set.rb | 48 ----------- .../data_transfer/notification_record_set.rb | 49 ------------ .../account/data_transfer/pin_record_set.rb | 46 ----------- .../data_transfer/reaction_record_set.rb | 47 ----------- .../account/data_transfer/record_set.rb | 39 +++++++-- .../account/data_transfer/step_record_set.rb | 47 ----------- .../account/data_transfer/tag_record_set.rb | 45 ----------- .../data_transfer/tagging_record_set.rb | 46 ----------- .../account/data_transfer/user_record_set.rb | 4 + .../account/data_transfer/watch_record_set.rb | 47 ----------- .../webhook_delinquency_tracker_record_set.rb | 47 ----------- .../webhook_delivery_record_set.rb | 49 ------------ .../data_transfer/webhook_record_set.rb | 50 ------------ 34 files changed, 88 insertions(+), 1382 deletions(-) delete mode 100644 app/models/account/data_transfer/access_record_set.rb delete mode 100644 app/models/account/data_transfer/active_storage_attachment_record_set.rb delete mode 100644 app/models/account/data_transfer/active_storage_blob_record_set.rb delete mode 100644 app/models/account/data_transfer/assignment_record_set.rb delete mode 100644 app/models/account/data_transfer/board_publication_record_set.rb delete mode 100644 app/models/account/data_transfer/board_record_set.rb delete mode 100644 app/models/account/data_transfer/card_activity_spike_record_set.rb delete mode 100644 app/models/account/data_transfer/card_goldness_record_set.rb delete mode 100644 app/models/account/data_transfer/card_not_now_record_set.rb delete mode 100644 app/models/account/data_transfer/card_record_set.rb delete mode 100644 app/models/account/data_transfer/closure_record_set.rb delete mode 100644 app/models/account/data_transfer/column_record_set.rb delete mode 100644 app/models/account/data_transfer/comment_record_set.rb delete mode 100644 app/models/account/data_transfer/entropy_record_set.rb delete mode 100644 app/models/account/data_transfer/event_record_set.rb delete mode 100644 app/models/account/data_transfer/filter_record_set.rb delete mode 100644 app/models/account/data_transfer/mention_record_set.rb delete mode 100644 app/models/account/data_transfer/notification_bundle_record_set.rb delete mode 100644 app/models/account/data_transfer/notification_record_set.rb delete mode 100644 app/models/account/data_transfer/pin_record_set.rb delete mode 100644 app/models/account/data_transfer/reaction_record_set.rb delete mode 100644 app/models/account/data_transfer/step_record_set.rb delete mode 100644 app/models/account/data_transfer/tag_record_set.rb delete mode 100644 app/models/account/data_transfer/tagging_record_set.rb delete mode 100644 app/models/account/data_transfer/watch_record_set.rb delete mode 100644 app/models/account/data_transfer/webhook_delinquency_tracker_record_set.rb delete mode 100644 app/models/account/data_transfer/webhook_delivery_record_set.rb delete mode 100644 app/models/account/data_transfer/webhook_record_set.rb diff --git a/app/models/account/data_transfer/access_record_set.rb b/app/models/account/data_transfer/access_record_set.rb deleted file mode 100644 index 0f78e3c7a..000000000 --- a/app/models/account/data_transfer/access_record_set.rb +++ /dev/null @@ -1,48 +0,0 @@ -class Account::DataTransfer::AccessRecordSet < Account::DataTransfer::RecordSet - ATTRIBUTES = %w[ - accessed_at - account_id - board_id - created_at - id - involvement - updated_at - user_id - ].freeze - - private - def records - Access.where(account: account) - end - - def export_record(access) - zip.add_file "data/accesses/#{access.id}.json", access.as_json.to_json - end - - def files - zip.glob("data/accesses/*.json") - end - - def import_batch(files) - batch_data = files.map do |file| - data = load(file) - data.slice(*ATTRIBUTES).merge("account_id" => account.id) - end - - Access.insert_all!(batch_data) - end - - def validate_record(file_path) - data = load(file_path) - expected_id = File.basename(file_path, ".json") - - unless data["id"].to_s == expected_id - raise IntegrityError, "Access record ID mismatch: expected #{expected_id}, got #{data['id']}" - end - - missing = ATTRIBUTES - data.keys - if missing.any? - raise IntegrityError, "#{file_path} is missing required fields: #{missing.join(', ')}" - end - end -end diff --git a/app/models/account/data_transfer/account_record_set.rb b/app/models/account/data_transfer/account_record_set.rb index c27e03101..86bc79067 100644 --- a/app/models/account/data_transfer/account_record_set.rb +++ b/app/models/account/data_transfer/account_record_set.rb @@ -10,6 +10,10 @@ class Account::DataTransfer::AccountRecordSet < Account::DataTransfer::RecordSet usage_limit ] + def initialize(account) + super(account: account, model: Account) + end + private def records [ account ] diff --git a/app/models/account/data_transfer/action_text_rich_text_record_set.rb b/app/models/account/data_transfer/action_text_rich_text_record_set.rb index 355c5d71b..0ba663e1e 100644 --- a/app/models/account/data_transfer/action_text_rich_text_record_set.rb +++ b/app/models/account/data_transfer/action_text_rich_text_record_set.rb @@ -10,6 +10,10 @@ class Account::DataTransfer::ActionTextRichTextRecordSet < Account::DataTransfer updated_at ].freeze + def initialize(account) + super(account: account, model: ActionText::RichText) + end + private def records ActionText::RichText.where(account: account) diff --git a/app/models/account/data_transfer/active_storage_attachment_record_set.rb b/app/models/account/data_transfer/active_storage_attachment_record_set.rb deleted file mode 100644 index f33fe5bb4..000000000 --- a/app/models/account/data_transfer/active_storage_attachment_record_set.rb +++ /dev/null @@ -1,47 +0,0 @@ -class Account::DataTransfer::ActiveStorageAttachmentRecordSet < Account::DataTransfer::RecordSet - ATTRIBUTES = %w[ - account_id - blob_id - created_at - id - name - record_id - record_type - ].freeze - - private - def records - ActiveStorage::Attachment.where(account: account) - end - - def export_record(attachment) - zip.add_file "data/active_storage_attachments/#{attachment.id}.json", attachment.as_json.to_json - end - - def files - zip.glob("data/active_storage_attachments/*.json") - end - - def import_batch(files) - batch_data = files.map do |file| - data = load(file) - data.slice(*ATTRIBUTES).merge("account_id" => account.id) - end - - ActiveStorage::Attachment.insert_all!(batch_data) - end - - def validate_record(file_path) - data = load(file_path) - expected_id = File.basename(file_path, ".json") - - unless data["id"].to_s == expected_id - raise IntegrityError, "ActiveStorageAttachment record ID mismatch: expected #{expected_id}, got #{data['id']}" - end - - missing = ATTRIBUTES - data.keys - if missing.any? - raise IntegrityError, "#{file_path} is missing required fields: #{missing.join(', ')}" - end - end -end diff --git a/app/models/account/data_transfer/active_storage_blob_record_set.rb b/app/models/account/data_transfer/active_storage_blob_record_set.rb deleted file mode 100644 index 43aa55b1e..000000000 --- a/app/models/account/data_transfer/active_storage_blob_record_set.rb +++ /dev/null @@ -1,50 +0,0 @@ -class Account::DataTransfer::ActiveStorageBlobRecordSet < Account::DataTransfer::RecordSet - ATTRIBUTES = %w[ - account_id - byte_size - checksum - content_type - created_at - filename - id - key - metadata - service_name - ].freeze - - private - def records - ActiveStorage::Blob.where(account: account) - end - - def export_record(blob) - zip.add_file "data/active_storage_blobs/#{blob.id}.json", blob.as_json.to_json - end - - def files - zip.glob("data/active_storage_blobs/*.json") - end - - def import_batch(files) - batch_data = files.map do |file| - data = load(file) - data.slice(*ATTRIBUTES).merge("account_id" => account.id) - end - - ActiveStorage::Blob.insert_all!(batch_data) - end - - def validate_record(file_path) - data = load(file_path) - expected_id = File.basename(file_path, ".json") - - unless data["id"].to_s == expected_id - raise IntegrityError, "ActiveStorageBlob record ID mismatch: expected #{expected_id}, got #{data['id']}" - end - - missing = ATTRIBUTES - data.keys - if missing.any? - raise IntegrityError, "#{file_path} is missing required fields: #{missing.join(', ')}" - end - end -end diff --git a/app/models/account/data_transfer/assignment_record_set.rb b/app/models/account/data_transfer/assignment_record_set.rb deleted file mode 100644 index 955946c2d..000000000 --- a/app/models/account/data_transfer/assignment_record_set.rb +++ /dev/null @@ -1,47 +0,0 @@ -class Account::DataTransfer::AssignmentRecordSet < Account::DataTransfer::RecordSet - ATTRIBUTES = %w[ - account_id - assignee_id - assigner_id - card_id - created_at - id - updated_at - ].freeze - - private - def records - Assignment.where(account: account) - end - - def export_record(assignment) - zip.add_file "data/assignments/#{assignment.id}.json", assignment.as_json.to_json - end - - def files - zip.glob("data/assignments/*.json") - end - - def import_batch(files) - batch_data = files.map do |file| - data = load(file) - data.slice(*ATTRIBUTES).merge("account_id" => account.id) - end - - Assignment.insert_all!(batch_data) - end - - def validate_record(file_path) - data = load(file_path) - expected_id = File.basename(file_path, ".json") - - unless data["id"].to_s == expected_id - raise IntegrityError, "Assignment record ID mismatch: expected #{expected_id}, got #{data['id']}" - end - - missing = ATTRIBUTES - data.keys - if missing.any? - raise IntegrityError, "#{file_path} is missing required fields: #{missing.join(', ')}" - end - end -end diff --git a/app/models/account/data_transfer/blob_file_record_set.rb b/app/models/account/data_transfer/blob_file_record_set.rb index 233985a0b..c17070ed2 100644 --- a/app/models/account/data_transfer/blob_file_record_set.rb +++ b/app/models/account/data_transfer/blob_file_record_set.rb @@ -1,4 +1,8 @@ class Account::DataTransfer::BlobFileRecordSet < Account::DataTransfer::RecordSet + def initialize(account) + super(account: account, model: ActiveStorage::Blob) + end + private def records ActiveStorage::Blob.where(account: account) diff --git a/app/models/account/data_transfer/board_publication_record_set.rb b/app/models/account/data_transfer/board_publication_record_set.rb deleted file mode 100644 index 922257be5..000000000 --- a/app/models/account/data_transfer/board_publication_record_set.rb +++ /dev/null @@ -1,46 +0,0 @@ -class Account::DataTransfer::BoardPublicationRecordSet < Account::DataTransfer::RecordSet - ATTRIBUTES = %w[ - account_id - board_id - created_at - id - key - updated_at - ].freeze - - private - def records - Board::Publication.where(account: account) - end - - def export_record(publication) - zip.add_file "data/board_publications/#{publication.id}.json", publication.as_json.to_json - end - - def files - zip.glob("data/board_publications/*.json") - end - - def import_batch(files) - batch_data = files.map do |file| - data = load(file) - data.slice(*ATTRIBUTES).merge("account_id" => account.id) - end - - Board::Publication.insert_all!(batch_data) - end - - def validate_record(file_path) - data = load(file_path) - expected_id = File.basename(file_path, ".json") - - unless data["id"].to_s == expected_id - raise IntegrityError, "BoardPublication record ID mismatch: expected #{expected_id}, got #{data['id']}" - end - - missing = ATTRIBUTES - data.keys - if missing.any? - raise IntegrityError, "#{file_path} is missing required fields: #{missing.join(', ')}" - end - end -end diff --git a/app/models/account/data_transfer/board_record_set.rb b/app/models/account/data_transfer/board_record_set.rb deleted file mode 100644 index 752e1100b..000000000 --- a/app/models/account/data_transfer/board_record_set.rb +++ /dev/null @@ -1,47 +0,0 @@ -class Account::DataTransfer::BoardRecordSet < Account::DataTransfer::RecordSet - ATTRIBUTES = %w[ - account_id - all_access - created_at - creator_id - id - name - updated_at - ].freeze - - private - def records - Board.where(account: account) - end - - def export_record(board) - zip.add_file "data/boards/#{board.id}.json", board.as_json.to_json - end - - def files - zip.glob("data/boards/*.json") - end - - def import_batch(files) - batch_data = files.map do |file| - data = load(file) - data.slice(*ATTRIBUTES).merge("account_id" => account.id) - end - - Board.insert_all!(batch_data) - end - - def validate_record(file_path) - data = load(file_path) - expected_id = File.basename(file_path, ".json") - - unless data["id"].to_s == expected_id - raise IntegrityError, "Board record ID mismatch: expected #{expected_id}, got #{data['id']}" - end - - missing = ATTRIBUTES - data.keys - if missing.any? - raise IntegrityError, "#{file_path} is missing required fields: #{missing.join(', ')}" - end - end -end diff --git a/app/models/account/data_transfer/card_activity_spike_record_set.rb b/app/models/account/data_transfer/card_activity_spike_record_set.rb deleted file mode 100644 index 61c73eb19..000000000 --- a/app/models/account/data_transfer/card_activity_spike_record_set.rb +++ /dev/null @@ -1,45 +0,0 @@ -class Account::DataTransfer::CardActivitySpikeRecordSet < Account::DataTransfer::RecordSet - ATTRIBUTES = %w[ - account_id - card_id - created_at - id - updated_at - ].freeze - - private - def records - Card::ActivitySpike.where(account: account) - end - - def export_record(activity_spike) - zip.add_file "data/card_activity_spikes/#{activity_spike.id}.json", activity_spike.as_json.to_json - end - - def files - zip.glob("data/card_activity_spikes/*.json") - end - - def import_batch(files) - batch_data = files.map do |file| - data = load(file) - data.slice(*ATTRIBUTES).merge("account_id" => account.id) - end - - Card::ActivitySpike.insert_all!(batch_data) - end - - def validate_record(file_path) - data = load(file_path) - expected_id = File.basename(file_path, ".json") - - unless data["id"].to_s == expected_id - raise IntegrityError, "CardActivitySpike record ID mismatch: expected #{expected_id}, got #{data['id']}" - end - - missing = ATTRIBUTES - data.keys - if missing.any? - raise IntegrityError, "#{file_path} is missing required fields: #{missing.join(', ')}" - end - end -end diff --git a/app/models/account/data_transfer/card_goldness_record_set.rb b/app/models/account/data_transfer/card_goldness_record_set.rb deleted file mode 100644 index fe488cbec..000000000 --- a/app/models/account/data_transfer/card_goldness_record_set.rb +++ /dev/null @@ -1,45 +0,0 @@ -class Account::DataTransfer::CardGoldnessRecordSet < Account::DataTransfer::RecordSet - ATTRIBUTES = %w[ - account_id - card_id - created_at - id - updated_at - ].freeze - - private - def records - Card::Goldness.where(account: account) - end - - def export_record(goldness) - zip.add_file "data/card_goldnesses/#{goldness.id}.json", goldness.as_json.to_json - end - - def files - zip.glob("data/card_goldnesses/*.json") - end - - def import_batch(files) - batch_data = files.map do |file| - data = load(file) - data.slice(*ATTRIBUTES).merge("account_id" => account.id) - end - - Card::Goldness.insert_all!(batch_data) - end - - def validate_record(file_path) - data = load(file_path) - expected_id = File.basename(file_path, ".json") - - unless data["id"].to_s == expected_id - raise IntegrityError, "CardGoldness record ID mismatch: expected #{expected_id}, got #{data['id']}" - end - - missing = ATTRIBUTES - data.keys - if missing.any? - raise IntegrityError, "#{file_path} is missing required fields: #{missing.join(', ')}" - end - end -end diff --git a/app/models/account/data_transfer/card_not_now_record_set.rb b/app/models/account/data_transfer/card_not_now_record_set.rb deleted file mode 100644 index 4ee68977a..000000000 --- a/app/models/account/data_transfer/card_not_now_record_set.rb +++ /dev/null @@ -1,46 +0,0 @@ -class Account::DataTransfer::CardNotNowRecordSet < Account::DataTransfer::RecordSet - ATTRIBUTES = %w[ - account_id - card_id - created_at - id - updated_at - user_id - ].freeze - - private - def records - Card::NotNow.where(account: account) - end - - def export_record(not_now) - zip.add_file "data/card_not_nows/#{not_now.id}.json", not_now.as_json.to_json - end - - def files - zip.glob("data/card_not_nows/*.json") - end - - def import_batch(files) - batch_data = files.map do |file| - data = load(file) - data.slice(*ATTRIBUTES).merge("account_id" => account.id) - end - - Card::NotNow.insert_all!(batch_data) - end - - def validate_record(file_path) - data = load(file_path) - expected_id = File.basename(file_path, ".json") - - unless data["id"].to_s == expected_id - raise IntegrityError, "CardNotNow record ID mismatch: expected #{expected_id}, got #{data['id']}" - end - - missing = ATTRIBUTES - data.keys - if missing.any? - raise IntegrityError, "#{file_path} is missing required fields: #{missing.join(', ')}" - end - end -end diff --git a/app/models/account/data_transfer/card_record_set.rb b/app/models/account/data_transfer/card_record_set.rb deleted file mode 100644 index 8542b7396..000000000 --- a/app/models/account/data_transfer/card_record_set.rb +++ /dev/null @@ -1,52 +0,0 @@ -class Account::DataTransfer::CardRecordSet < Account::DataTransfer::RecordSet - ATTRIBUTES = %w[ - account_id - board_id - column_id - created_at - creator_id - due_on - id - last_active_at - number - status - title - updated_at - ].freeze - - private - def records - Card.where(account: account) - end - - def export_record(card) - zip.add_file "data/cards/#{card.id}.json", card.as_json.to_json - end - - def files - zip.glob("data/cards/*.json") - end - - def import_batch(files) - batch_data = files.map do |file| - data = load(file) - data.slice(*ATTRIBUTES).merge("account_id" => account.id) - end - - Card.insert_all!(batch_data) - end - - def validate_record(file_path) - data = load(file_path) - expected_id = File.basename(file_path, ".json") - - unless data["id"].to_s == expected_id - raise IntegrityError, "Card record ID mismatch: expected #{expected_id}, got #{data['id']}" - end - - missing = ATTRIBUTES - data.keys - if missing.any? - raise IntegrityError, "#{file_path} is missing required fields: #{missing.join(', ')}" - end - end -end diff --git a/app/models/account/data_transfer/closure_record_set.rb b/app/models/account/data_transfer/closure_record_set.rb deleted file mode 100644 index b1b321438..000000000 --- a/app/models/account/data_transfer/closure_record_set.rb +++ /dev/null @@ -1,46 +0,0 @@ -class Account::DataTransfer::ClosureRecordSet < Account::DataTransfer::RecordSet - ATTRIBUTES = %w[ - account_id - card_id - created_at - id - updated_at - user_id - ].freeze - - private - def records - Closure.where(account: account) - end - - def export_record(closure) - zip.add_file "data/closures/#{closure.id}.json", closure.as_json.to_json - end - - def files - zip.glob("data/closures/*.json") - end - - def import_batch(files) - batch_data = files.map do |file| - data = load(file) - data.slice(*ATTRIBUTES).merge("account_id" => account.id) - end - - Closure.insert_all!(batch_data) - end - - def validate_record(file_path) - data = load(file_path) - expected_id = File.basename(file_path, ".json") - - unless data["id"].to_s == expected_id - raise IntegrityError, "Closure record ID mismatch: expected #{expected_id}, got #{data['id']}" - end - - missing = ATTRIBUTES - data.keys - if missing.any? - raise IntegrityError, "#{file_path} is missing required fields: #{missing.join(', ')}" - end - end -end diff --git a/app/models/account/data_transfer/column_record_set.rb b/app/models/account/data_transfer/column_record_set.rb deleted file mode 100644 index 4706d5adc..000000000 --- a/app/models/account/data_transfer/column_record_set.rb +++ /dev/null @@ -1,48 +0,0 @@ -class Account::DataTransfer::ColumnRecordSet < Account::DataTransfer::RecordSet - ATTRIBUTES = %w[ - account_id - board_id - color - created_at - id - name - position - updated_at - ].freeze - - private - def records - Column.where(account: account) - end - - def export_record(column) - zip.add_file "data/columns/#{column.id}.json", column.as_json.to_json - end - - def files - zip.glob("data/columns/*.json") - end - - def import_batch(files) - batch_data = files.map do |file| - data = load(file) - data.slice(*ATTRIBUTES).merge("account_id" => account.id) - end - - Column.insert_all!(batch_data) - end - - def validate_record(file_path) - data = load(file_path) - expected_id = File.basename(file_path, ".json") - - unless data["id"].to_s == expected_id - raise IntegrityError, "Column record ID mismatch: expected #{expected_id}, got #{data['id']}" - end - - missing = ATTRIBUTES - data.keys - if missing.any? - raise IntegrityError, "#{file_path} is missing required fields: #{missing.join(', ')}" - end - end -end diff --git a/app/models/account/data_transfer/comment_record_set.rb b/app/models/account/data_transfer/comment_record_set.rb deleted file mode 100644 index 70dc2bab5..000000000 --- a/app/models/account/data_transfer/comment_record_set.rb +++ /dev/null @@ -1,46 +0,0 @@ -class Account::DataTransfer::CommentRecordSet < Account::DataTransfer::RecordSet - ATTRIBUTES = %w[ - account_id - card_id - created_at - creator_id - id - updated_at - ].freeze - - private - def records - Comment.where(account: account) - end - - def export_record(comment) - zip.add_file "data/comments/#{comment.id}.json", comment.as_json.to_json - end - - def files - zip.glob("data/comments/*.json") - end - - def import_batch(files) - batch_data = files.map do |file| - data = load(file) - data.slice(*ATTRIBUTES).merge("account_id" => account.id) - end - - Comment.insert_all!(batch_data) - end - - def validate_record(file_path) - data = load(file_path) - expected_id = File.basename(file_path, ".json") - - unless data["id"].to_s == expected_id - raise IntegrityError, "Comment record ID mismatch: expected #{expected_id}, got #{data['id']}" - end - - missing = ATTRIBUTES - data.keys - if missing.any? - raise IntegrityError, "#{file_path} is missing required fields: #{missing.join(', ')}" - end - end -end diff --git a/app/models/account/data_transfer/entropy_record_set.rb b/app/models/account/data_transfer/entropy_record_set.rb deleted file mode 100644 index 193a62737..000000000 --- a/app/models/account/data_transfer/entropy_record_set.rb +++ /dev/null @@ -1,51 +0,0 @@ -class Account::DataTransfer::EntropyRecordSet < Account::DataTransfer::RecordSet - ATTRIBUTES = %w[ - account_id - auto_postpone_period - container_id - container_type - created_at - id - updated_at - ].freeze - - private - def records - Entropy.where(account: account) - end - - def export_record(entropy) - zip.add_file "data/entropies/#{entropy.id}.json", entropy.as_json.to_json - end - - def files - zip.glob("data/entropies/*.json") - end - - def import_batch(files) - batch_data = files.map do |file| - data = load(file) - data.slice(*ATTRIBUTES).merge("account_id" => account.id) - end - - Entropy.insert_all!(batch_data) - end - - def validate_record(file_path) - data = load(file_path) - expected_id = File.basename(file_path, ".json") - - unless data["id"].to_s == expected_id - raise IntegrityError, "Entropy record ID mismatch: expected #{expected_id}, got #{data['id']}" - end - - missing = ATTRIBUTES - data.keys - if missing.any? - raise IntegrityError, "#{file_path} is missing required fields: #{missing.join(', ')}" - end - - unless %w[Account Board].include?(data["container_type"]) - raise IntegrityError, "#{file_path} has invalid container_type: #{data['container_type']}" - end - end -end diff --git a/app/models/account/data_transfer/event_record_set.rb b/app/models/account/data_transfer/event_record_set.rb deleted file mode 100644 index 42ccb80fe..000000000 --- a/app/models/account/data_transfer/event_record_set.rb +++ /dev/null @@ -1,50 +0,0 @@ -class Account::DataTransfer::EventRecordSet < Account::DataTransfer::RecordSet - ATTRIBUTES = %w[ - account_id - action - board_id - created_at - creator_id - eventable_id - eventable_type - id - particulars - updated_at - ].freeze - - private - def records - Event.where(account: account) - end - - def export_record(event) - zip.add_file "data/events/#{event.id}.json", event.as_json.to_json - end - - def files - zip.glob("data/events/*.json") - end - - def import_batch(files) - batch_data = files.map do |file| - data = load(file) - data.slice(*ATTRIBUTES).merge("account_id" => account.id) - end - - Event.insert_all!(batch_data) - end - - def validate_record(file_path) - data = load(file_path) - expected_id = File.basename(file_path, ".json") - - unless data["id"].to_s == expected_id - raise IntegrityError, "Event record ID mismatch: expected #{expected_id}, got #{data['id']}" - end - - missing = ATTRIBUTES - data.keys - if missing.any? - raise IntegrityError, "#{file_path} is missing required fields: #{missing.join(', ')}" - end - end -end diff --git a/app/models/account/data_transfer/filter_record_set.rb b/app/models/account/data_transfer/filter_record_set.rb deleted file mode 100644 index 01f8e8ba3..000000000 --- a/app/models/account/data_transfer/filter_record_set.rb +++ /dev/null @@ -1,47 +0,0 @@ -class Account::DataTransfer::FilterRecordSet < Account::DataTransfer::RecordSet - ATTRIBUTES = %w[ - account_id - created_at - creator_id - fields - id - params_digest - updated_at - ].freeze - - private - def records - Filter.where(account: account) - end - - def export_record(filter) - zip.add_file "data/filters/#{filter.id}.json", filter.as_json.to_json - end - - def files - zip.glob("data/filters/*.json") - end - - def import_batch(files) - batch_data = files.map do |file| - data = load(file) - data.slice(*ATTRIBUTES).merge("account_id" => account.id) - end - - Filter.insert_all!(batch_data) - end - - def validate_record(file_path) - data = load(file_path) - expected_id = File.basename(file_path, ".json") - - unless data["id"].to_s == expected_id - raise IntegrityError, "Filter record ID mismatch: expected #{expected_id}, got #{data['id']}" - end - - missing = ATTRIBUTES - data.keys - if missing.any? - raise IntegrityError, "#{file_path} is missing required fields: #{missing.join(', ')}" - end - end -end diff --git a/app/models/account/data_transfer/manifest.rb b/app/models/account/data_transfer/manifest.rb index 91ce8028e..ffa65ad2f 100644 --- a/app/models/account/data_transfer/manifest.rb +++ b/app/models/account/data_transfer/manifest.rb @@ -1,43 +1,6 @@ class Account::DataTransfer::Manifest Cursor = Struct.new(:record_class, :last_id) - include Enumerable - - RECORD_SETS = [ - Account::DataTransfer::AccountRecordSet, - Account::DataTransfer::UserRecordSet, - Account::DataTransfer::TagRecordSet, - Account::DataTransfer::BoardRecordSet, - Account::DataTransfer::ColumnRecordSet, - Account::DataTransfer::EntropyRecordSet, - Account::DataTransfer::BoardPublicationRecordSet, - Account::DataTransfer::WebhookRecordSet, - Account::DataTransfer::AccessRecordSet, - Account::DataTransfer::CardRecordSet, - Account::DataTransfer::CommentRecordSet, - Account::DataTransfer::StepRecordSet, - Account::DataTransfer::AssignmentRecordSet, - Account::DataTransfer::TaggingRecordSet, - Account::DataTransfer::ClosureRecordSet, - Account::DataTransfer::CardGoldnessRecordSet, - Account::DataTransfer::CardNotNowRecordSet, - Account::DataTransfer::CardActivitySpikeRecordSet, - Account::DataTransfer::WatchRecordSet, - Account::DataTransfer::PinRecordSet, - Account::DataTransfer::ReactionRecordSet, - Account::DataTransfer::MentionRecordSet, - Account::DataTransfer::FilterRecordSet, - Account::DataTransfer::WebhookDelinquencyTrackerRecordSet, - Account::DataTransfer::EventRecordSet, - Account::DataTransfer::NotificationRecordSet, - Account::DataTransfer::NotificationBundleRecordSet, - Account::DataTransfer::WebhookDeliveryRecordSet, - Account::DataTransfer::ActiveStorageBlobRecordSet, - Account::DataTransfer::ActiveStorageAttachmentRecordSet, - Account::DataTransfer::ActionTextRichTextRecordSet, - Account::DataTransfer::BlobFileRecordSet - ] - attr_reader :account def initialize(account) @@ -47,8 +10,46 @@ class Account::DataTransfer::Manifest def each_record_set(start: nil) raise ArgumentError, "No block given" unless block_given? - RECORD_SETS.each do |record_set_class| - yield record_set_class.new(account) + record_sets.each do |record_set| + yield record_set end end + + private + def record_sets + [ + Account::DataTransfer::AccountRecordSet.new(account), + Account::DataTransfer::UserRecordSet.new(account), + Account::DataTransfer::RecordSet.new(account: account, model: ::Tag), + Account::DataTransfer::RecordSet.new(account: account, model: ::Board), + Account::DataTransfer::RecordSet.new(account: account, model: ::Column), + Account::DataTransfer::RecordSet.new(account: account, model: ::Entropy), + Account::DataTransfer::RecordSet.new(account: account, model: ::Board::Publication), + Account::DataTransfer::RecordSet.new(account: account, model: ::Webhook), + Account::DataTransfer::RecordSet.new(account: account, model: ::Access), + Account::DataTransfer::RecordSet.new(account: account, model: ::Card), + Account::DataTransfer::RecordSet.new(account: account, model: ::Comment), + Account::DataTransfer::RecordSet.new(account: account, model: ::Step), + Account::DataTransfer::RecordSet.new(account: account, model: ::Assignment), + Account::DataTransfer::RecordSet.new(account: account, model: ::Tagging), + Account::DataTransfer::RecordSet.new(account: account, model: ::Closure), + Account::DataTransfer::RecordSet.new(account: account, model: ::Card::Goldness), + Account::DataTransfer::RecordSet.new(account: account, model: ::Card::NotNow), + Account::DataTransfer::RecordSet.new(account: account, model: ::Card::ActivitySpike), + Account::DataTransfer::RecordSet.new(account: account, model: ::Watch), + Account::DataTransfer::RecordSet.new(account: account, model: ::Pin), + Account::DataTransfer::RecordSet.new(account: account, model: ::Reaction), + Account::DataTransfer::RecordSet.new(account: account, model: ::Mention), + Account::DataTransfer::RecordSet.new(account: account, model: ::Filter), + Account::DataTransfer::RecordSet.new(account: account, model: ::Webhook::DelinquencyTracker), + Account::DataTransfer::RecordSet.new(account: account, model: ::Event), + Account::DataTransfer::RecordSet.new(account: account, model: ::Notification), + Account::DataTransfer::RecordSet.new(account: account, model: ::Notification::Bundle), + Account::DataTransfer::RecordSet.new(account: account, model: ::Webhook::Delivery), + Account::DataTransfer::RecordSet.new(account: account, model: ::ActiveStorage::Blob), + Account::DataTransfer::RecordSet.new(account: account, model: ::ActiveStorage::Attachment), + Account::DataTransfer::ActionTextRichTextRecordSet.new(account), + Account::DataTransfer::BlobFileRecordSet.new(account) + ] + end end diff --git a/app/models/account/data_transfer/mention_record_set.rb b/app/models/account/data_transfer/mention_record_set.rb deleted file mode 100644 index 253fb8ee4..000000000 --- a/app/models/account/data_transfer/mention_record_set.rb +++ /dev/null @@ -1,54 +0,0 @@ -class Account::DataTransfer::MentionRecordSet < Account::DataTransfer::RecordSet - ATTRIBUTES = %w[ - account_id - created_at - id - mentionee_id - mentioner_id - source_id - source_type - updated_at - ].freeze - - VALID_SOURCE_TYPES = %w[Card Comment].freeze - - private - def records - Mention.where(account: account) - end - - def export_record(mention) - zip.add_file "data/mentions/#{mention.id}.json", mention.as_json.to_json - end - - def files - zip.glob("data/mentions/*.json") - end - - def import_batch(files) - batch_data = files.map do |file| - data = load(file) - data.slice(*ATTRIBUTES).merge("account_id" => account.id) - end - - Mention.insert_all!(batch_data) - end - - def validate_record(file_path) - data = load(file_path) - expected_id = File.basename(file_path, ".json") - - unless data["id"].to_s == expected_id - raise IntegrityError, "Mention record ID mismatch: expected #{expected_id}, got #{data['id']}" - end - - missing = ATTRIBUTES - data.keys - if missing.any? - raise IntegrityError, "#{file_path} is missing required fields: #{missing.join(', ')}" - end - - unless VALID_SOURCE_TYPES.include?(data["source_type"]) - raise IntegrityError, "#{file_path} has invalid source_type: #{data['source_type']}" - end - end -end diff --git a/app/models/account/data_transfer/notification_bundle_record_set.rb b/app/models/account/data_transfer/notification_bundle_record_set.rb deleted file mode 100644 index fd468ef89..000000000 --- a/app/models/account/data_transfer/notification_bundle_record_set.rb +++ /dev/null @@ -1,48 +0,0 @@ -class Account::DataTransfer::NotificationBundleRecordSet < Account::DataTransfer::RecordSet - ATTRIBUTES = %w[ - account_id - created_at - ends_at - id - starts_at - status - updated_at - user_id - ].freeze - - private - def records - Notification::Bundle.where(account: account) - end - - def export_record(bundle) - zip.add_file "data/notification_bundles/#{bundle.id}.json", bundle.as_json.to_json - end - - def files - zip.glob("data/notification_bundles/*.json") - end - - def import_batch(files) - batch_data = files.map do |file| - data = load(file) - data.slice(*ATTRIBUTES).merge("account_id" => account.id) - end - - Notification::Bundle.insert_all!(batch_data) - end - - def validate_record(file_path) - data = load(file_path) - expected_id = File.basename(file_path, ".json") - - unless data["id"].to_s == expected_id - raise IntegrityError, "NotificationBundle record ID mismatch: expected #{expected_id}, got #{data['id']}" - end - - missing = ATTRIBUTES - data.keys - if missing.any? - raise IntegrityError, "#{file_path} is missing required fields: #{missing.join(', ')}" - end - end -end diff --git a/app/models/account/data_transfer/notification_record_set.rb b/app/models/account/data_transfer/notification_record_set.rb deleted file mode 100644 index 260e388ab..000000000 --- a/app/models/account/data_transfer/notification_record_set.rb +++ /dev/null @@ -1,49 +0,0 @@ -class Account::DataTransfer::NotificationRecordSet < Account::DataTransfer::RecordSet - ATTRIBUTES = %w[ - account_id - created_at - creator_id - id - read_at - source_id - source_type - updated_at - user_id - ].freeze - - private - def records - Notification.where(account: account) - end - - def export_record(notification) - zip.add_file "data/notifications/#{notification.id}.json", notification.as_json.to_json - end - - def files - zip.glob("data/notifications/*.json") - end - - def import_batch(files) - batch_data = files.map do |file| - data = load(file) - data.slice(*ATTRIBUTES).merge("account_id" => account.id) - end - - Notification.insert_all!(batch_data) - end - - def validate_record(file_path) - data = load(file_path) - expected_id = File.basename(file_path, ".json") - - unless data["id"].to_s == expected_id - raise IntegrityError, "Notification record ID mismatch: expected #{expected_id}, got #{data['id']}" - end - - missing = ATTRIBUTES - data.keys - if missing.any? - raise IntegrityError, "#{file_path} is missing required fields: #{missing.join(', ')}" - end - end -end diff --git a/app/models/account/data_transfer/pin_record_set.rb b/app/models/account/data_transfer/pin_record_set.rb deleted file mode 100644 index fd4c33e7d..000000000 --- a/app/models/account/data_transfer/pin_record_set.rb +++ /dev/null @@ -1,46 +0,0 @@ -class Account::DataTransfer::PinRecordSet < Account::DataTransfer::RecordSet - ATTRIBUTES = %w[ - account_id - card_id - created_at - id - updated_at - user_id - ].freeze - - private - def records - Pin.where(account: account) - end - - def export_record(pin) - zip.add_file "data/pins/#{pin.id}.json", pin.as_json.to_json - end - - def files - zip.glob("data/pins/*.json") - end - - def import_batch(files) - batch_data = files.map do |file| - data = load(file) - data.slice(*ATTRIBUTES).merge("account_id" => account.id) - end - - Pin.insert_all!(batch_data) - end - - def validate_record(file_path) - data = load(file_path) - expected_id = File.basename(file_path, ".json") - - unless data["id"].to_s == expected_id - raise IntegrityError, "Pin record ID mismatch: expected #{expected_id}, got #{data['id']}" - end - - missing = ATTRIBUTES - data.keys - if missing.any? - raise IntegrityError, "#{file_path} is missing required fields: #{missing.join(', ')}" - end - end -end diff --git a/app/models/account/data_transfer/reaction_record_set.rb b/app/models/account/data_transfer/reaction_record_set.rb deleted file mode 100644 index 6b145a2e6..000000000 --- a/app/models/account/data_transfer/reaction_record_set.rb +++ /dev/null @@ -1,47 +0,0 @@ -class Account::DataTransfer::ReactionRecordSet < Account::DataTransfer::RecordSet - ATTRIBUTES = %w[ - account_id - comment_id - content - created_at - id - reacter_id - updated_at - ].freeze - - private - def records - Reaction.where(account: account) - end - - def export_record(reaction) - zip.add_file "data/reactions/#{reaction.id}.json", reaction.as_json.to_json - end - - def files - zip.glob("data/reactions/*.json") - end - - def import_batch(files) - batch_data = files.map do |file| - data = load(file) - data.slice(*ATTRIBUTES).merge("account_id" => account.id) - end - - Reaction.insert_all!(batch_data) - end - - def validate_record(file_path) - data = load(file_path) - expected_id = File.basename(file_path, ".json") - - unless data["id"].to_s == expected_id - raise IntegrityError, "Reaction record ID mismatch: expected #{expected_id}, got #{data['id']}" - end - - missing = ATTRIBUTES - data.keys - if missing.any? - raise IntegrityError, "#{file_path} is missing required fields: #{missing.join(', ')}" - end - end -end diff --git a/app/models/account/data_transfer/record_set.rb b/app/models/account/data_transfer/record_set.rb index ff8a7d575..c2dc09426 100644 --- a/app/models/account/data_transfer/record_set.rb +++ b/app/models/account/data_transfer/record_set.rb @@ -3,10 +3,12 @@ class Account::DataTransfer::RecordSet IMPORT_BATCH_SIZE = 100 - attr_reader :account + attr_reader :account, :model, :attributes - def initialize(account) + def initialize(account:, model:, attributes: nil) @account = account + @model = model + @attributes = (attributes || model.column_names).map(&:to_s) end def export(to:, start: nil) @@ -49,23 +51,42 @@ class Account::DataTransfer::RecordSet end def records - [] + model.where(account_id: account.id) end def export_record(record) - raise NotImplementedError + zip.add_file "data/#{model_dir}/#{record.id}.json", record.to_json end def files - [] + zip.glob("data/#{model_dir}/*.json") end def import_batch(files) - raise NotImplementedError + batch_data = files.map do |file| + data = load(file) + data.slice(*attributes).merge("account_id" => account.id) + end + + model.insert_all!(batch_data) end def validate_record(file_path) - raise NotImplementedError + data = load(file_path) + expected_id = File.basename(file_path, ".json") + + unless data["id"].to_s == expected_id + raise IntegrityError, "#{model} record ID mismatch: expected #{expected_id}, got #{data['id']}" + end + + missing = attributes - data.keys + if missing.any? + raise IntegrityError, "#{file_path} is missing required fields: #{missing.join(', ')}" + end + + if model.exists?(id: data["id"]) + raise IntegrityError, "#{model} record with ID #{data['id']} already exists" + end end def load(file_path) @@ -73,4 +94,8 @@ class Account::DataTransfer::RecordSet rescue ArgumentError => e raise IntegrityError, e.message end + + def model_dir + model.table_name + end end diff --git a/app/models/account/data_transfer/step_record_set.rb b/app/models/account/data_transfer/step_record_set.rb deleted file mode 100644 index 1f82c00aa..000000000 --- a/app/models/account/data_transfer/step_record_set.rb +++ /dev/null @@ -1,47 +0,0 @@ -class Account::DataTransfer::StepRecordSet < Account::DataTransfer::RecordSet - ATTRIBUTES = %w[ - account_id - card_id - completed - content - created_at - id - updated_at - ].freeze - - private - def records - Step.where(account: account) - end - - def export_record(step) - zip.add_file "data/steps/#{step.id}.json", step.as_json.to_json - end - - def files - zip.glob("data/steps/*.json") - end - - def import_batch(files) - batch_data = files.map do |file| - data = load(file) - data.slice(*ATTRIBUTES).merge("account_id" => account.id) - end - - Step.insert_all!(batch_data) - end - - def validate_record(file_path) - data = load(file_path) - expected_id = File.basename(file_path, ".json") - - unless data["id"].to_s == expected_id - raise IntegrityError, "Step record ID mismatch: expected #{expected_id}, got #{data['id']}" - end - - missing = ATTRIBUTES - data.keys - if missing.any? - raise IntegrityError, "#{file_path} is missing required fields: #{missing.join(', ')}" - end - end -end diff --git a/app/models/account/data_transfer/tag_record_set.rb b/app/models/account/data_transfer/tag_record_set.rb deleted file mode 100644 index 3a4725501..000000000 --- a/app/models/account/data_transfer/tag_record_set.rb +++ /dev/null @@ -1,45 +0,0 @@ -class Account::DataTransfer::TagRecordSet < Account::DataTransfer::RecordSet - ATTRIBUTES = %w[ - account_id - created_at - id - title - updated_at - ].freeze - - private - def records - Tag.where(account: account) - end - - def export_record(tag) - zip.add_file "data/tags/#{tag.id}.json", tag.as_json.to_json - end - - def files - zip.glob("data/tags/*.json") - end - - def import_batch(files) - batch_data = files.map do |file| - data = load(file) - data.slice(*ATTRIBUTES).merge("account_id" => account.id) - end - - Tag.insert_all!(batch_data) - end - - def validate_record(file_path) - data = load(file_path) - expected_id = File.basename(file_path, ".json") - - unless data["id"].to_s == expected_id - raise IntegrityError, "Tag record ID mismatch: expected #{expected_id}, got #{data['id']}" - end - - missing = ATTRIBUTES - data.keys - if missing.any? - raise IntegrityError, "#{file_path} is missing required fields: #{missing.join(', ')}" - end - end -end diff --git a/app/models/account/data_transfer/tagging_record_set.rb b/app/models/account/data_transfer/tagging_record_set.rb deleted file mode 100644 index e925cf68e..000000000 --- a/app/models/account/data_transfer/tagging_record_set.rb +++ /dev/null @@ -1,46 +0,0 @@ -class Account::DataTransfer::TaggingRecordSet < Account::DataTransfer::RecordSet - ATTRIBUTES = %w[ - account_id - card_id - created_at - id - tag_id - updated_at - ].freeze - - private - def records - Tagging.where(account: account) - end - - def export_record(tagging) - zip.add_file "data/taggings/#{tagging.id}.json", tagging.as_json.to_json - end - - def files - zip.glob("data/taggings/*.json") - end - - def import_batch(files) - batch_data = files.map do |file| - data = load(file) - data.slice(*ATTRIBUTES).merge("account_id" => account.id) - end - - Tagging.insert_all!(batch_data) - end - - def validate_record(file_path) - data = load(file_path) - expected_id = File.basename(file_path, ".json") - - unless data["id"].to_s == expected_id - raise IntegrityError, "Tagging record ID mismatch: expected #{expected_id}, got #{data['id']}" - end - - missing = ATTRIBUTES - data.keys - if missing.any? - raise IntegrityError, "#{file_path} is missing required fields: #{missing.join(', ')}" - end - end -end diff --git a/app/models/account/data_transfer/user_record_set.rb b/app/models/account/data_transfer/user_record_set.rb index c77e7bbec..277dc82c3 100644 --- a/app/models/account/data_transfer/user_record_set.rb +++ b/app/models/account/data_transfer/user_record_set.rb @@ -10,6 +10,10 @@ class Account::DataTransfer::UserRecordSet < Account::DataTransfer::RecordSet updated_at ] + def initialize(account) + super(account: account, model: User) + end + private def records User.where(account: account) diff --git a/app/models/account/data_transfer/watch_record_set.rb b/app/models/account/data_transfer/watch_record_set.rb deleted file mode 100644 index 3c86da770..000000000 --- a/app/models/account/data_transfer/watch_record_set.rb +++ /dev/null @@ -1,47 +0,0 @@ -class Account::DataTransfer::WatchRecordSet < Account::DataTransfer::RecordSet - ATTRIBUTES = %w[ - account_id - card_id - created_at - id - updated_at - user_id - watching - ].freeze - - private - def records - Watch.where(account: account) - end - - def export_record(watch) - zip.add_file "data/watches/#{watch.id}.json", watch.as_json.to_json - end - - def files - zip.glob("data/watches/*.json") - end - - def import_batch(files) - batch_data = files.map do |file| - data = load(file) - data.slice(*ATTRIBUTES).merge("account_id" => account.id) - end - - Watch.insert_all!(batch_data) - end - - def validate_record(file_path) - data = load(file_path) - expected_id = File.basename(file_path, ".json") - - unless data["id"].to_s == expected_id - raise IntegrityError, "Watch record ID mismatch: expected #{expected_id}, got #{data['id']}" - end - - missing = ATTRIBUTES - data.keys - if missing.any? - raise IntegrityError, "#{file_path} is missing required fields: #{missing.join(', ')}" - end - end -end diff --git a/app/models/account/data_transfer/webhook_delinquency_tracker_record_set.rb b/app/models/account/data_transfer/webhook_delinquency_tracker_record_set.rb deleted file mode 100644 index a31600bdb..000000000 --- a/app/models/account/data_transfer/webhook_delinquency_tracker_record_set.rb +++ /dev/null @@ -1,47 +0,0 @@ -class Account::DataTransfer::WebhookDelinquencyTrackerRecordSet < Account::DataTransfer::RecordSet - ATTRIBUTES = %w[ - account_id - consecutive_failures_count - created_at - first_failure_at - id - updated_at - webhook_id - ].freeze - - private - def records - Webhook::DelinquencyTracker.where(account: account) - end - - def export_record(tracker) - zip.add_file "data/webhook_delinquency_trackers/#{tracker.id}.json", tracker.as_json.to_json - end - - def files - zip.glob("data/webhook_delinquency_trackers/*.json") - end - - def import_batch(files) - batch_data = files.map do |file| - data = load(file) - data.slice(*ATTRIBUTES).merge("account_id" => account.id) - end - - Webhook::DelinquencyTracker.insert_all!(batch_data) - end - - def validate_record(file_path) - data = load(file_path) - expected_id = File.basename(file_path, ".json") - - unless data["id"].to_s == expected_id - raise IntegrityError, "WebhookDelinquencyTracker record ID mismatch: expected #{expected_id}, got #{data['id']}" - end - - missing = ATTRIBUTES - data.keys - if missing.any? - raise IntegrityError, "#{file_path} is missing required fields: #{missing.join(', ')}" - end - end -end diff --git a/app/models/account/data_transfer/webhook_delivery_record_set.rb b/app/models/account/data_transfer/webhook_delivery_record_set.rb deleted file mode 100644 index c26c3c0dc..000000000 --- a/app/models/account/data_transfer/webhook_delivery_record_set.rb +++ /dev/null @@ -1,49 +0,0 @@ -class Account::DataTransfer::WebhookDeliveryRecordSet < Account::DataTransfer::RecordSet - ATTRIBUTES = %w[ - account_id - created_at - event_id - id - request - response - state - updated_at - webhook_id - ].freeze - - private - def records - Webhook::Delivery.where(account: account) - end - - def export_record(delivery) - zip.add_file "data/webhook_deliveries/#{delivery.id}.json", delivery.as_json.to_json - end - - def files - zip.glob("data/webhook_deliveries/*.json") - end - - def import_batch(files) - batch_data = files.map do |file| - data = load(file) - data.slice(*ATTRIBUTES).merge("account_id" => account.id) - end - - Webhook::Delivery.insert_all!(batch_data) - end - - def validate_record(file_path) - data = load(file_path) - expected_id = File.basename(file_path, ".json") - - unless data["id"].to_s == expected_id - raise IntegrityError, "WebhookDelivery record ID mismatch: expected #{expected_id}, got #{data['id']}" - end - - missing = ATTRIBUTES - data.keys - if missing.any? - raise IntegrityError, "#{file_path} is missing required fields: #{missing.join(', ')}" - end - end -end diff --git a/app/models/account/data_transfer/webhook_record_set.rb b/app/models/account/data_transfer/webhook_record_set.rb deleted file mode 100644 index 64147ba6d..000000000 --- a/app/models/account/data_transfer/webhook_record_set.rb +++ /dev/null @@ -1,50 +0,0 @@ -class Account::DataTransfer::WebhookRecordSet < Account::DataTransfer::RecordSet - ATTRIBUTES = %w[ - account_id - active - board_id - created_at - id - name - signing_secret - subscribed_actions - updated_at - url - ].freeze - - private - def records - Webhook.where(account: account) - end - - def export_record(webhook) - zip.add_file "data/webhooks/#{webhook.id}.json", webhook.as_json.to_json - end - - def files - zip.glob("data/webhooks/*.json") - end - - def import_batch(files) - batch_data = files.map do |file| - data = load(file) - data.slice(*ATTRIBUTES).merge("account_id" => account.id) - end - - Webhook.insert_all!(batch_data) - end - - def validate_record(file_path) - data = load(file_path) - expected_id = File.basename(file_path, ".json") - - unless data["id"].to_s == expected_id - raise IntegrityError, "Webhook record ID mismatch: expected #{expected_id}, got #{data['id']}" - end - - missing = ATTRIBUTES - data.keys - if missing.any? - raise IntegrityError, "#{file_path} is missing required fields: #{missing.join(', ')}" - end - end -end