Class: Card::ActManager

Inherits:
Object
  • Object
show all
Defined in:
lib/card/act_manager.rb,
lib/card/act_manager/stage.rb,
lib/card/act_manager/stage_director.rb,
lib/card/act_manager/subdirector_array.rb,
lib/card/act_manager/stage_director/phases.rb

Overview

available values: dirty attributes yes | yes | yes params yes | yes | yes success yes | yes | yes no session yes | yes | yes no

Explanation: yes! the recommended stage to do that yes ok to do it here no not recommended; chance to mess things up but if something forces you to do it here you can try no! never do it here. it won't work or will break things

if there is only a single entry in a phase column it counts for all stages of that phase

1) 'insecure' means a change of a card attribute that can possibly make the card invalid to save 2) 'secure' means you are sure that the change doesn't affect the validation 3) In all stages except IGwD: If you call 'create', 'update' or 'save' the card will become part of the same act and all stage of the validation and storage phase will be executed immediately for that card. The integration phase will be executed together with the act card and its subcards.

In IGwD all these methods create a new act. 4) This means if an exception is raised in the validation or storage phase everything will rollback. If the integration phase fails the db changes of the other two phases will remain persistent.

Defined Under Namespace

Modules: Stage Classes: StageDirector, StageSubdirector, SubdirectorArray

Class Method Summary collapse

Class Method Details

.act_directorObject



82
83
84
85
86
# File 'lib/card/act_manager.rb', line 82

def act_director
  return unless act_card

  act_card.director
end

.add(director) ⇒ Object



143
144
145
146
# File 'lib/card/act_manager.rb', line 143

def add director
  # Rails.logger.debug "added: #{director.card.name}".green
  directors[director.card] = director
end

.card(name) ⇒ Object



137
138
139
140
141
# File 'lib/card/act_manager.rb', line 137

def card name
  directors.values.find do |dir|
    dir.card.name == name
  end&.card
end

.card_changed(old_card) ⇒ Object



148
149
150
151
152
# File 'lib/card/act_manager.rb', line 148

def card_changed old_card
  return unless (director = @directors.delete old_card)

  add director
end

.clearObject



104
105
106
107
108
109
110
111
# File 'lib/card/act_manager.rb', line 104

def clear
  self.act_card = nil
  self.act = nil
  directors.each_pair do |card, _dir|
    card.director = nil
  end
  @directors = nil
end

.contextualize_delayed_event(act_id, card, env, auth) ⇒ Object

If active jobs (and hence the integrate_with_delay events) don't run in a background process then Card::Env.deserialize! decouples the controller's params hash and the Card::Env's params hash with the effect that params changes in the CardController get lost (a crucial example are success params that are processed in CardController#soft_redirect)



178
179
180
181
182
183
184
# File 'lib/card/act_manager.rb', line 178

def contextualize_delayed_event act_id, card, env, auth
  if delaying?
    contextualize_for_delay(act_id, card, env, auth) { yield }
  else
    yield
  end
end

.contextualize_for_delay(act_id, card, env, auth, &block) ⇒ Object

The whole ActManager setup is gone once we reach a integrate with delay event processed by ActiveJob. This is the improvised resetup to get subcards working.



195
196
197
198
199
200
201
202
203
204
# File 'lib/card/act_manager.rb', line 195

def contextualize_for_delay act_id, card, env, auth, &block
  self.act = Act.find act_id if act_id
  with_env_and_auth env, auth do
    return yield unless act

    run_act(act.card || card) do
      act_card.director.run_delayed_event act, &block
    end
  end
end

.deep_delete(director) ⇒ Object



161
162
163
164
165
166
# File 'lib/card/act_manager.rb', line 161

def deep_delete director
  director.subdirectors.each do |subdir|
    deep_delete subdir
  end
  delete director
end

.delaying?Boolean

Returns:

  • (Boolean)


186
187
188
189
190
# File 'lib/card/act_manager.rb', line 186

def delaying?
  const_defined?("Delayed") &&
    Delayed::Worker.delay_jobs &&
    Card.config.active_job.queue_adapter == :delayed_job
end

.delete(director) ⇒ Object



154
155
156
157
158
159
# File 'lib/card/act_manager.rb', line 154

def delete director
  return unless @directors

  @directors.delete director.card
  director.delete
end

.directorsObject



88
89
90
# File 'lib/card/act_manager.rb', line 88

def directors
  @directors ||= {}
end

.fetch(card, opts = {}) ⇒ Object

FIXME: use "parent" instead of opts (it's the only option)



114
115
116
117
118
119
120
121
# File 'lib/card/act_manager.rb', line 114

def fetch card, opts={}
  return directors[card] if directors[card]

  directors.each_key do |dir_card|
    return dir_card.director if dir_card.name == card.name && dir_card.director
  end
  add new_director(card, opts)
end

.include?(name) ⇒ Boolean

Returns:

  • (Boolean)


123
124
125
# File 'lib/card/act_manager.rb', line 123

def include? name
  directors.keys.any? { |card| card.key == name.to_name.key }
end

.need_actObject



100
101
102
# File 'lib/card/act_manager.rb', line 100

def need_act
  self.act ||= Card::Act.create ip_address: Env.ip
end

.new_director(card, opts = {}) ⇒ Object



127
128
129
130
131
132
133
134
135
# File 'lib/card/act_manager.rb', line 127

def new_director card, opts={}
  if opts[:parent]
    StageSubdirector.new card, opts
  elsif act_card && act_card != card && running_act?
    act_card.director.subdirectors.add card
  else
    StageDirector.new card
  end
end

.run_act(card) ⇒ Object



92
93
94
95
96
97
98
# File 'lib/card/act_manager.rb', line 92

def run_act card
  self.act_card = card
  # add new_director(card)
  yield
ensure
  clear
end

.running_act?Boolean

Returns:

  • (Boolean)


168
169
170
# File 'lib/card/act_manager.rb', line 168

def running_act?
  (dir = act_director) && dir.running?
end

.to_sObject



214
215
216
217
# File 'lib/card/act_manager.rb', line 214

def to_s
  act_director.to_s
  # directors.values.map(&:to_s).join "\n"
end

.with_env_and_auth(env, auth) ⇒ Object



206
207
208
209
210
211
212
# File 'lib/card/act_manager.rb', line 206

def with_env_and_auth env, auth
  Card::Auth.with auth do
    Card::Env.with env do
      yield
    end
  end
end