diff --git a/app/models/bulk_email_session.rb b/app/models/bulk_email_session.rb new file mode 100644 index 00000000..6ef16424 --- /dev/null +++ b/app/models/bulk_email_session.rb @@ -0,0 +1,45 @@ +# frozen_string_literal: true + +require 'securerandom' + +class BulkEmailSession < ApplicationRecord + before_validation :generate_token, on: :create + before_validation :set_expiration, on: :create + + validates :token, presence: true, uniqueness: true + validates :recipient_emails, presence: true + + serialize :recipient_emails, type: Array + + # Sessions expire after 1 hour to prevent database bloat + EXPIRATION_TIME = 1.hour + + scope :active, -> { where('expires_at > ?', Time.current) } + scope :expired, -> { where('expires_at <= ?', Time.current) } + + def self.cleanup_expired! + expired.delete_all + end + + def expired? + expires_at <= Time.current + end + + def recipient_count + recipient_emails&.size || 0 + end + + private + + def generate_token + return if token.present? + + self.token = SecureRandom.hex(16) + end + + def set_expiration + return if expires_at.present? + + self.expires_at = EXPIRATION_TIME.from_now + end +end \ No newline at end of file diff --git a/db/migrate/20251013095048_create_bulk_email_sessions.rb b/db/migrate/20251013095048_create_bulk_email_sessions.rb new file mode 100644 index 00000000..445e6e47 --- /dev/null +++ b/db/migrate/20251013095048_create_bulk_email_sessions.rb @@ -0,0 +1,15 @@ +class CreateBulkEmailSessions < ActiveRecord::Migration[7.2] + def change + create_table :bulk_email_sessions do |t| + t.string :token, null: false + t.text :recipient_emails + t.string :filter_type + t.string :search_term + t.datetime :expires_at + + t.timestamps + end + add_index :bulk_email_sessions, :token, unique: true + add_index :bulk_email_sessions, :expires_at + end +end \ No newline at end of file diff --git a/lib/tasks/bulk_email_cleanup.rake b/lib/tasks/bulk_email_cleanup.rake new file mode 100644 index 00000000..97183997 --- /dev/null +++ b/lib/tasks/bulk_email_cleanup.rake @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +namespace :bulk_email do + desc 'Clean up expired bulk email sessions' + task cleanup: :environment do + count = BulkEmailSession.cleanup_expired! + puts "Cleaned up #{count} expired bulk email sessions" + end +end \ No newline at end of file