Class: Decidim::ActionAuthorizer::AuthorizationStatusCollection

Inherits:
Object
  • Object
show all
Defined in:
decidim-core/app/services/decidim/action_authorizer.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(authorization_handlers, user, component, resource) ⇒ AuthorizationStatusCollection

Returns a new instance of AuthorizationStatusCollection.



100
101
102
103
104
105
106
107
108
109
110
111
# File 'decidim-core/app/services/decidim/action_authorizer.rb', line 100

def initialize(authorization_handlers, user, component, resource)
  @ephemeral_user = user&.ephemeral?
  @authorization_handlers = authorization_handlers
  @statuses = authorization_handlers&.filter_map do |name, opts|
    handler = Verifications::Adapter.from_element(name)
    next if @ephemeral_user && !handler.ephemeral?

    authorization = user ? Verifications::Authorizations.new(organization: user.organization, user:, name:).first : nil
    status_code, data = handler.authorize(authorization, opts["options"], component, resource)
    AuthorizationStatus.new(status_code, handler, data)
  end || []
end

Instance Attribute Details

#statusesObject (readonly)

Returns the value of attribute statuses.



98
99
100
# File 'decidim-core/app/services/decidim/action_authorizer.rb', line 98

def statuses
  @statuses
end

Instance Method Details

#codesObject



135
136
137
# File 'decidim-core/app/services/decidim/action_authorizer.rb', line 135

def codes
  @codes ||= statuses.map(&:code)
end

#ephemeral?Boolean

Returns:

  • (Boolean)


149
150
151
152
153
# File 'decidim-core/app/services/decidim/action_authorizer.rb', line 149

def ephemeral?
  return if statuses.blank?

  statuses.all?(&:ephemeral?)
end

#global_codeObject



121
122
123
124
125
126
127
128
129
# File 'decidim-core/app/services/decidim/action_authorizer.rb', line 121

def global_code
  return :ok if ok?

  [:unauthorized, :pending].each do |code|
    return code if statuses.any? { |status| status.code == code }
  end

  false
end

#ok?Boolean

Returns:

  • (Boolean)


113
114
115
116
117
118
119
# File 'decidim-core/app/services/decidim/action_authorizer.rb', line 113

def ok?
  # When no statuses are present for the action ephemeral users
  # are not allowed to perform the action
  return !@ephemeral_user if statuses.blank?

  statuses.all?(&:ok?)
end

#pending_authorizations_countObject



139
140
141
142
143
# File 'decidim-core/app/services/decidim/action_authorizer.rb', line 139

def pending_authorizations_count
  return 0 if @statuses.blank?

  @statuses.count
end

#single_authorization_required?Boolean

Returns:

  • (Boolean)


145
146
147
# File 'decidim-core/app/services/decidim/action_authorizer.rb', line 145

def single_authorization_required?
  pending_authorizations_count == 1 && [:ok, :unauthorized].exclude?(global_code)
end

#status_for(handler_name) ⇒ Object



131
132
133
# File 'decidim-core/app/services/decidim/action_authorizer.rb', line 131

def status_for(handler_name)
  statuses.find { |status| status.handler_name == handler_name }
end

#user_pending?Boolean

Returns:

  • (Boolean)


155
156
157
# File 'decidim-core/app/services/decidim/action_authorizer.rb', line 155

def user_pending?
  !global_code && statuses.any? { |status| [:missing, :expired, :incomplete].include?(status.code) }
end