Class: Lyra::Privacy::GDPRCompliance

Inherits:
Object
  • Object
show all
Defined in:
lib/lyra/privacy/gdpr_compliance.rb,
lib/lyra/privacy/policy_integration.rb

Overview

Extend GDPRCompliance with policy integration

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(subject_id:, subject_type: 'User') ⇒ GDPRCompliance

Initialize GDPR compliance handler

Parameters:

  • subject_id (Object) —

    The data subject's identifier

  • subject_type (String) (defaults to: 'User') —

    The type/class of the subject (default: 'User')



26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/lyra/privacy/gdpr_compliance.rb', line 26

def initialize(subject_id:, subject_type: 'User')
  @subject_id = subject_id
  @subject_type = subject_type

  @pam_compliance = PamDsl::GDPRCompliance.new(
    subject_id: subject_id,
    subject_type: subject_type,
    event_reader: method(:read_subject_events),
    attribute_extractor: method(:extract_attributes),
    timestamp_extractor: method(:extract_timestamp),
    operation_extractor: method(:extract_operation),
    model_class_extractor: method(:extract_model_class),
    model_id_extractor: method(:extract_model_id),
    changes_extractor: method(:extract_changes),
    retention_policy: Lyra.config.retention_policy || default_retention_policy
  )
end

Instance Attribute Details

#pam_compliance ⇒ Object (readonly)

Returns the value of attribute pam_compliance.



19
20
21
# File 'lib/lyra/privacy/gdpr_compliance.rb', line 19

def pam_compliance
  @pam_compliance
end

Instance Method Details

Consent Audit



77
78
79
# File 'lib/lyra/privacy/gdpr_compliance.rb', line 77

def consent_audit
  pam_compliance.consent_audit
end

#data_export ⇒ Object

Right to Access (Article 15)



47
48
49
# File 'lib/lyra/privacy/gdpr_compliance.rb', line 47

def data_export
  pam_compliance.data_export
end

#detect_pii_with_policy(attributes, policy_name, use_detector: true) ⇒ Object

Use privacy policy for PII detection if available

Parameters:

  • attributes (Hash) —

    Attributes to check

  • policy_name (Symbol) —

    Policy name

  • use_detector (Boolean) (defaults to: true) —

    Fall back to PIIDetector (default: true)



211
212
213
214
# File 'lib/lyra/privacy/policy_integration.rb', line 211

def detect_pii_with_policy(attributes, policy_name, use_detector: true)
  integration = PolicyIntegration.new(policy_name, use_detector: use_detector)
  integration.detect_pii(attributes)
end

#full_report ⇒ Object

Full GDPR Compliance Report



82
83
84
# File 'lib/lyra/privacy/gdpr_compliance.rb', line 82

def full_report
  pam_compliance.full_report
end

#portable_export(format: :json) ⇒ Object

Right to Data Portability (Article 20)



57
58
59
# File 'lib/lyra/privacy/gdpr_compliance.rb', line 57

def portable_export(format: :json)
  pam_compliance.portable_export(format: format)
end

#processing_activities ⇒ Object

Processing Activities Record (Article 30)



67
68
69
# File 'lib/lyra/privacy/gdpr_compliance.rb', line 67

def processing_activities
  pam_compliance.processing_activities
end

#rectification_history ⇒ Object

Right to Rectification (Article 16)



62
63
64
# File 'lib/lyra/privacy/gdpr_compliance.rb', line 62

def rectification_history
  pam_compliance.rectification_history
end

#retention_compliance_check ⇒ Object

Data Retention Compliance Check



72
73
74
# File 'lib/lyra/privacy/gdpr_compliance.rb', line 72

def retention_compliance_check
  pam_compliance.retention_compliance_check
end

#retention_compliance_with_policy(policy_name) ⇒ Object

Check retention compliance with policy Returns nil for models without defined retention (infinite/manual)



218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
# File 'lib/lyra/privacy/policy_integration.rb', line 218

def retention_compliance_with_policy(policy_name)
  integration = PolicyIntegration.new(policy_name)
  events = collect_all_events

  events.group_by { |e| e.model_class }.map do |model_class, model_events|
    retention_duration = integration.retention_duration(model_class)

    # nil means infinite/manual retention - always compliant
    if retention_duration.nil?
      {
        model_class: model_class,
        total_events: model_events.count,
        expired_events: 0,
        retention_period: nil,
        compliance_status: :manual,
        expired_event_ids: []
      }
    else
      expired = model_events.select do |event|
        event.timestamp && event.timestamp < (Time.current - retention_duration)
      end

      {
        model_class: model_class,
        total_events: model_events.count,
        expired_events: expired.count,
        retention_period: retention_duration,
        compliance_status: expired.empty? ? :compliant : :requires_action,
        expired_event_ids: expired.map(&:event_id)
      }
    end
  end
end

#right_to_be_forgotten_report ⇒ Object

Right to be Forgotten (Article 17)



52
53
54
# File 'lib/lyra/privacy/gdpr_compliance.rb', line 52

def right_to_be_forgotten_report
  pam_compliance.right_to_be_forgotten_report
end