backtrace.rb 835 Bytes
class Backtrace
  include Mongoid::Document
  include Mongoid::Timestamps

  field :fingerprint
  index :fingerprint => 1

  has_many :notices
  has_one :notice

  embeds_many :lines, :class_name => "BacktraceLine"

  after_initialize :generate_fingerprint

  delegate :app, :to => :notice

  def self.find_or_create(lines)
    fingerprint = generate_fingerprint(lines)

    where(fingerprint: generate_fingerprint(lines)).
      find_one_and_update(
        { '$setOnInsert' => { fingerprint: fingerprint, lines: lines } },
        { return_document: :after, upsert: true })
  end

  def raw=(raw)
    raw.compact.each do |raw_line|
      lines << BacktraceLine.new(BacktraceLineNormalizer.new(raw_line).call)
    end
  end

  private
  def generate_fingerprint
    self.fingerprint = self.class.generate_fingerprint(lines)
  end
end