Class: Hipaapotamus::AccountabilityContext

Inherits:
Object
  • Object
show all
Defined in:
lib/hipaapotamus/accountability_context.rb

Constant Summary collapse

THREAD_STORAGE_KEY =
:hipaapotamus_active_accountability_context

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(agent) ⇒ AccountabilityContext

Returns a new instance of AccountabilityContext.



9
10
11
12
13
14
15
16
17
# File 'lib/hipaapotamus/accountability_context.rb', line 9

def initialize(agent)
  raise AccountabilityError, 'Cannot create AccountabilityContext without a valid Agent' unless agent.is_a? Agent

  @agent = agent
  @open = true
  @finalized = false

  within { yield(self) } if block_given?
end

Instance Attribute Details

#agentObject (readonly)

Returns the value of attribute agent.



7
8
9
# File 'lib/hipaapotamus/accountability_context.rb', line 7

def agent
  @agent
end

#parent_accountability_contextObject (readonly)

Returns the value of attribute parent_accountability_context.



7
8
9
# File 'lib/hipaapotamus/accountability_context.rb', line 7

def parent_accountability_context
  @parent_accountability_context
end

#progenitor_actionsObject (readonly)

Returns the value of attribute progenitor_actions.



7
8
9
# File 'lib/hipaapotamus/accountability_context.rb', line 7

def progenitor_actions
  @progenitor_actions
end

Class Method Details

.currentObject



88
89
90
# File 'lib/hipaapotamus/accountability_context.rb', line 88

def current
  Thread.current[THREAD_STORAGE_KEY]
end

.current!Object



92
93
94
# File 'lib/hipaapotamus/accountability_context.rb', line 92

def current!
  current || raise(AccountabilityError, 'Not within an AccountabilityContext')
end

Instance Method Details

#finalize!Object



41
42
43
44
45
46
47
48
# File 'lib/hipaapotamus/accountability_context.rb', line 41

def finalize!
  raise(AccountabilityError, 'AccountabilityContext is open') if open?
  raise(AccountabilityError, 'AccountabilityContext is finalized') if finalized?

  Action.bulk_insert(log_worthy_actions) if root?

  @finalized = true
end

#finalized?Boolean



37
38
39
# File 'lib/hipaapotamus/accountability_context.rb', line 37

def finalized?
  @finalized
end

#open?Boolean



19
20
21
# File 'lib/hipaapotamus/accountability_context.rb', line 19

def open?
  @open
end

#record_action(protected, action_type, transactional = false) ⇒ Object

noinspection RubyArgCount



24
25
26
27
28
29
30
31
32
33
34
35
# File 'lib/hipaapotamus/accountability_context.rb', line 24

def record_action(protected, action_type, transactional = false)
  action = Action.new(
    agent: agent,
    protected: protected,
    action_type: action_type,
    source_transaction_state: Hipaapotamus.current_transaction_state,
    is_transactional: transactional,
    performed_at: DateTime.now
  )

  actions << action
end

#root?Boolean



50
51
52
# File 'lib/hipaapotamus/accountability_context.rb', line 50

def root?
  parent_accountability_context.nil?
end

#withinObject



54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/hipaapotamus/accountability_context.rb', line 54

def within
  raise(AccountabilityError, 'AccountabilityContext is not open') unless open?
  @open = false

  @parent_accountability_context = Thread.current[THREAD_STORAGE_KEY]
  Thread.current[THREAD_STORAGE_KEY] = self

  begin

    yield(self)
  ensure
    Thread.current[THREAD_STORAGE_KEY] = @parent_accountability_context
  end
end