Class: Textus::Action::Audit

Inherits:
Base
  • Object
show all
Defined in:
lib/textus/action/audit.rb

Defined Under Namespace

Classes: Query

Class Method Summary collapse

Methods inherited from Base

inherited, proposal_from

Methods included from Contract::DSL

#arg, #cli, #cli_stdin, #contract, #contract?, #summary, #surfaces, #verb, #view

Class Method Details

.call(container:, key: nil, lane: nil, role: nil, verb: nil, since: nil, seq_since: nil, correlation_id: nil, limit: nil) ⇒ Object

rubocop:disable Metrics/ParameterLists



25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/textus/action/audit.rb', line 25

def self.call(container:, key: nil, lane: nil, role: nil, verb: nil, since: nil, seq_since: nil, correlation_id: nil, limit: nil, **) # rubocop:disable Metrics/ParameterLists
  audit_log = container.audit_log
  manifest = container.manifest

  cursor_check = check_cursor_expiry(seq_since, audit_log)
  return cursor_check if cursor_check.is_a?(Dry::Monads::Result::Failure)

  Success(audit_log.scan(
    seq_since: seq_since,
    key: key,
    role: role,
    verb: verb,
    correlation_id: correlation_id,
    limit: limit,
  ).select do |row|
    next false if lane && !key_in_lane?(row["key"], lane, manifest)
    next false if since && (row["ts"].nil? || Time.parse(row["ts"]) < since)

    true
  end)
end

.check_cursor_expiry(seq_since, audit_log) ⇒ Object



76
77
78
79
80
81
82
83
84
# File 'lib/textus/action/audit.rb', line 76

def self.check_cursor_expiry(seq_since, audit_log)
  return unless seq_since

  min = audit_log.min_available_seq
  return unless min && seq_since < min - 1

  Failure(code: :cursor_expired, message: "requested seq #{seq_since} is below minimum available #{min}",
          details: { requested: seq_since, min_available: min })
end

.key_in_lane?(key, lane, manifest) ⇒ Boolean

Returns:

  • (Boolean)


86
87
88
89
90
91
# File 'lib/textus/action/audit.rb', line 86

def self.key_in_lane?(key, lane, manifest)
  mentry = manifest.resolver.resolve(key).entry
  mentry && mentry.lane == lane
rescue Textus::Error
  false
end

.parse_since(str, now: Time.now.utc) ⇒ Object



47
48
49
50
51
52
53
54
# File 'lib/textus/action/audit.rb', line 47

def self.parse_since(str, now: Time.now.utc)
  return nil if str.nil? || str.empty?
  return Time.parse(str) if str =~ /\A\d{4}-\d{2}-\d{2}/

  match = str.match(/\A(\d+)([smhd])\z/) or return nil
  mult = { "s" => 1, "m" => 60, "h" => 3600, "d" => 86_400 }[match[2]]
  now - (match[1].to_i * mult)
end