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.
- checksums.yaml +4 -4
- data/Rakefile +6 -1
- data/app/assets/stylesheets/lesli_audit/application.css +366 -35
- data/app/controllers/lesli_audit/accounts_controller.rb +7 -3
- data/app/controllers/lesli_audit/logs_controller.rb +3 -8
- data/app/controllers/lesli_audit/visitors_controller.rb +1 -1
- data/app/interfaces/lesli_audit/logger_interface.rb +56 -59
- data/app/jobs/lesli_audit/retention_cleanup_job.rb +9 -0
- data/app/models/concerns/lesli_audit/append_only.rb +12 -0
- data/app/models/lesli_audit/account.rb +26 -10
- data/app/models/lesli_audit/account_device.rb +3 -1
- data/app/models/lesli_audit/account_log.rb +12 -7
- data/app/models/lesli_audit/account_request.rb +3 -1
- data/app/models/lesli_audit/user_journal.rb +16 -3
- data/app/models/lesli_audit/user_log.rb +12 -3
- data/app/models/lesli_audit/user_request.rb +7 -3
- data/app/services/lesli_audit/activity_audit.rb +130 -0
- data/app/services/lesli_audit/request_service.rb +2 -35
- data/app/services/lesli_audit/retention_cleanup.rb +146 -0
- data/app/services/lesli_audit/user_agent_parser.rb +51 -0
- data/app/services/lesli_audit/user_service.rb +18 -16
- data/app/services/lesli_audit/visitor_service.rb +22 -49
- data/app/views/lesli_audit/logs/show.html.erb +14 -8
- data/app/views/lesli_audit/partials/_navigation.html.erb +1 -1
- data/app/views/lesli_audit/users/index.html.erb +67 -64
- data/app/views/lesli_audit/visitors/index.html.erb +126 -80
- data/config/routes.rb +3 -2
- data/db/migrate/v1.0/0501000110_create_lesli_audit_accounts.rb +14 -1
- data/db/migrate/v1.0/0501110110_create_lesli_audit_account_logs.rb +10 -6
- data/db/migrate/v1.0/0501110210_create_lesli_audit_account_devices.rb +10 -7
- data/db/migrate/v1.0/0501110310_create_lesli_audit_account_requests.rb +10 -7
- data/db/migrate/v1.0/0501120110_create_lesli_audit_user_logs.rb +11 -7
- data/db/migrate/v1.0/0501120210_create_lesli_audit_user_journals.rb +19 -8
- data/db/migrate/v1.0/0501120310_create_lesli_audit_user_requests.rb +13 -10
- data/db/seed/devices.rb +1 -1
- data/db/seed/requests.rb +3 -3
- data/lib/lesli_audit/engine.rb +1 -6
- data/lib/lesli_audit/version.rb +2 -2
- data/lib/tasks/lesli_audit_tasks.rake +12 -4
- data/readme.md +127 -50
- 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
|
|
37
|
-
t.string
|
|
38
|
-
t.string
|
|
39
|
-
t.
|
|
40
|
-
t.date
|
|
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
|
-
|
|
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[
|
|
33
|
+
class CreateLesliAuditAccountRequests < ActiveRecord::Migration[8.1]
|
|
34
34
|
def change
|
|
35
35
|
create_table :lesli_audit_account_requests do |t|
|
|
36
|
-
t.string
|
|
37
|
-
t.string
|
|
38
|
-
t.
|
|
39
|
-
t.date
|
|
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
|
-
|
|
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[
|
|
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.
|
|
42
|
-
t.
|
|
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[
|
|
33
|
+
class CreateLesliAuditUserJournals < ActiveRecord::Migration[8.1]
|
|
34
34
|
def change
|
|
35
35
|
create_table :lesli_audit_user_journals do |t|
|
|
36
|
-
t.string
|
|
37
|
-
t.string
|
|
38
|
-
t.
|
|
39
|
-
t.
|
|
40
|
-
t.
|
|
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[
|
|
33
|
+
class CreateLesliAuditUserRequests < ActiveRecord::Migration[8.1]
|
|
34
34
|
def change
|
|
35
35
|
create_table :lesli_audit_user_requests do |t|
|
|
36
|
-
t.string
|
|
37
|
-
t.string
|
|
38
|
-
t.
|
|
39
|
-
t.date
|
|
40
|
-
t.
|
|
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
|
-
|
|
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
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
|
-
:
|
|
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
|
-
:
|
|
70
|
-
:
|
|
69
|
+
:date => date,
|
|
70
|
+
:session_id => session&.id,
|
|
71
71
|
:user => current_user
|
|
72
72
|
)
|
|
73
73
|
end
|
data/lib/lesli_audit/engine.rb
CHANGED
|
@@ -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
|
|
data/lib/lesli_audit/version.rb
CHANGED
|
@@ -1,4 +1,12 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
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
|
-
<
|
|
3
|
-
|
|
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="
|
|
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="
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
41
|
-
|
|
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
|
-
#
|
|
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
|
-
|
|
52
|
-
|
|
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
|
-
|
|
114
|
+
## Development
|
|
115
|
+
|
|
116
|
+
Clone LesliAudit into the host application's `engines` directory:
|
|
56
117
|
|
|
57
118
|
```shell
|
|
58
|
-
|
|
59
|
-
|
|
119
|
+
cd RailsApp
|
|
120
|
+
mkdir -p engines
|
|
121
|
+
git clone https://github.com/LesliTech/LesliAudit.git engines/LesliAudit
|
|
122
|
+
```
|
|
60
123
|
|
|
61
|
-
|
|
62
|
-
gem "lesli", path: "engines/LesliAudit"
|
|
124
|
+
Reference the local engine from the host application's `Gemfile`:
|
|
63
125
|
|
|
64
|
-
|
|
65
|
-
|
|
126
|
+
```ruby
|
|
127
|
+
gem "lesli_audit", path: "engines/LesliAudit"
|
|
128
|
+
```
|
|
66
129
|
|
|
67
|
-
|
|
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
|
-
|
|
73
|
-
<hr/>
|
|
74
|
-
<br />
|
|
138
|
+
### Tests
|
|
75
139
|
|
|
76
|
-
|
|
140
|
+
From a complete Lesli development workspace, run the engine test suite from the LesliAudit directory:
|
|
77
141
|
|
|
78
|
-
|
|
79
|
-
|
|
142
|
+
```shell
|
|
143
|
+
cd engines/LesliAudit
|
|
144
|
+
bin/rails test
|
|
145
|
+
```
|
|
80
146
|
|
|
147
|
+
<br />
|
|
81
148
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
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
|
-
|
|
166
|
+
## Community
|
|
88
167
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
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
|
|
189
|
+
along with this program. If not, see [https://www.gnu.org/licenses/](https://www.gnu.org/licenses/).
|
|
110
190
|
|
|
111
|
-
|
|
112
|
-
<hr />
|
|
113
|
-
<br />
|
|
114
|
-
<br />
|
|
191
|
+
The complete license text is available in the [license file](./license).
|
|
115
192
|
|
|
116
|
-
|
|
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.
|
|
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:
|
|
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.
|
|
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: []
|