lesli_audit 1.1.0 → 1.1.2

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 (41) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +6 -1
  3. data/app/assets/stylesheets/lesli_audit/application.css +366 -35
  4. data/app/controllers/lesli_audit/accounts_controller.rb +7 -3
  5. data/app/controllers/lesli_audit/logs_controller.rb +3 -8
  6. data/app/controllers/lesli_audit/visitors_controller.rb +1 -1
  7. data/app/interfaces/lesli_audit/logger_interface.rb +56 -59
  8. data/app/jobs/lesli_audit/retention_cleanup_job.rb +9 -0
  9. data/app/models/concerns/lesli_audit/append_only.rb +12 -0
  10. data/app/models/lesli_audit/account.rb +26 -10
  11. data/app/models/lesli_audit/account_device.rb +3 -1
  12. data/app/models/lesli_audit/account_log.rb +12 -7
  13. data/app/models/lesli_audit/account_request.rb +3 -1
  14. data/app/models/lesli_audit/user_journal.rb +16 -3
  15. data/app/models/lesli_audit/user_log.rb +12 -3
  16. data/app/models/lesli_audit/user_request.rb +7 -3
  17. data/app/services/lesli_audit/activity_audit.rb +130 -0
  18. data/app/services/lesli_audit/request_service.rb +2 -35
  19. data/app/services/lesli_audit/retention_cleanup.rb +146 -0
  20. data/app/services/lesli_audit/user_agent_parser.rb +51 -0
  21. data/app/services/lesli_audit/user_service.rb +18 -16
  22. data/app/services/lesli_audit/visitor_service.rb +22 -49
  23. data/app/views/lesli_audit/logs/show.html.erb +14 -8
  24. data/app/views/lesli_audit/partials/_navigation.html.erb +1 -1
  25. data/app/views/lesli_audit/users/index.html.erb +67 -64
  26. data/app/views/lesli_audit/visitors/index.html.erb +126 -80
  27. data/config/routes.rb +3 -2
  28. data/db/migrate/v1.0/0501000110_create_lesli_audit_accounts.rb +14 -1
  29. data/db/migrate/v1.0/0501110110_create_lesli_audit_account_logs.rb +10 -6
  30. data/db/migrate/v1.0/0501110210_create_lesli_audit_account_devices.rb +10 -7
  31. data/db/migrate/v1.0/0501110310_create_lesli_audit_account_requests.rb +10 -7
  32. data/db/migrate/v1.0/0501120110_create_lesli_audit_user_logs.rb +11 -7
  33. data/db/migrate/v1.0/0501120210_create_lesli_audit_user_journals.rb +19 -8
  34. data/db/migrate/v1.0/0501120310_create_lesli_audit_user_requests.rb +13 -10
  35. data/db/seed/devices.rb +1 -1
  36. data/db/seed/requests.rb +3 -3
  37. data/lib/lesli_audit/engine.rb +1 -6
  38. data/lib/lesli_audit/version.rb +2 -2
  39. data/lib/tasks/lesli_audit_tasks.rake +12 -4
  40. data/readme.md +127 -50
  41. metadata +14 -4
@@ -33,14 +33,17 @@ Building a better future, one line of code at a time.
33
33
  class CreateLesliAuditAccountDevices < ActiveRecord::Migration[8.1]
34
34
  def change
35
35
  create_table :lesli_audit_account_devices do |t|
36
- t.string :agent_platform
37
- t.string :agent_browser
38
- t.string :agent_device
39
- t.integer :agent_count
40
- t.date :created_at
36
+ t.string :agent_platform, null: false
37
+ t.string :agent_browser, null: false
38
+ t.string :agent_device, null: false
39
+ t.bigint :agent_count, null: false, default: 0
40
+ t.date :date, null: false
41
+ t.timestamps null: false
41
42
  end
42
43
 
43
- add_reference(:lesli_audit_account_devices, :account, foreign_key: { to_table: :lesli_audit_accounts })
44
- add_index(:lesli_audit_account_devices, %i[agent_platform agent_browser agent_device created_at account_id], unique: true, name: "lesli_audit_devices_index")
44
+ add_reference(:lesli_audit_account_devices, :account, null: false, foreign_key: { to_table: :lesli_audit_accounts, on_delete: :cascade })
45
+ add_check_constraint(:lesli_audit_account_devices, "agent_count >= 0", name: "lesli_audit_account_devices_agent_count_nonnegative")
46
+ add_index(:lesli_audit_account_devices, %i[account_id date agent_platform agent_browser agent_device], unique: true, name: "lesli_audit_devices_index")
47
+ add_index(:lesli_audit_account_devices, :date, name: "index_lesli_audit_account_devices_on_date")
45
48
  end
46
49
  end
@@ -30,15 +30,18 @@ Building a better future, one line of code at a time.
30
30
  // ·
31
31
  =end
32
32
 
33
- class CreateLesliAuditAccountRequests < ActiveRecord::Migration[6.0]
33
+ class CreateLesliAuditAccountRequests < ActiveRecord::Migration[8.1]
34
34
  def change
35
35
  create_table :lesli_audit_account_requests do |t|
36
- t.string :request_controller
37
- t.string :request_action
38
- t.integer :request_count
39
- t.date :created_at
36
+ t.string :request_controller, null: false
37
+ t.string :request_action, null: false
38
+ t.bigint :request_count, null: false, default: 0
39
+ t.date :date, null: false
40
+ t.timestamps null: false
40
41
  end
41
- add_reference(:lesli_audit_account_requests, :account, foreign_key: { to_table: :lesli_audit_accounts })
42
- add_index(:lesli_audit_account_requests, %i[request_controller request_action created_at account_id], unique: true, name: "lesli_audit_account_requests_index")
42
+ add_reference(:lesli_audit_account_requests, :account, null: false, foreign_key: { to_table: :lesli_audit_accounts, on_delete: :cascade })
43
+ add_check_constraint(:lesli_audit_account_requests, "request_count >= 0", name: "lesli_audit_account_requests_request_count_nonnegative")
44
+ add_index(:lesli_audit_account_requests, %i[account_id date request_controller request_action], unique: true, name: "lesli_audit_account_requests_index")
45
+ add_index(:lesli_audit_account_requests, :date, name: "index_lesli_audit_account_requests_on_date")
43
46
  end
44
47
  end
@@ -30,25 +30,29 @@ Building a better future, one line of code at a time.
30
30
  // ·
31
31
  =end
32
32
 
33
- class CreateLesliAuditUserLogs < ActiveRecord::Migration[6.0]
33
+ class CreateLesliAuditUserLogs < ActiveRecord::Migration[8.1]
34
34
  def change
35
35
  create_table :lesli_audit_user_logs do |t|
36
36
  t.string :engine
37
37
  t.string :source
38
38
  t.string :action
39
39
 
40
- t.string :operation
41
- t.string :description
42
- t.bigint :session_id
40
+ t.string :operation, null: false
41
+ t.text :description
42
+ t.string :session_id
43
+ t.string :actor_uid
43
44
 
44
45
  # Polymorphic subject
45
46
  t.string :subject_type
46
47
  t.bigint :subject_id
47
48
 
48
- t.timestamps
49
+ t.timestamps null: false
49
50
  end
50
51
 
51
- add_reference(:lesli_audit_user_logs, :user, foreign_key: { to_table: :lesli_users })
52
- add_reference(:lesli_audit_user_logs, :account, foreign_key: { to_table: :lesli_audit_accounts })
52
+ add_reference(:lesli_audit_user_logs, :user, null: true, foreign_key: { to_table: :lesli_users, on_delete: :nullify })
53
+ add_reference(:lesli_audit_user_logs, :account, null: false, foreign_key: { to_table: :lesli_audit_accounts, on_delete: :cascade })
54
+ add_index(:lesli_audit_user_logs, %i[account_id created_at], name: "index_lesli_audit_user_logs_on_account_and_created_at")
55
+ add_index(:lesli_audit_user_logs, %i[user_id created_at], name: "index_lesli_audit_user_logs_on_user_and_created_at")
56
+ add_index(:lesli_audit_user_logs, :created_at, name: "index_lesli_audit_user_logs_on_created_at")
53
57
  end
54
58
  end
@@ -30,16 +30,27 @@ Building a better future, one line of code at a time.
30
30
  // ·
31
31
  =end
32
32
 
33
- class CreateLesliAuditUserJournals < ActiveRecord::Migration[6.0]
33
+ class CreateLesliAuditUserJournals < ActiveRecord::Migration[8.1]
34
34
  def change
35
35
  create_table :lesli_audit_user_journals do |t|
36
- t.string :request_controller
37
- t.string :request_action
38
- t.date :date, index: true
39
- t.bigint :session_id
40
- t.timestamps
36
+ t.string :event_uid, null: false
37
+ t.string :request_controller
38
+ t.string :request_action
39
+ t.date :date, null: false
40
+ t.string :session_id
41
+ t.string :agent_platform
42
+ t.string :agent_browser
43
+ t.string :agent_device
44
+ t.boolean :analytics_enabled, null: false, default: true
45
+ t.boolean :retain, null: false, default: true
46
+ t.datetime :processed_at
47
+ t.timestamps null: false
41
48
  end
42
- add_reference(:lesli_audit_user_journals, :user, foreign_key: { to_table: :lesli_users })
43
- add_reference(:lesli_audit_user_journals, :account, foreign_key: { to_table: :lesli_audit_accounts })
49
+ add_reference(:lesli_audit_user_journals, :user, null: true, foreign_key: { to_table: :lesli_users, on_delete: :nullify })
50
+ add_reference(:lesli_audit_user_journals, :account, null: false, foreign_key: { to_table: :lesli_audit_accounts, on_delete: :cascade })
51
+ add_index(:lesli_audit_user_journals, %i[account_id date], name: "index_lesli_audit_user_journals_on_account_and_date")
52
+ add_index(:lesli_audit_user_journals, %i[account_id event_uid], unique: true, name: "lesli_audit_user_journals_event_index")
53
+ add_index(:lesli_audit_user_journals, :date, name: "index_lesli_audit_user_journals_on_date")
54
+ add_index(:lesli_audit_user_journals, :processed_at, name: "index_lesli_audit_user_journals_on_processed_at")
44
55
  end
45
56
  end
@@ -30,18 +30,21 @@ Building a better future, one line of code at a time.
30
30
  // ·
31
31
  =end
32
32
 
33
- class CreateLesliAuditUserRequests < ActiveRecord::Migration[6.0]
33
+ class CreateLesliAuditUserRequests < ActiveRecord::Migration[8.1]
34
34
  def change
35
35
  create_table :lesli_audit_user_requests do |t|
36
- t.string :request_controller
37
- t.string :request_action
38
- t.integer :request_count
39
- t.date :date, index: true
40
- t.bigint :session_id
41
- t.timestamps
36
+ t.string :request_controller, null: false
37
+ t.string :request_action, null: false
38
+ t.bigint :request_count, null: false, default: 0
39
+ t.date :date, null: false
40
+ t.string :session_id
41
+ t.timestamps null: false
42
42
  end
43
- add_reference(:lesli_audit_user_requests, :user, foreign_key: { to_table: :lesli_users })
44
- add_reference(:lesli_audit_user_requests, :account, foreign_key: { to_table: :lesli_audit_accounts })
45
- add_index(:lesli_audit_user_requests, %i[request_controller request_action date user_id session_id], unique: true, name: "lesli_audit_user_requests_index")
43
+ add_reference(:lesli_audit_user_requests, :user, null: false, foreign_key: { to_table: :lesli_users, on_delete: :cascade })
44
+ add_reference(:lesli_audit_user_requests, :account, null: false, foreign_key: { to_table: :lesli_audit_accounts, on_delete: :cascade })
45
+ add_check_constraint(:lesli_audit_user_requests, "request_count >= 0", name: "lesli_audit_user_requests_request_count_nonnegative")
46
+ add_index(:lesli_audit_user_requests, %i[account_id user_id session_id date request_controller request_action], unique: true, name: "lesli_audit_user_requests_index")
47
+ add_index(:lesli_audit_user_requests, %i[account_id date], name: "index_lesli_audit_user_requests_on_account_and_date")
48
+ add_index(:lesli_audit_user_requests, :date, name: "index_lesli_audit_user_requests_on_date")
46
49
  end
47
50
  end
data/db/seed/devices.rb CHANGED
@@ -68,7 +68,7 @@ current_user = Lesli::User.first
68
68
  :agent_platform => platform,
69
69
  :agent_browser => browser,
70
70
  :agent_device => device,
71
- :created_at => date,
71
+ :date => date,
72
72
  )
73
73
  end
74
74
  end
data/db/seed/requests.rb CHANGED
@@ -58,7 +58,7 @@ session = current_user.sessions.first
58
58
  ).find_or_create_by(
59
59
  :request_controller => controller,
60
60
  :request_action => "show",
61
- :created_at => date,
61
+ :date => date,
62
62
  )
63
63
 
64
64
  current_user.account.audit.user_requests.create_with(
@@ -66,8 +66,8 @@ session = current_user.sessions.first
66
66
  ).find_or_create_by(
67
67
  :request_controller => controller,
68
68
  :request_action => "show",
69
- :created_at => date,
70
- :session => session,
69
+ :date => date,
70
+ :session_id => session&.id,
71
71
  :user => current_user
72
72
  )
73
73
  end
@@ -1,12 +1,7 @@
1
- require "useragent"
2
1
  module LesliAudit
3
2
  class Engine < ::Rails::Engine
4
3
  isolate_namespace LesliAudit
5
-
6
- initializer :lesli_admin do |app|
7
-
8
- # register assets manifest
9
- config.assets.precompile += %w[lesli_audit_manifest.js]
4
+ initializer :lesli_audit do |app|
10
5
 
11
6
  app.config.assets.paths << root.join("app", "javascript").to_s
12
7
 
@@ -1,4 +1,4 @@
1
1
  module LesliAudit
2
- VERSION = "1.1.0"
3
- BUILD = "1778638613"
2
+ VERSION = "1.1.2"
3
+ BUILD = "1792716699"
4
4
  end
@@ -1,4 +1,12 @@
1
- # desc "Explaining what the task does"
2
- # task :lesli_audit do
3
- # # Task goes here
4
- # end
1
+ namespace :lesli_audit do
2
+ namespace :retention do
3
+ desc "Delete expired LesliAudit data using the configured retention policy"
4
+ task cleanup: :environment do
5
+ deleted = LesliAudit::RetentionCleanup.call
6
+
7
+ deleted.each do |table, count|
8
+ puts "#{table}: #{count} deleted"
9
+ end
10
+ end
11
+ end
12
+ end
data/readme.md CHANGED
@@ -1,14 +1,15 @@
1
1
  <div align="center">
2
- <img width="100" alt="LesliAudit logo" src="./app/assets/images/lesli_audit/audit-logo.svg" />
3
- <h3 align="center">Activity, logs, security and more... for the Lesli Framework.</h3>
2
+ <h1 align="center">
3
+ <img width="100" alt="LesliAudit" src="./app/assets/images/lesli_audit/audit-logo.svg" />
4
+ </h1>
5
+ <h3 align="center">Audit trails and analytics for the Lesli Framework.</h3>
4
6
  </div>
5
7
 
6
8
  <br />
7
- <hr/>
8
9
 
9
10
  <div align="center">
10
- <a target="_blank" href="https://github.com/LesliTech/LesliAudit/actions">
11
- <img alt="Tests passing" src="https://img.shields.io/badge/Tests-passing-green?style=for-the-badge&logo=github">
11
+ <a target="_blank" href="https://github.com/LesliTech/LesliAudit/actions/workflows/lesli-ci-engine.yaml">
12
+ <img alt="LesliAudit test status" src="https://img.shields.io/github/actions/workflow/status/LesliTech/LesliAudit/lesli-ci-engine.yaml?branch=master&style=for-the-badge&logo=github&label=tests">
12
13
  </a>
13
14
  <a target="_blank" href="https://rubygems.org/gems/lesli_audit">
14
15
  <img alt="Gem Version" src="https://img.shields.io/gem/v/lesli_audit?style=for-the-badge&logo=ruby">
@@ -16,83 +17,162 @@
16
17
  <a target="_blank" href="https://codecov.io/github/LesliTech/LesliAudit">
17
18
  <img alt="Codecov" src="https://img.shields.io/codecov/c/github/LesliTech/LesliAudit?style=for-the-badge&logo=codecov">
18
19
  </a>
20
+ <a target="_blank" href="https://sonarcloud.io/project/overview?id=LesliTech_LesliAudit">
21
+ <img alt="Sonar Quality Gate" src="https://img.shields.io/sonar/quality_gate/LesliTech_LesliAudit?server=https%3A%2F%2Fsonarcloud.io&style=for-the-badge&logo=sonarqubecloud&label=Quality">
22
+ </a>
19
23
  </div>
20
24
 
21
- <hr/>
22
25
  <br />
23
26
 
24
27
  <div align="center">
25
28
  <img
26
29
  style="width:100%;max-width:800px;border-radius:6px;"
27
- alt="Lesli screenshot" src="./docs/images/screenshot.png" />
30
+ alt="LesliAudit activity and request history"
31
+ src="./docs/images/screenshot.png" />
28
32
  </div>
29
33
 
34
+ ---
35
+
36
+ <br />
37
+
38
+ ## Introduction
39
+
40
+ LesliAudit is the official audit trail and analytics engine for the [Lesli Framework](https://github.com/LesliTech/Lesli).
41
+
42
+ It records account activity and provides administrators with searchable operational history and usage insights.
43
+
30
44
  <br />
31
- <hr/>
45
+
46
+ ## Features
47
+
48
+ - Account activity and audit logs
49
+ - Request and navigation history
50
+ - Request, device, and authenticated-user analytics
51
+ - Direct account and authenticated-user request counters
52
+ - Configurable batched data retention
53
+ - Normalized browser, platform, and device categories
54
+ - Detailed views for investigating recorded activity
55
+
56
+ Activity logs are explicit append-only business or security events. They are
57
+ separate from request analytics: user requests are grouped counters, while
58
+ user journals are individual normalized HTTP request events.
59
+
32
60
  <br />
33
61
 
34
- ### Installation
62
+ ## Try LesliAudit
63
+
64
+ - [Try the online demo](https://demo.lesli.dev/)
65
+ - [Run the Docker demo](https://github.com/LesliTech/lesli-docker-demo)
66
+
67
+ <br />
68
+
69
+ ## Quick Start
70
+
71
+ ### Requirements
72
+
73
+ - Ruby 3.x and Rails `~> 8.1`
74
+ - A Rails application with [Lesli](https://rubygems.org/gems/lesli) `~> 5.1.0`
75
+ - SQLite by default, or PostgreSQL when preferred by the host application
76
+
77
+ ### Install LesliAudit
78
+
79
+ Add the engine to the host Rails application and prepare its database:
35
80
 
36
81
  ```shell
37
- # Add LesliAudit engine gem
38
82
  bundle add lesli_audit
83
+ bin/rails lesli:db:prepare
84
+ ```
85
+
86
+ ### Mount the engine
39
87
 
40
- # Setup & initialize the database
41
- rake lesli:db:setup
88
+ Applications using Lesli's standard router mount LesliAudit automatically at `/audit`:
89
+
90
+ ```ruby
91
+ # config/routes.rb
92
+ Rails.application.routes.draw do
93
+ Lesli::Router.mount(self)
94
+ end
42
95
  ```
43
96
 
97
+ If the application does not use the standard Lesli router, mount the engine directly:
98
+
44
99
  ```ruby
45
- # Load LesliAudit engine
100
+ # config/routes.rb
46
101
  Rails.application.routes.draw do
47
102
  mount LesliAudit::Engine => "/audit"
48
103
  end
49
104
  ```
50
105
 
51
- <br />
52
- <hr/>
106
+ Start Rails and visit [http://127.0.0.1:3000/audit](http://127.0.0.1:3000/audit):
107
+
108
+ ```shell
109
+ bin/rails server
110
+ ```
111
+
53
112
  <br />
54
113
 
55
- ### Development
114
+ ## Development
115
+
116
+ Clone LesliAudit into the host application's `engines` directory:
56
117
 
57
118
  ```shell
58
- # clone the lesli repo inside your engine folder: RailsApp/engines
59
- git clone https://github.com/LesliTech/LesliAudit.git
119
+ cd RailsApp
120
+ mkdir -p engines
121
+ git clone https://github.com/LesliTech/LesliAudit.git engines/LesliAudit
122
+ ```
60
123
 
61
- # Load LesliAudit as a Gem
62
- gem "lesli", path: "engines/LesliAudit"
124
+ Reference the local engine from the host application's `Gemfile`:
63
125
 
64
- # Install the necessary Gems to run LesliAudit
65
- bundle install
126
+ ```ruby
127
+ gem "lesli_audit", path: "engines/LesliAudit"
128
+ ```
66
129
 
67
- # Setup & initialize the database
68
- rake lesli:db:setup
130
+ Install dependencies, prepare the host database, and start Rails:
69
131
 
132
+ ```shell
133
+ bundle install
134
+ bin/rails lesli:db:prepare
135
+ bin/rails server
70
136
  ```
71
137
 
72
- <br />
73
- <hr/>
74
- <br />
138
+ ### Tests
75
139
 
76
- ### Demo
140
+ From a complete Lesli development workspace, run the engine test suite from the LesliAudit directory:
77
141
 
78
- * [online demo](https://demo.lesli.dev/)
79
- * [docker demo](https://github.com/LesliTech/lesli-docker-demo)
142
+ ```shell
143
+ cd engines/LesliAudit
144
+ bin/rails test
145
+ ```
80
146
 
147
+ <br />
81
148
 
82
- ### Documentation
83
- * [website](https://www.lesli.dev/)
84
- * [documentation](https://www.lesli.dev/engines/audit)
149
+ ## Documentation
150
+
151
+ - [Lesli website](https://www.lesli.dev/)
152
+ - [Documentation](https://www.lesli.dev/engines/audit)
153
+ - [Architecture and data policy](./docs/about/architecture.md)
154
+ - [Configuration](./docs/about/configuration.md)
155
+ - [Request analytics](./docs/analytics/overview.md)
156
+ - [Activity events](./docs/events/overview.md)
157
+ - [Operational tasks](./docs/about/tasks.md)
158
+ - [Database](./docs/about/database.md)
159
+ - [Frontend development](./docs/about/frontend.md)
160
+ - [Release notes](https://github.com/LesliTech/LesliAudit/releases)
161
+ - [Issue tracker](https://github.com/LesliTech/LesliAudit/issues)
162
+ - [Source code](https://github.com/LesliTech/LesliAudit)
85
163
 
164
+ <br />
86
165
 
87
- ### Connect with Lesli
166
+ ## Community
88
167
 
89
- * [X: @LesliTech](https://x.com/LesliTech)
90
- * [Email: hello@lesli.tech](hello@lesli.tech)
91
- * [Website: https://www.lesli.tech](https://www.lesli.tech)
168
+ - [X: @LesliTech](https://x.com/LesliTech)
169
+ - [hello@lesli.tech](mailto:hello@lesli.tech)
170
+ - [https://www.lesli.tech](https://www.lesli.tech)
92
171
 
172
+ <br />
173
+
174
+ ## License
93
175
 
94
- ### License
95
- -------
96
176
  Copyright (c) 2026, Lesli Technologies, S. A.
97
177
 
98
178
  This program is free software: you can redistribute it and/or modify
@@ -106,19 +186,16 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
106
186
  GNU General Public License for more details.
107
187
 
108
188
  You should have received a copy of the GNU General Public License
109
- along with this program. If not, see http://www.gnu.org/licenses/.
189
+ along with this program. If not, see [https://www.gnu.org/licenses/](https://www.gnu.org/licenses/).
110
190
 
111
- <br />
112
- <hr />
113
- <br />
114
- <br />
191
+ The complete license text is available in the [license file](./license).
115
192
 
116
- <div align="center" class="has-text-centered">
117
- <img width="200" alt="Lesli logo" src="https://cdn.lesli.tech/lesli/brand/app-logo.svg" />
118
- <h3 align="center" class="mt-0">
119
- The Open-Source SaaS Development Framework for Ruby on Rails.
120
- </h3>
121
- </div>
193
+ ---
122
194
 
123
195
  <br />
124
196
  <br />
197
+
198
+ <div align="center">
199
+ <img width="80" alt="Lesli icon" src="https://cdn.lesli.tech/lesli/brand/app-icon.svg" />
200
+ <h3 align="center">The Open-Source SaaS Development Framework for Ruby on Rails.</h3>
201
+ </div>
metadata CHANGED
@@ -1,13 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lesli_audit
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - The Lesli Development Team
8
+ autorequire:
8
9
  bindir: bin
9
10
  cert_chain: []
10
- date: 1980-01-02 00:00:00.000000000 Z
11
+ date: 2026-10-23 00:00:00.000000000 Z
11
12
  dependencies:
12
13
  - !ruby/object:Gem::Dependency
13
14
  name: lesli
@@ -64,7 +65,9 @@ files:
64
65
  - app/helpers/lesli_audit/users_helper.rb
65
66
  - app/interfaces/lesli_audit/logger_interface.rb
66
67
  - app/jobs/lesli_audit/application_job.rb
68
+ - app/jobs/lesli_audit/retention_cleanup_job.rb
67
69
  - app/mailers/lesli_audit/application_mailer.rb
70
+ - app/models/concerns/lesli_audit/append_only.rb
68
71
  - app/models/lesli_audit/account.rb
69
72
  - app/models/lesli_audit/account_device.rb
70
73
  - app/models/lesli_audit/account_log.rb
@@ -74,8 +77,11 @@ files:
74
77
  - app/models/lesli_audit/user_journal.rb
75
78
  - app/models/lesli_audit/user_log.rb
76
79
  - app/models/lesli_audit/user_request.rb
80
+ - app/services/lesli_audit/activity_audit.rb
77
81
  - app/services/lesli_audit/log_service.rb
78
82
  - app/services/lesli_audit/request_service.rb
83
+ - app/services/lesli_audit/retention_cleanup.rb
84
+ - app/services/lesli_audit/user_agent_parser.rb
79
85
  - app/services/lesli_audit/user_service.rb
80
86
  - app/services/lesli_audit/visitor_service.rb
81
87
  - app/views/lesli_audit/dashboards/_component-calendar.html.erb
@@ -118,8 +124,11 @@ licenses:
118
124
  - GPL-3.0
119
125
  metadata:
120
126
  homepage_uri: https://www.lesli.dev/
121
- changelog_uri: https://github.com/LesliTech/LesliAudit
127
+ changelog_uri: https://github.com/LesliTech/LesliAudit/releases
122
128
  source_code_uri: https://github.com/LesliTech/LesliAudit
129
+ bug_tracker_uri: https://github.com/LesliTech/LesliAudit/issues
130
+ documentation_uri: https://www.lesli.dev/engines/audit/
131
+ post_install_message:
123
132
  rdoc_options: []
124
133
  require_paths:
125
134
  - lib
@@ -134,7 +143,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
134
143
  - !ruby/object:Gem::Version
135
144
  version: '0'
136
145
  requirements: []
137
- rubygems_version: 3.7.1
146
+ rubygems_version: 3.5.16
147
+ signing_key:
138
148
  specification_version: 4
139
149
  summary: Logs Activities & Analytics for The Lesli Framework
140
150
  test_files: []