Class: ExisRay::Current

Inherits:
ActiveSupport::CurrentAttributes
  • Object
show all
Defined in:
lib/exis_ray/current.rb

Overview

Clase base para la gestión del contexto de negocio (User, ISP, Correlation). Debe ser heredada por la aplicación host (ej: class Current < ExisRay::Current).

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.log_fieldsHash

Hook overridable por la subclass de la app host. Retorna un Hash de campos extra a inyectar en cada log line, junto a ‘user_id`/`isp_id`/`correlation_id`.

Pensado para cubrir tanto constantes de proceso (declaradas como ‘freeze`-d constants en la subclass) como valores dinámicos per-request (leídos de atributos de Current). El JsonFormatter invoca este método en cada log y mergea el resultado al payload — luego de los campos canónicos pero antes de las keys del propio mensaje del developer (que ganan por override).

Examples:

Constantes de proceso + valores per-request combinados

class Current < ExisRay::Current
  TENANT_ID = ENV.fetch("TENANT_ID").freeze
  attribute :region

  def self.log_fields
    { tenant_id: TENANT_ID, region: region }.compact
  end
end

Returns:

  • (Hash)

    Pares clave/valor a inyectar. Default ‘{}`.



31
32
33
# File 'lib/exis_ray/current.rb', line 31

def self.log_fields
  {}
end

Instance Method Details

#correlation_id=(id) ⇒ Object



71
72
73
74
75
76
77
# File 'lib/exis_ray/current.rb', line 71

def correlation_id=(id)
  super
  assign_session_request_id(id)
  ActiveResource::Base.headers["CorrelationId"] = sanitize_header_value(id) if defined?(ActiveResource::Base)
  PaperTrail.request.controller_info = { correlation_id: id } if defined?(PaperTrail)
  sync_reporter_correlation_id(id)
end

#correlation_id?Boolean

Usa present? intencionalmente: un string vacío no es un correlation_id válido, a diferencia de user_id/isp_id donde 0 es un valor legítimo.

Returns:

  • (Boolean)


116
117
118
# File 'lib/exis_ray/current.rb', line 116

def correlation_id?
  correlation_id.present?
end

#ispObject



99
100
101
102
103
104
# File 'lib/exis_ray/current.rb', line 99

def isp
  return nil if isp_id.nil?
  return nil unless defined?(::Isp) && ::Isp.respond_to?(:find_by)

  @isp_object ||= ::Isp.find_by(id: isp_id) # rubocop:disable Naming/MemoizedInstanceVariableName
end

#isp=(object) ⇒ Object



95
96
97
# File 'lib/exis_ray/current.rb', line 95

def isp=(object)
  self.isp_id = object&.id
end

#isp?Boolean

Returns:

  • (Boolean)


110
111
112
# File 'lib/exis_ray/current.rb', line 110

def isp?
  !isp_id.nil?
end

#isp_id=(id) ⇒ Object



63
64
65
66
67
68
69
# File 'lib/exis_ray/current.rb', line 63

def isp_id=(id)
  @isp_object = nil
  super
  return unless defined?(ActiveResource::Base)

  ActiveResource::Base.headers["IspId"] = sanitize_header_value(id)
end

#userObject



88
89
90
91
92
93
# File 'lib/exis_ray/current.rb', line 88

def user
  return nil if user_id.nil?
  return nil unless defined?(::User) && ::User.respond_to?(:find_by)

  @user_object ||= ::User.find_by(id: user_id) # rubocop:disable Naming/MemoizedInstanceVariableName
end

#user=(object) ⇒ Object

— Helpers de Objetos (Lazy Loading con cache por request) — Estos métodos asumen que la app host tiene modelos ::User e ::Isp. Memoizan el objeto en @user_object/@isp_object, que se limpian en el bloque resets al final de cada request/job, y al asignar un nuevo user_id/isp_id.



84
85
86
# File 'lib/exis_ray/current.rb', line 84

def user=(object)
  self.user_id = object&.id
end

#user?Boolean

Returns:

  • (Boolean)


106
107
108
# File 'lib/exis_ray/current.rb', line 106

def user?
  !user_id.nil?
end

#user_id=(id) ⇒ Object

— Setters con Hooks —



54
55
56
57
58
59
60
61
# File 'lib/exis_ray/current.rb', line 54

def user_id=(id)
  @user_object = nil
  super
  ActiveResource::Base.headers["UserId"] = sanitize_header_value(id) if defined?(ActiveResource::Base)
  return unless defined?(PaperTrail)

  PaperTrail.request.whodunnit = id
end