loggable_activity 0.2.1 → 0.5.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (159) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +29 -42
  3. data/.vscode/commands.json +2 -2
  4. data/.vscode/terminals.json +8 -8
  5. data/CHANGELOG.md +9 -0
  6. data/CHEAT_SHEET.md +31 -0
  7. data/MIT-LICENSE +21 -0
  8. data/README.md +1 -1
  9. data/Rakefile +6 -4
  10. data/app/assets/config/loggable_activity_manifest.js +2 -0
  11. data/app/assets/javascripts/loggable_activity/application.js +1 -0
  12. data/app/assets/stylesheets/loggable_activity/activities.scss +25 -0
  13. data/app/assets/stylesheets/loggable_activity/application.scss +16 -0
  14. data/app/controllers/concerns/.keep +0 -0
  15. data/app/controllers/loggable_activity/activities_controller.rb +12 -0
  16. data/app/controllers/loggable_activity/application_controller.rb +6 -0
  17. data/app/helpers/loggable_activity/activities_helper.rb +17 -0
  18. data/app/helpers/loggable_activity/application_helper.rb +6 -0
  19. data/app/jobs/loggable_activity/application_job.rb +6 -0
  20. data/app/mailers/loggable_activity/application_mailer.rb +8 -0
  21. data/app/models/loggable_activity/application_record.rb +7 -0
  22. data/app/views/kaminari/pico/_first_page.html.erb +13 -0
  23. data/app/views/kaminari/pico/_gap.html.erb +8 -0
  24. data/app/views/kaminari/pico/_last_page.html.erb +12 -0
  25. data/app/views/kaminari/pico/_next_page.html.erb +13 -0
  26. data/app/views/kaminari/pico/_page.html.erb +14 -0
  27. data/app/views/kaminari/pico/_paginator.html.erb +27 -0
  28. data/app/views/kaminari/pico/_prev_page.html.erb +14 -0
  29. data/app/views/layouts/loggable_activity/application.html.slim +20 -0
  30. data/app/views/loggable_activity/activities/_activities.html.slim +28 -0
  31. data/app/views/loggable_activity/activities/index.html.erb +6 -0
  32. data/app/views/loggable_activity/bootstrap/kaminari/_first_page.html.erb +13 -0
  33. data/app/views/loggable_activity/bootstrap/kaminari/_gap.html.erb +8 -0
  34. data/app/views/loggable_activity/bootstrap/kaminari/_last_page.html.erb +13 -0
  35. data/app/views/loggable_activity/bootstrap/kaminari/_next_page.html.erb +13 -0
  36. data/app/views/loggable_activity/bootstrap/kaminari/_page.html.erb +14 -0
  37. data/app/views/loggable_activity/bootstrap/kaminari/_paginator.html.erb +27 -0
  38. data/app/views/loggable_activity/bootstrap/kaminari/_prev_page.html.erb +13 -0
  39. data/config/initializers/kaminari_config.rb +14 -0
  40. data/config/routes.rb +7 -0
  41. data/{lib/generators/loggable_activity/templates/create_loggable_activities.rb → db/migrate/20240702092648_create_loggable_activity_tables.rb} +18 -10
  42. data/git-org/HEAD +1 -0
  43. data/git-org/config +7 -0
  44. data/git-org/description +1 -0
  45. data/git-org/hooks/applypatch-msg.sample +15 -0
  46. data/git-org/hooks/commit-msg.sample +24 -0
  47. data/git-org/hooks/fsmonitor-watchman.sample +174 -0
  48. data/git-org/hooks/post-update.sample +8 -0
  49. data/git-org/hooks/pre-applypatch.sample +14 -0
  50. data/git-org/hooks/pre-commit.sample +49 -0
  51. data/git-org/hooks/pre-merge-commit.sample +13 -0
  52. data/git-org/hooks/pre-push.sample +53 -0
  53. data/git-org/hooks/pre-rebase.sample +169 -0
  54. data/git-org/hooks/pre-receive.sample +24 -0
  55. data/git-org/hooks/prepare-commit-msg.sample +42 -0
  56. data/git-org/hooks/push-to-checkout.sample +78 -0
  57. data/git-org/hooks/update.sample +128 -0
  58. data/git-org/info/exclude +6 -0
  59. data/lib/loggable_activity/activity.rb +4 -3
  60. data/lib/{schemas → loggable_activity}/config_schema.json +3 -10
  61. data/lib/loggable_activity/configuration.rb +48 -77
  62. data/lib/loggable_activity/data_owner.rb +0 -1
  63. data/lib/loggable_activity/encryption.rb +16 -7
  64. data/lib/loggable_activity/encryption_key.rb +4 -7
  65. data/lib/loggable_activity/engine.rb +22 -0
  66. data/lib/loggable_activity/error.rb +0 -10
  67. data/lib/loggable_activity/hooks.rb +10 -15
  68. data/lib/loggable_activity/payload.rb +8 -11
  69. data/lib/loggable_activity/sanitizer.rb +6 -2
  70. data/lib/loggable_activity/services/base_payloads_builder.rb +14 -5
  71. data/lib/loggable_activity/services/destroy_payloads_builder.rb +2 -1
  72. data/lib/loggable_activity/services/payloads_builder.rb +12 -5
  73. data/lib/loggable_activity/services/update_payloads_builder.rb +34 -6
  74. data/lib/loggable_activity/version.rb +1 -1
  75. data/lib/loggable_activity.rb +51 -14
  76. data/lib/tasks/loggable_activity_tasks.rake +6 -0
  77. data/loggable_activity-0.5.0.gem +0 -0
  78. metadata +129 -109
  79. data/.document +0 -1
  80. data/.nojekyll +0 -1
  81. data/.rspec +0 -3
  82. data/CONSIDERTIONS.md +0 -129
  83. data/GETTING-STARTED.md +0 -119
  84. data/LICENSE.txt +0 -21
  85. data/PAYLOAD_EXAMPLE.md +0 -63
  86. data/ROADMAP.md +0 -23
  87. data/docs/LoggableActivity/Activity.html +0 -555
  88. data/docs/LoggableActivity/Configuration.html +0 -330
  89. data/docs/LoggableActivity/ConfigurationError.html +0 -148
  90. data/docs/LoggableActivity/DataOwner.html +0 -138
  91. data/docs/LoggableActivity/Encryption.html +0 -234
  92. data/docs/LoggableActivity/EncryptionError.html +0 -145
  93. data/docs/LoggableActivity/EncryptionKey.html +0 -351
  94. data/docs/LoggableActivity/Error.html +0 -145
  95. data/docs/LoggableActivity/Hooks.html +0 -759
  96. data/docs/LoggableActivity/Payload.html +0 -432
  97. data/docs/LoggableActivity/Services/BasePayloadsBuilder.html +0 -442
  98. data/docs/LoggableActivity/Services/DestroyPayloadsBuilder.html +0 -395
  99. data/docs/LoggableActivity/Services/PayloadsBuilder.html +0 -342
  100. data/docs/LoggableActivity/Services/UpdatePayloadsBuilder.html +0 -490
  101. data/docs/LoggableActivity/Services.html +0 -93
  102. data/docs/LoggableActivity.html +0 -102
  103. data/docs/created.rid +0 -14
  104. data/docs/css/fonts.css +0 -167
  105. data/docs/css/rdoc.css +0 -687
  106. data/docs/fonts/Lato-Light.ttf +0 -0
  107. data/docs/fonts/Lato-LightItalic.ttf +0 -0
  108. data/docs/fonts/Lato-Regular.ttf +0 -0
  109. data/docs/fonts/Lato-RegularItalic.ttf +0 -0
  110. data/docs/fonts/SourceCodePro-Bold.ttf +0 -0
  111. data/docs/fonts/SourceCodePro-Regular.ttf +0 -0
  112. data/docs/images/add.png +0 -0
  113. data/docs/images/arrow_up.png +0 -0
  114. data/docs/images/brick.png +0 -0
  115. data/docs/images/brick_link.png +0 -0
  116. data/docs/images/bug.png +0 -0
  117. data/docs/images/bullet_black.png +0 -0
  118. data/docs/images/bullet_toggle_minus.png +0 -0
  119. data/docs/images/bullet_toggle_plus.png +0 -0
  120. data/docs/images/date.png +0 -0
  121. data/docs/images/delete.png +0 -0
  122. data/docs/images/find.png +0 -0
  123. data/docs/images/loadingAnimation.gif +0 -0
  124. data/docs/images/macFFBgHack.png +0 -0
  125. data/docs/images/package.png +0 -0
  126. data/docs/images/page_green.png +0 -0
  127. data/docs/images/page_white_text.png +0 -0
  128. data/docs/images/page_white_width.png +0 -0
  129. data/docs/images/plugin.png +0 -0
  130. data/docs/images/ruby.png +0 -0
  131. data/docs/images/tag_blue.png +0 -0
  132. data/docs/images/tag_green.png +0 -0
  133. data/docs/images/transparent.png +0 -0
  134. data/docs/images/wrench.png +0 -0
  135. data/docs/images/wrench_orange.png +0 -0
  136. data/docs/images/zoom.png +0 -0
  137. data/docs/index.html +0 -99
  138. data/docs/js/darkfish.js +0 -97
  139. data/docs/js/navigation.js +0 -105
  140. data/docs/js/navigation.js.gz +0 -0
  141. data/docs/js/search.js +0 -110
  142. data/docs/js/search_index.js +0 -1
  143. data/docs/js/search_index.js.gz +0 -0
  144. data/docs/js/searcher.js +0 -229
  145. data/docs/js/searcher.js.gz +0 -0
  146. data/docs/table_of_contents.html +0 -617
  147. data/help/loggable_activity_help.txt +0 -19
  148. data/lib/generators/.DS_Store +0 -0
  149. data/lib/generators/loggable_activity/.DS_Store +0 -0
  150. data/lib/generators/loggable_activity/install_generator.rb +0 -109
  151. data/lib/generators/loggable_activity/templates/.DS_Store +0 -0
  152. data/lib/generators/loggable_activity/templates/binary_ids/create_loggable_activities.rb +0 -30
  153. data/lib/generators/loggable_activity/templates/config/locales/loggable_activity.en.yml +0 -36
  154. data/lib/generators/loggable_activity/templates/config/loggable_activity.yaml +0 -29
  155. data/lib/generators/loggable_activity/templates/loggable_activity.en.yaml +0 -36
  156. data/pkg/loggable_activity-0.1.35.gem +0 -0
  157. data/sig/loggable_activity.rbs +0 -4
  158. /data/{.rspec_status → app/assets/images/loggable_activity/.keep} +0 -0
  159. /data/lib/{generators/loggable_activity/templates → loggable_activity/concerns}/current_user.rb +0 -0
@@ -24,6 +24,7 @@ module LoggableActivity
24
24
 
25
25
  # Initializes attributes based on configuration.
26
26
  self.loggable_attrs = config&.fetch('loggable_attrs', []) || []
27
+ self.public_attrs = config&.fetch('public_attrs', []) || []
27
28
  self.relations = config&.fetch('relations', []) || []
28
29
  self.auto_log = config&.fetch('auto_log', []) || []
29
30
  self.fetch_record_name_from = config&.fetch('fetch_record_name_from', nil)
@@ -60,6 +61,10 @@ module LoggableActivity
60
61
  end
61
62
  end
62
63
 
64
+ def disable_hooks!
65
+ self.disable_hooks = true
66
+ end
67
+
63
68
  private
64
69
 
65
70
  # Logs an activity for the current action.
@@ -134,6 +139,7 @@ module LoggableActivity
134
139
  # Logs a create activity automatically if configured.
135
140
  def log_create_activity
136
141
  return unless hooks_enabled?
142
+ return if id.nil?
137
143
 
138
144
  log(:create) if self.class.auto_log.include?('create')
139
145
  end
@@ -159,13 +165,13 @@ module LoggableActivity
159
165
 
160
166
  # Returns the encrypted name of the actor.
161
167
  def encrypted_actor_name
162
- name = @actor.send(fetch_current_user_name_from)
168
+ name = @actor.send(fetch_actor_name_from)
163
169
  ::LoggableActivity::Encryption.encrypt(name, actor_secret_key)
164
170
  end
165
171
 
166
172
  # Reads the field to feetch the record name from.
167
- def fetch_current_user_name_from
168
- ::LoggableActivity::Configuration.fetch_current_user_name_from
173
+ def fetch_actor_name_from
174
+ ::LoggableActivity::Configuration.fetch_actor_name_from
169
175
  end
170
176
 
171
177
  # Returns the action key for the current action.
@@ -188,25 +194,14 @@ module LoggableActivity
188
194
  encryption_key_for_record(@actor)&.secret_key
189
195
  end
190
196
 
191
- # Returns the display name of the actor.
192
- def actor__name_field
193
- Rails.application.config.loggable_activity.actor_display_name || "id: #{@actor.id}, class: #{@actor.class.name}"
194
- end
195
-
196
- # Returns the model name of the current user.
197
- def current_user_model?
198
- Rails.application.config.loggable_activity.current_user_model_name == self.class.name
199
- end
200
-
201
197
  class_methods do
202
198
  # The loggable_attrs attribute is used read the configuration for the model that included LoggableActivity::Hooks.
203
- attr_accessor :loggable_attrs, :relations, :auto_log, :fetch_record_name_from, :route
199
+ attr_accessor :loggable_attrs, :relations, :auto_log, :fetch_record_name_from, :route, :public_attrs
204
200
 
205
201
  # Convert the model name and name space in to 'base_action'.
206
202
  def base_action
207
203
  name.downcase.gsub('::', '/')
208
204
  end
209
-
210
205
  end
211
206
  end
212
207
  end
@@ -7,7 +7,6 @@ module LoggableActivity
7
7
  # When the record is deleted, the encryption key for the payload is also deleted.
8
8
  # Payloads come in different types, each serving a specific purpose.
9
9
  class Payload < ActiveRecord::Base
10
- self.table_name = 'loggable_payloads'
11
10
  validates :related_to_activity_as, presence: true
12
11
 
13
12
  # Associations
@@ -63,14 +62,14 @@ module LoggableActivity
63
62
  #
64
63
  def attrs
65
64
  return deleted_attrs if record.nil?
66
-
65
+
67
66
  case related_to_activity_as
68
67
  when *DECRYPT_ATTRS_TYPES
69
- decrypted_attrs
68
+ decrypted_attrs.merge(public_attrs: public_attrs)
70
69
  when *DECRYPT_UPDATE_ATTRS_TYPES
71
- decrypted_update_attrs
70
+ decrypted_update_attrs + public_attrs['changes']
72
71
  else
73
- {}
72
+ { public_attrs: public_attrs }
74
73
  end
75
74
  end
76
75
 
@@ -93,7 +92,7 @@ module LoggableActivity
93
92
  #
94
93
  # @return [String] The display name for the record.
95
94
  def record_display_name
96
- return I18n.t('loggable.activity.deleted') if deleted?
95
+ return I18n.t('loggable_activity.activity.deleted') if deleted?
97
96
 
98
97
  ::LoggableActivity::Encryption.decrypt(encrypted_record_name, secret_key)
99
98
  end
@@ -118,7 +117,7 @@ module LoggableActivity
118
117
  #
119
118
  # @return [Hash] The hash with deleted attributes.
120
119
  def deleted_attrs
121
- encrypted_attrs.transform_values! { I18n.t('loggable.activity.deleted') }
120
+ encrypted_attrs.transform_keys(&:to_sym).transform_values! { I18n.t('loggable_activity.activity.deleted') }
122
121
  end
123
122
 
124
123
  # Decrypts the 'from' and 'to' attributes in the update payload.
@@ -139,7 +138,7 @@ module LoggableActivity
139
138
  change.to_h do |key, value|
140
139
  from = decrypt_attr(value['from'])
141
140
  to = decrypt_attr(value['to'])
142
- [key, { from:, to: }]
141
+ [key.to_sym, { from:, to: }]
143
142
  end
144
143
  end
145
144
 
@@ -147,9 +146,7 @@ module LoggableActivity
147
146
  #
148
147
  # @return [Hash] The decrypted attributes.
149
148
  def decrypted_attrs
150
- encrypted_attrs.each do |key, value|
151
- encrypted_attrs[key] = decrypt_attr(value)
152
- end
149
+ encrypted_attrs.transform_keys(&:to_sym).transform_values { |value| decrypt_attr(value) }
153
150
  end
154
151
 
155
152
  # Decrypts a single attribute.
@@ -1,9 +1,13 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module LoggableActivity
4
+ # This module is responsible for sanitizing activities.
5
+ # When an encryption keys deleted_at field is set, the key is deleted.
2
6
  module Sanitizer
3
- def self.run
7
+ def self.run
4
8
  ::LoggableActivity::EncryptionKey.where('delete_at < ?', DateTime.now).find_in_batches do |batch|
5
9
  batch.each(&:delete)
6
10
  end
7
11
  end
8
12
  end
9
- end
13
+ end
@@ -10,6 +10,7 @@ module LoggableActivity
10
10
  @record = record
11
11
  @payloads = payloads
12
12
  @loggable_attrs = record.class.loggable_attrs
13
+ @public_attrs = record.class.public_attrs
13
14
  # @relation_config = record.relation_config
14
15
  @relations = record.class.relations
15
16
  @auto_log = record.class.auto_log
@@ -67,19 +68,21 @@ module LoggableActivity
67
68
  return if encryption_key.deleted?
68
69
 
69
70
  secret_key = encryption_key.secret_key
70
- encrypted_attrs = encrypt_attributes(record, secret_key)
71
+ encrypted_attrs = encrypt_attributes(record, secret_key, options)
72
+ public_attrs = public_attributes(record)
71
73
 
72
74
  build_payload(
73
75
  record,
74
76
  encryption_key,
75
77
  encrypted_attrs,
78
+ public_attrs,
76
79
  options
77
80
  )
78
81
  { encryption_key:, encrypted_attrs: }
79
82
  end
80
83
 
81
84
  # Builds the payload for a record
82
- def build_payload(record, encryption_key, encrypted_attrs, options = {})
85
+ def build_payload(record, encryption_key, encrypted_attrs, public_attrs, options = {})
83
86
  return if encryption_key.deleted?
84
87
 
85
88
  related_to_activity_as = options[:related_to_activity_as]
@@ -96,7 +99,8 @@ module LoggableActivity
96
99
  related_to_activity_as:,
97
100
  route: record.class.route,
98
101
  current_payload:,
99
- data_owner:
102
+ data_owner:,
103
+ public_attrs:
100
104
  )
101
105
  unless payload.valid?
102
106
  error_message = "Payload validation failed: #{payload.errors.full_messages.join(', ')}"
@@ -107,8 +111,9 @@ module LoggableActivity
107
111
  end
108
112
 
109
113
  # Encrypts the attributes for the record.
110
- def encrypt_attributes(record, secret_key)
111
- encrypt_attrs(record.attributes, record.class.loggable_attrs, secret_key)
114
+ def encrypt_attributes(record, secret_key, options = {})
115
+ loggable_attrs = options[:loggable_attrs] || record.class.loggable_attrs
116
+ encrypt_attrs(record.attributes, loggable_attrs, secret_key)
112
117
  end
113
118
 
114
119
  # Encrypt one attributes for only loggable_attrs, configured
@@ -118,6 +123,10 @@ module LoggableActivity
118
123
  end
119
124
  end
120
125
 
126
+ def public_attributes(record)
127
+ record.attributes.slice(*record.class.public_attrs)
128
+ end
129
+
121
130
  # Encrypt a single attribute.
122
131
  def encrypt_attr(value, secret_key)
123
132
  ::LoggableActivity::Encryption.encrypt(value, secret_key)
@@ -112,12 +112,13 @@ module LoggableActivity
112
112
  @payloads << ::LoggableActivity::Payload.new(
113
113
  encryption_key:,
114
114
  record_id: nil,
115
- record_type: @record.class.name,
115
+ record_type: record.class.name,
116
116
  encrypted_record_name:,
117
117
  encrypted_attrs:,
118
118
  related_to_activity_as:,
119
119
  data_owner: true,
120
120
  route: '',
121
+ public_attrs: public_attributes(record),
121
122
  current_payload: true
122
123
  )
123
124
  encryption_key
@@ -57,10 +57,10 @@ module LoggableActivity
57
57
  def build_has_many_payloads(relation_config)
58
58
  relation = (relation_config['has_many']).to_s
59
59
  records = @record.send(relation)
60
- data_owner = relation_config['data_owner']
60
+ data_owner = relation_config['data_owner'] || false
61
61
  options = { related_to_activity_as: 'has_many_payload', current_payload: true, data_owner: }
62
62
  records.each do |record|
63
- record.disable_hooks = true
63
+ record.disable_hooks!
64
64
  build_encrypted_payload(record, options)
65
65
  end
66
66
  end
@@ -71,19 +71,26 @@ module LoggableActivity
71
71
  record = @record.send(relation)
72
72
  return if record.nil?
73
73
 
74
- data_owner = relation_config['data_owner']
74
+ record.disable_hooks!
75
+
76
+ data_owner = relation_config['data_owner'] || false
75
77
  options =
76
- { related_to_activity_as: 'has_one_payload', current_payload: true, data_owner: }
78
+ {
79
+ related_to_activity_as: 'has_one_payload',
80
+ current_payload: true, data_owner:,
81
+ loggable_attrs: relation_config['loggable_attrs']
82
+ }
77
83
 
78
84
  build_encrypted_payload(record, options)
79
85
  end
80
86
 
87
+ # Builds the payload for a belongs_to relation.
81
88
  def build_belongs_to_payload(relation_config)
82
89
  relation = (relation_config['belongs_to']).to_s
83
90
  record = @record.send(relation)
84
91
  return if record.nil?
85
92
 
86
- data_owner = relation_config['data_owner']
93
+ data_owner = relation_config['data_owner'] || false
87
94
 
88
95
  if data_owner
89
96
  encryption_key = encryption_key_for_record(@record)
@@ -16,6 +16,7 @@ module LoggableActivity
16
16
  # Builds the primary payload.
17
17
  def build_primary_update_payload
18
18
  previous_values, current_values = saved_changes(@record)
19
+ public_attrs = updated_public_attrs(current_values.slice(*@public_attrs), previous_values.slice(*@public_attrs))
19
20
  previous_values = previous_values.slice(*@loggable_attrs)
20
21
  current_values = current_values.slice(*@loggable_attrs)
21
22
  options = { related_to_activity_as: 'primary_update_payload', current_payload: true, data_owner: true }
@@ -24,6 +25,7 @@ module LoggableActivity
24
25
  @record,
25
26
  current_values,
26
27
  previous_values,
28
+ public_attrs,
27
29
  options
28
30
  )
29
31
  end
@@ -54,7 +56,7 @@ module LoggableActivity
54
56
  relation_id = "#{relation_config['belongs_to']}_id"
55
57
  model_class_name = relation_config['model']
56
58
  model_class = model_class_name.constantize
57
- data_owner = relation_config['data_owner']
59
+ data_owner = relation_config['data_owner'] || false
58
60
 
59
61
  model_ids = saved_changes(@record).map { |hash| hash[relation_id] }
60
62
 
@@ -92,21 +94,28 @@ module LoggableActivity
92
94
  loggable_attrs = relation_config['loggable_attrs']
93
95
  return if previous_values == current_values
94
96
 
97
+ public_attributes = relation_config['public_attrs']
98
+ public_attrs = updated_public_attrs(
99
+ current_values.slice(*public_attributes),
100
+ previous_values.slice(*public_attributes)
101
+ )
102
+
95
103
  previous_values = previous_values.slice(*loggable_attrs)
96
- data_owner = relation_config['data_owner']
104
+ data_owner = relation_config['data_owner'] || false
97
105
  options = { related_to_activity_as: 'has_many_update_payload', current_payload: true, data_owner: }
98
106
 
99
107
  build_encrypted_update_payload(
100
108
  record,
101
109
  current_values,
102
110
  previous_values,
111
+ public_attrs,
103
112
  options
104
113
  )
105
114
  end
106
115
 
107
116
  def build_has_many_create_payload(relation_config, record)
108
117
  record.disable_hooks = true
109
- data_owner = relation_config['data_owner']
118
+ data_owner = relation_config['data_owner'] || false
110
119
  options =
111
120
  { related_to_activity_as: 'has_many_create_payload', current_payload: true, data_owner: }
112
121
  build_encrypted_payload(record, options)
@@ -119,18 +128,24 @@ module LoggableActivity
119
128
  return nil if record.nil?
120
129
 
121
130
  previous_values, current_values = changes_to_save(record)
122
- loggable_attrs = record.class.loggable_attrs
131
+ loggable_attrs = relation_config['loggable_attrs']
123
132
  return if previous_values == current_values
124
133
 
134
+ public_attrs = updated_public_attrs(
135
+ current_values.slice(*record.class.public_attrs),
136
+ previous_values.slice(*record.class.public_attrs)
137
+ )
138
+
125
139
  previous_values = previous_values.slice(*loggable_attrs)
126
140
  current_values = current_values.slice(*loggable_attrs)
127
- data_owner = relation_config['data_owner']
141
+ data_owner = relation_config['data_owner'] || false
128
142
  options = { related_to_activity_as: 'has_one_update_payload', current_payload: true, data_owner: }
129
143
 
130
144
  build_encrypted_update_payload(
131
145
  record,
132
146
  current_values,
133
147
  previous_values,
148
+ public_attrs,
134
149
  options
135
150
  )
136
151
  end
@@ -148,8 +163,20 @@ module LoggableActivity
148
163
  { changes: }
149
164
  end
150
165
 
166
+ def updated_public_attrs(current_values, previous_values)
167
+ changes = []
168
+
169
+ previous_values.each do |key, from_value|
170
+ from = from_value
171
+ to_value = current_values[key]
172
+ to = to_value
173
+ changes << { key => { from:, to: } }
174
+ end
175
+ { changes: }
176
+ end
177
+
151
178
  # Builds the encrypted update payload for a record.
152
- def build_encrypted_update_payload(record, current_values, previous_values, options = {})
179
+ def build_encrypted_update_payload(record, current_values, previous_values, public_attrs, options = {})
153
180
  encryption_key = ::LoggableActivity::EncryptionKey.for_record(record)
154
181
 
155
182
  encrypted_attrs = encrypted_update_attrs(
@@ -162,6 +189,7 @@ module LoggableActivity
162
189
  record,
163
190
  encryption_key,
164
191
  encrypted_attrs,
192
+ public_attrs,
165
193
  options
166
194
  )
167
195
  end
@@ -3,5 +3,5 @@
3
3
  # Version of the gem
4
4
  module LoggableActivity
5
5
  # Version
6
- VERSION = '0.2.1'
6
+ VERSION = '0.5.4'
7
7
  end
@@ -1,16 +1,53 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'loggable_activity/version'
4
- require_relative 'loggable_activity/activity'
5
- require_relative 'loggable_activity/configuration'
6
- require_relative 'loggable_activity/encryption'
7
- require_relative 'loggable_activity/encryption_key'
8
- require_relative 'loggable_activity/data_owner'
9
- require_relative 'loggable_activity/hooks'
10
- require_relative 'loggable_activity/payload'
11
- require_relative 'loggable_activity/error'
12
- require_relative 'loggable_activity/sanitizer'
13
- require_relative 'loggable_activity/services/base_payloads_builder'
14
- require_relative 'loggable_activity/services/payloads_builder'
15
- require_relative 'loggable_activity/services/update_payloads_builder'
16
- require_relative 'loggable_activity/services/destroy_payloads_builder'
3
+ require 'loggable_activity/version'
4
+ require 'loggable_activity/engine'
5
+ require 'loggable_activity/hooks'
6
+ require 'loggable_activity/activity'
7
+ require 'loggable_activity/configuration'
8
+ require 'loggable_activity/encryption'
9
+ require 'loggable_activity/encryption_key'
10
+ require 'loggable_activity/data_owner'
11
+ require 'loggable_activity/payload'
12
+ require 'loggable_activity/error'
13
+ require 'loggable_activity/sanitizer'
14
+ require 'loggable_activity/services/base_payloads_builder'
15
+ require 'loggable_activity/services/payloads_builder'
16
+ require 'loggable_activity/services/update_payloads_builder'
17
+ require 'loggable_activity/services/destroy_payloads_builder'
18
+ require 'loggable_activity/concerns/current_user'
19
+ require 'kaminari'
20
+
21
+ # LoggableActivity
22
+ #
23
+ # The LoggableActivity module provides a comprehensive solution for tracking and logging
24
+ # user activities within a Rails application. It offers a flexible and extensible framework
25
+ # for capturing, encrypting, and storing activity data, ensuring that sensitive information
26
+ # is handled securely.
27
+ #
28
+ # Features:
29
+ # - Activity Logging: Captures user actions across the application, providing insights into user behavior.
30
+ # - Encryption: Ensures that logged data is encrypted, safeguarding user privacy and data security.
31
+ # - Configuration: Offers customizable options to tailor the logging mechanism to specific application needs.
32
+ # - Extensibility: Designed to be extensible, allowing developers to add custom logging capabilities as needed.
33
+ #
34
+ # Components:
35
+ # - Hooks: Mechanisms to hook into application events for logging.
36
+ # - Activity: The core model representing logged activities.
37
+ # - Configuration: Manages configuration settings for the logging mechanism.
38
+ # - Encryption: Handles the encryption and decryption of logged data.
39
+ # - DataOwner: Identifies the owner of the logged data.
40
+ # - Payload: Structures the data to be logged.
41
+ # - Error: Defines custom error types for the logging process.
42
+ # - Sanitizer: Provides data sanitization utilities.
43
+ # - Services: Contains services for building and managing payloads.
44
+ # - Concerns: Includes concerns for integrating with application models and controllers.
45
+ #
46
+ # Usage:
47
+ # To use LoggableActivity, include it in your Rails application and configure it according to your needs.
48
+ #
49
+ # This module is designed to be both powerful and easy to integrate, providing a solid foundation for activity logging.
50
+ module LoggableActivity
51
+ mattr_accessor :actor_class
52
+ mattr_accessor :config_file_path
53
+ end
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ # desc "Explaining what the task does"
4
+ # task :loggable_activity do
5
+ # # Task goes here
6
+ # end
Binary file