lesli_audit 0.1.0

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 (76) hide show
  1. checksums.yaml +7 -0
  2. data/Rakefile +5 -0
  3. data/app/assets/config/lesli_audit_manifest.js +38 -0
  4. data/app/assets/images/lesli_audit/audit-logo.svg +72 -0
  5. data/app/assets/javascripts/lesli_audit/application.js +3592 -0
  6. data/app/assets/stylesheets/lesli_audit/application.scss +35 -0
  7. data/app/assets/stylesheets/lesli_audit/dashboard.scss +0 -0
  8. data/app/controllers/lesli_audit/analytics_controller.rb +36 -0
  9. data/app/controllers/lesli_audit/application_controller.rb +4 -0
  10. data/app/controllers/lesli_audit/dashboards_controller.rb +59 -0
  11. data/app/helpers/lesli_audit/analytics_helper.rb +4 -0
  12. data/app/helpers/lesli_audit/application_helper.rb +4 -0
  13. data/app/helpers/lesli_audit/dashboards_helper.rb +4 -0
  14. data/app/jobs/lesli_audit/application_job.rb +4 -0
  15. data/app/mailers/lesli_audit/application_mailer.rb +6 -0
  16. data/app/models/lesli_audit/analytic.rb +4 -0
  17. data/app/models/lesli_audit/application_record.rb +5 -0
  18. data/app/models/lesli_audit/dashboard.rb +4 -0
  19. data/app/services/lesli_audit/account/activity_services.rb +69 -0
  20. data/app/services/lesli_audit/analytic_service.rb +151 -0
  21. data/app/services/lesli_audit/analytics/trend_services.rb +84 -0
  22. data/app/services/lesli_audit/analytics/visitor_service.rb +166 -0
  23. data/app/services/lesli_audit/request_services.rb +71 -0
  24. data/app/services/lesli_audit/users/activity_services.rb +61 -0
  25. data/app/services/lesli_audit/users/log_services.rb +62 -0
  26. data/app/services/lesli_audit/users/registration_services.rb +62 -0
  27. data/app/services/lesli_audit/users/role_services.rb +61 -0
  28. data/app/services/lesli_audit/users/working_hour_services.rb +78 -0
  29. data/app/views/lesli_audit/analytics/_analytic.html.erb +2 -0
  30. data/app/views/lesli_audit/analytics/_form.html.erb +17 -0
  31. data/app/views/lesli_audit/analytics/edit.html.erb +10 -0
  32. data/app/views/lesli_audit/analytics/index.html.erb +1 -0
  33. data/app/views/lesli_audit/analytics/new.html.erb +9 -0
  34. data/app/views/lesli_audit/analytics/show.html.erb +10 -0
  35. data/app/views/lesli_audit/dashboards/_dashboard.html.erb +2 -0
  36. data/app/views/lesli_audit/dashboards/_form.html.erb +17 -0
  37. data/app/views/lesli_audit/dashboards/edit.html.erb +10 -0
  38. data/app/views/lesli_audit/dashboards/index.html.erb +14 -0
  39. data/app/views/lesli_audit/dashboards/new.html.erb +9 -0
  40. data/app/views/lesli_audit/dashboards/show.html.erb +1 -0
  41. data/app/views/lesli_audit/partials/_engine-navigation.html.erb +39 -0
  42. data/config/routes.rb +45 -0
  43. data/db/migrate/v1.0/0803000110_create_lesli_audit_accounts.rb +42 -0
  44. data/db/migrate/v1.0/0803050110_create_lesli_audit_dashboards.rb +51 -0
  45. data/db/migrate/v1.0/0803050210_create_lesli_audit_dashboard_components.rb +53 -0
  46. data/lib/lesli_audit/engine.rb +18 -0
  47. data/lib/lesli_audit/version.rb +3 -0
  48. data/lib/lesli_audit.rb +6 -0
  49. data/lib/tasks/lesli_audit_tasks.rake +4 -0
  50. data/lib/vue/application.js +102 -0
  51. data/lib/vue/apps/accounts/activities.vue +48 -0
  52. data/lib/vue/apps/analytics/index.vue +18 -0
  53. data/lib/vue/apps/analytics/requests.vue +67 -0
  54. data/lib/vue/apps/analytics/trends.vue +149 -0
  55. data/lib/vue/apps/analytics/visitors.vue +91 -0
  56. data/lib/vue/apps/requests/index.vue +123 -0
  57. data/lib/vue/apps/security/passwords.vue +52 -0
  58. data/lib/vue/apps/security/sessions.vue +63 -0
  59. data/lib/vue/apps/users/activities.vue +49 -0
  60. data/lib/vue/apps/users/logs.vue +49 -0
  61. data/lib/vue/apps/users/registrations.vue +98 -0
  62. data/lib/vue/apps/users/roles.vue +70 -0
  63. data/lib/vue/apps/users/workingHours.vue +52 -0
  64. data/lib/vue/stores/accounts/activities.js +87 -0
  65. data/lib/vue/stores/analytics/visitors.js +130 -0
  66. data/lib/vue/stores/request.js +70 -0
  67. data/lib/vue/stores/security/password.js +75 -0
  68. data/lib/vue/stores/security/session.js +78 -0
  69. data/lib/vue/stores/users/activities.js +76 -0
  70. data/lib/vue/stores/users/logs.js +74 -0
  71. data/lib/vue/stores/users/registrations.js +61 -0
  72. data/lib/vue/stores/users/roles.js +52 -0
  73. data/lib/vue/stores/users/working_hours.js +92 -0
  74. data/license +674 -0
  75. data/readme.md +120 -0
  76. metadata +134 -0
@@ -0,0 +1,35 @@
1
+ /*
2
+
3
+ Lesli
4
+
5
+ Copyright (c) 2023, Lesli Technologies, S. A.
6
+
7
+ This program is free software: you can redistribute it and/or modify
8
+ it under the terms of the GNU General Public License as published by
9
+ the Free Software Foundation, either version 3 of the License, or
10
+ (at your option) any later version.
11
+
12
+ This program is distributed in the hope that it will be useful,
13
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ GNU General Public License for more details.
16
+
17
+ You should have received a copy of the GNU General Public License
18
+ along with this program. If not, see http://www.gnu.org/licenses/.
19
+
20
+ Lesli · Ruby on Rails SaaS Development Framework.
21
+
22
+ Made with ♥ by https://www.lesli.tech
23
+ Building a better future, one line of code at a time.
24
+
25
+ @contact hello@lesli.tech
26
+ @website https://www.lesli.tech
27
+ @license GPLv3 http://www.gnu.org/licenses/gpl-3.0.en.html
28
+
29
+ // · ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~
30
+ // ·
31
+ */
32
+
33
+
34
+ // // ·
35
+ body.cloud_audit-dashboard { @import "lesli/templates/dashboards"; }
File without changes
@@ -0,0 +1,36 @@
1
+ module LesliAudit
2
+ class AnalyticsController < ApplicationController
3
+
4
+ # GET /analytics
5
+ def index
6
+ end
7
+
8
+ def visitors
9
+ respond_with_successful(AnalyticService.new(current_user, query).visitors)
10
+ end
11
+
12
+ def users
13
+ respond_with_successful(AnalyticService.new(current_user, query).users)
14
+ end
15
+
16
+ def devices
17
+ respond_with_successful(AnalyticService.new(current_user, query).devices)
18
+ end
19
+
20
+ def controllers
21
+ respond_with_successful(AnalyticService.new(current_user, query).controllers)
22
+ end
23
+
24
+
25
+ private
26
+
27
+ # Use callbacks to share common setup or constraints between actions.
28
+ def set_analytic
29
+ end
30
+
31
+ # Only allow a list of trusted parameters through.
32
+ def analytic_params
33
+ params.fetch(:analytic, {})
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,4 @@
1
+ module LesliAudit
2
+ class ApplicationController < Lesli::ApplicationLesliController
3
+ end
4
+ end
@@ -0,0 +1,59 @@
1
+ module LesliAudit
2
+ class DashboardsController < ApplicationController
3
+ #before_action :set_dashboard, only: %i[ show edit update destroy ]
4
+
5
+ # GET /dashboards
6
+ def index
7
+ end
8
+
9
+ # GET /dashboards/1
10
+ def show
11
+ end
12
+
13
+ # GET /dashboards/new
14
+ def new
15
+ @dashboard = Dashboard.new
16
+ end
17
+
18
+ # GET /dashboards/1/edit
19
+ def edit
20
+ end
21
+
22
+ # POST /dashboards
23
+ def create
24
+ @dashboard = Dashboard.new(dashboard_params)
25
+
26
+ if @dashboard.save
27
+ redirect_to @dashboard, notice: "Dashboard was successfully created."
28
+ else
29
+ render :new, status: :unprocessable_entity
30
+ end
31
+ end
32
+
33
+ # PATCH/PUT /dashboards/1
34
+ def update
35
+ if @dashboard.update(dashboard_params)
36
+ redirect_to @dashboard, notice: "Dashboard was successfully updated.", status: :see_other
37
+ else
38
+ render :edit, status: :unprocessable_entity
39
+ end
40
+ end
41
+
42
+ # DELETE /dashboards/1
43
+ def destroy
44
+ @dashboard.destroy
45
+ redirect_to dashboards_url, notice: "Dashboard was successfully destroyed.", status: :see_other
46
+ end
47
+
48
+ private
49
+ # Use callbacks to share common setup or constraints between actions.
50
+ def set_dashboard
51
+ @dashboard = Dashboard.find(params[:id])
52
+ end
53
+
54
+ # Only allow a list of trusted parameters through.
55
+ def dashboard_params
56
+ params.fetch(:dashboard, {})
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,4 @@
1
+ module LesliAudit
2
+ module AnalyticsHelper
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module LesliAudit
2
+ module ApplicationHelper
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module LesliAudit
2
+ module DashboardsHelper
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module LesliAudit
2
+ class ApplicationJob < ActiveJob::Base
3
+ end
4
+ end
@@ -0,0 +1,6 @@
1
+ module LesliAudit
2
+ class ApplicationMailer < ActionMailer::Base
3
+ default from: "from@example.com"
4
+ layout "mailer"
5
+ end
6
+ end
@@ -0,0 +1,4 @@
1
+ module LesliAudit
2
+ class Analytic < ApplicationRecord
3
+ end
4
+ end
@@ -0,0 +1,5 @@
1
+ module LesliAudit
2
+ class ApplicationRecord < ActiveRecord::Base
3
+ self.abstract_class = true
4
+ end
5
+ end
@@ -0,0 +1,4 @@
1
+ module LesliAudit
2
+ class Dashboard < ApplicationRecord
3
+ end
4
+ end
@@ -0,0 +1,69 @@
1
+ =begin
2
+
3
+ Lesli
4
+
5
+ Copyright (c) 2023, Lesli Technologies, S. A.
6
+
7
+ This program is free software: you can redistribute it and/or modify
8
+ it under the terms of the GNU General Public License as published by
9
+ the Free Software Foundation, either version 3 of the License, or
10
+ (at your option) any later version.
11
+
12
+ This program is distributed in the hope that it will be useful,
13
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ GNU General Public License for more details.
16
+
17
+ You should have received a copy of the GNU General Public License
18
+ along with this program. If not, see http://www.gnu.org/licenses/.
19
+
20
+ Lesli · Ruby on Rails SaaS development platform.
21
+
22
+ Made with ♥ by https://www.lesli.tech
23
+ Building a better future, one line of code at a time.
24
+
25
+ @contact hello@lesli.tech
26
+ @website https://www.lesli.tech
27
+ @license GPLv3 http://www.gnu.org/licenses/gpl-3.0.en.html
28
+
29
+ // · ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~
30
+ // ·
31
+ =end
32
+
33
+ module CloudAudit
34
+ class Analytics::ActivityServices < ApplicationLesliServices
35
+
36
+ def index
37
+ search_string = nil # query[:search].downcase.gsub(" ","%") unless query[:search].blank?
38
+
39
+ activities = current_user.account.activities
40
+
41
+ activities = activities.select(
42
+ :id,
43
+ :title,
44
+ :description,
45
+ :system_process,
46
+ :system_module,
47
+ "payload ->'to'->>0 as send_to",
48
+ Date2.new.date_time.db_timestamps()
49
+ )
50
+
51
+ # search if search params was sent
52
+ unless search_string.blank?
53
+ activities = activities.where(["
54
+ system_module like :search_string
55
+ or system_process like :search_string
56
+ or description like :search_string
57
+ or title like :search_string
58
+ or payload->'to'->>0 like :search_string",
59
+ ].join(" or "), {
60
+ search_string: "%#{search_string}%"
61
+ })
62
+ end
63
+
64
+ activities.page(query[:pagination][:page])
65
+ .per(query[:pagination][:perPage])
66
+ .order(created_at: :desc)
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,151 @@
1
+ =begin
2
+
3
+ Lesli
4
+
5
+ Copyright (c) 2023, Lesli Technologies, S. A.
6
+
7
+ This program is free software: you can redistribute it and/or modify
8
+ it under the terms of the GNU General Public License as published by
9
+ the Free Software Foundation, either version 3 of the License, or
10
+ (at your option) any later version.
11
+
12
+ This program is distributed in the hope that it will be useful,
13
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ GNU General Public License for more details.
16
+
17
+ You should have received a copy of the GNU General Public License
18
+ along with this program. If not, see http://www.gnu.org/licenses/.
19
+
20
+ Lesli · Ruby on Rails SaaS development platform.
21
+
22
+ Made with ♥ by https://www.lesli.tech
23
+ Building a better future, one line of code at a time.
24
+
25
+ @contact hello@lesli.tech
26
+ @website https://www.lesli.tech
27
+ @license GPLv3 http://www.gnu.org/licenses/gpl-3.0.en.html
28
+
29
+ // · ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~
30
+ // ·
31
+ =end
32
+
33
+ module LesliAudit
34
+ class AnalyticService < Lesli::ApplicationLesliService
35
+
36
+ LIMIT=5
37
+
38
+ # @overwrite
39
+ # @return {Hash} Paginated list of the records
40
+ # @param {query} Has of the formated queries/filters that will be applied to filter data
41
+ # @description
42
+ # @example
43
+ def visitors
44
+
45
+ group = 'day'
46
+ #group = params[:bygroup] if ['month','week','day'].include?(params[:bygroup])
47
+
48
+ # only the users of the account
49
+ usrs = current_user.account.users
50
+
51
+ requests = Lesli::User::Request.where(user: usrs).group("DATE_TRUNC('month', created_at)") if group == 'month'
52
+ requests = Lesli::User::Request.where(user: usrs).group("DATE_TRUNC('week', created_at)") if group == 'week'
53
+ requests = Lesli::User::Request.where(user: usrs).group("DATE_TRUNC('day', created_at)") if group == 'day'
54
+
55
+ requests = apply_filters(requests, query)
56
+
57
+ requests.limit(30).order("date DESC").select(
58
+ "count(id) resources",
59
+ "sum(request_count) requests",
60
+ "DATE_TRUNC('day', created_at) date"
61
+ ).map do |request|
62
+ {
63
+ :requests => request[:requests],
64
+ :resources => request[:resources],
65
+ :date => Date2.new(request[:date]).date.to_s
66
+ }
67
+ end
68
+ end
69
+
70
+ def users
71
+
72
+ requests = Lesli::User::Request
73
+ .joins(:user)
74
+ .where(user: current_user.account.users)
75
+ .group(:email)
76
+
77
+ requests = apply_filters(requests, query)
78
+
79
+ requests = requests.limit(LIMIT).order("requests DESC").select(
80
+ :email,
81
+ "count(lesli_user_requests.id) resources",
82
+ "sum(lesli_user_requests.request_count) requests"
83
+ ).map do |request|
84
+ {
85
+ :requests => request[:requests],
86
+ :resources => request[:resources],
87
+ :email => request[:email]
88
+ }
89
+ end
90
+ end
91
+
92
+ def devices
93
+ agents = Lesli::User::Agent.where(user: current_user.account.users)
94
+ agents = agents.group("platform", "browser")
95
+ agents = agents.limit(LIMIT).order(sum_count: :desc).sum(:count).map do |req|
96
+ {
97
+ :device => req[0].join("/"),
98
+ :visits => req[1]
99
+ }
100
+ end
101
+
102
+ return agents
103
+ end
104
+
105
+ def controllers
106
+ requests = Lesli::User::Request.where(user: current_user.account.users).group("request_controller")
107
+
108
+ requests = apply_filters(requests, query)
109
+
110
+ requests = requests.limit(LIMIT).order("requests DESC").select(
111
+ :request_controller,
112
+ "sum(request_count) requests"
113
+ )
114
+ end
115
+
116
+ private
117
+
118
+ def apply_filters requests, params
119
+
120
+ return requests
121
+
122
+ # filter by search string
123
+ unless params[:search].blank?
124
+ requests = requests.where(
125
+ "lower(request_agent) like :search_string or lower(request_controller) like :search_string or lower(request_action) like :search_string",
126
+ {
127
+ search_string: "%#{params[:search].downcase.gsub(" ","%")}%"
128
+ }
129
+ )
130
+ end
131
+
132
+ # filter by time
133
+ unless params[:bytime].blank? && params[:bytime] != 'all'
134
+ requests = requests.where(created_at: (Time.now.beginning_of_day)..) if params[:bytime] == 'day'
135
+ requests = requests.where(created_at: (Time.now.beginning_of_day - 7.day)..) if params[:bytime] == 'week'
136
+ requests = requests.where(created_at: (Time.now.beginning_of_day - 30.day)..) if params[:bytime] == 'month'
137
+ requests = requests.where(created_at: (Time.now.beginning_of_day - 6.month)..) if params[:bytime] == 'sixmonth'
138
+ requests = requests.where(created_at: (Time.now.beginning_of_day - 1.year)..) if params[:bytime] == 'year'
139
+ end
140
+
141
+ # filter by request format
142
+ if (!params[:byformat].blank? && ['html', 'json'].include?(params[:byformat]))
143
+ requests = requests.where(:request_action => 'show') if params[:byformat] == 'html'
144
+ requests = requests.where(:request_format => params[:byformat])
145
+ end
146
+
147
+ requests
148
+
149
+ end
150
+ end
151
+ end
@@ -0,0 +1,84 @@
1
+ =begin
2
+
3
+ Lesli
4
+
5
+ Copyright (c) 2023, Lesli Technologies, S. A.
6
+
7
+ This program is free software: you can redistribute it and/or modify
8
+ it under the terms of the GNU General Public License as published by
9
+ the Free Software Foundation, either version 3 of the License, or
10
+ (at your option) any later version.
11
+
12
+ This program is distributed in the hope that it will be useful,
13
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ GNU General Public License for more details.
16
+
17
+ You should have received a copy of the GNU General Public License
18
+ along with this program. If not, see http://www.gnu.org/licenses/.
19
+
20
+ Lesli · Ruby on Rails SaaS development platform.
21
+
22
+ Made with ♥ by https://www.lesli.tech
23
+ Building a better future, one line of code at a time.
24
+
25
+ @contact hello@lesli.tech
26
+ @website https://www.lesli.tech
27
+ @license GPLv3 http://www.gnu.org/licenses/gpl-3.0.en.html
28
+
29
+ // · ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~
30
+ // ·
31
+ =end
32
+
33
+ module CloudAudit
34
+ class Analytics::TrendServices < ApplicationLesliServices
35
+
36
+ def index
37
+
38
+ #Default period
39
+ period = 'day'
40
+
41
+ #Get filters from http request
42
+ filters = nil #params[:f]
43
+
44
+ #Get start and final date only if the request have filters
45
+ unless filters.blank?
46
+ finalDate = filters[:finalDate]
47
+ startDate = filters[:startDate]
48
+ period = filters[:groupBy]
49
+ end
50
+
51
+ #Default search if range date is not provided
52
+ user_requests = ::User::Request.select('created_at').where(created_at: (Time.now.beginning_of_day - 3.month)..)
53
+
54
+ # Verify if there are startDate and finalDate
55
+ unless startDate.blank? || finalDate.blank?
56
+ user_requests = ::User::Request.where(created_at: (startDate..finalDate))
57
+ end
58
+
59
+ unless period.blank? || (period != 'day' && period != 'hour')
60
+ #Group by day/time depending on the period param
61
+ if period == 'day'
62
+ user_requests = user_requests.group("DATE_TRUNC('#{period}', created_at)")
63
+ user_requests.count.map do |request|
64
+ {
65
+ :day => request[0].strftime('%A').to_s,
66
+ :count => request[1]
67
+ }
68
+ end
69
+
70
+
71
+ elsif period == 'hour'
72
+ user_requests = user_requests.group("DATE_PART('#{period}', created_at)").order('date_part_hour_created_at')
73
+ user_requests.count.map do |request|
74
+ {
75
+ :hour => request[0],
76
+ :count => request[1]
77
+ }
78
+ end
79
+ end
80
+ end
81
+ end
82
+
83
+ end
84
+ end
@@ -0,0 +1,166 @@
1
+ =begin
2
+
3
+ Lesli
4
+
5
+ Copyright (c) 2023, Lesli Technologies, S. A.
6
+
7
+ This program is free software: you can redistribute it and/or modify
8
+ it under the terms of the GNU General Public License as published by
9
+ the Free Software Foundation, either version 3 of the License, or
10
+ (at your option) any later version.
11
+
12
+ This program is distributed in the hope that it will be useful,
13
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ GNU General Public License for more details.
16
+
17
+ You should have received a copy of the GNU General Public License
18
+ along with this program. If not, see http://www.gnu.org/licenses/.
19
+
20
+ Lesli · Ruby on Rails SaaS development platform.
21
+
22
+ Made with ♥ by https://www.lesli.tech
23
+ Building a better future, one line of code at a time.
24
+
25
+ @contact hello@lesli.tech
26
+ @website https://www.lesli.tech
27
+ @license GPLv3 http://www.gnu.org/licenses/gpl-3.0.en.html
28
+
29
+ // · ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~
30
+ // ·
31
+ =end
32
+
33
+ module LesliAudit
34
+ class Analytics::VisitorService < Lesli::ApplicationLesliService
35
+
36
+ LIMIT=5
37
+
38
+ # @overwrite
39
+ # @return {Hash} Paginated list of the records
40
+ # @param {query} Has of the formated queries/filters that will be applied to filter data
41
+ # @description
42
+ # @example
43
+ def visits
44
+
45
+ return Lesli::User::Request.group("DATE_TRUNC('day', created_at)").limit(30).order("date DESC").select(
46
+ "count(id) resources",
47
+ "sum(request_count) requests",
48
+ "DATE_TRUNC('day', created_at) date"
49
+ ).map do |request|
50
+ {
51
+ :requests => request[:requests],
52
+ :resources => request[:resources],
53
+ :date => Date2.new(request[:date]).date.to_s
54
+ }
55
+ end
56
+
57
+ group = 'day'
58
+ #group = params[:bygroup] if ['month','week','day'].include?(params[:bygroup])
59
+
60
+ # only the users of the account
61
+ usrs = current_user.account.users
62
+
63
+ requests = ::User::Request.where(user: usrs).group("DATE_TRUNC('month', created_at)") if group == 'month'
64
+ requests = ::User::Request.where(user: usrs).group("DATE_TRUNC('week', created_at)") if group == 'week'
65
+ requests = ::User::Request.where(user: usrs).group("DATE_TRUNC('day', created_at)") if group == 'day'
66
+
67
+ requests = apply_filters(requests, query)
68
+
69
+ requests.limit(30).order("date DESC").select(
70
+ "count(id) resources",
71
+ "sum(request_count) requests",
72
+ "DATE_TRUNC('day', created_at) date"
73
+ ).map do |request|
74
+ {
75
+ :requests => request[:requests],
76
+ :resources => request[:resources],
77
+ :date => Date2.new(request[:date]).date.to_s
78
+ }
79
+ end
80
+ end
81
+
82
+ def users
83
+ requests = ::User::Request
84
+ .joins(:user)
85
+ .where(user: current_user.account.users)
86
+ .group(:email)
87
+
88
+ requests = apply_filters(requests, query)
89
+
90
+ requests = requests.limit(LIMIT).order("requests DESC").select(
91
+ :email,
92
+ "count(user_requests.id) resources",
93
+ "sum(user_requests.request_count) requests"
94
+ ).map do |request|
95
+ {
96
+ :requests => request[:requests],
97
+ :resources => request[:resources],
98
+ :email => request[:email]
99
+ }
100
+ end
101
+
102
+ return requests
103
+ end
104
+
105
+ def devices
106
+ agents = ::User::Agent.where(user: current_user.account.users)
107
+ agents = agents.group("platform", "browser")
108
+ agents = agents.limit(LIMIT).order(sum_count: :desc).sum(:count).map do |req|
109
+ {
110
+ :device => req[0].join("/"),
111
+ :visits => req[1]
112
+ }
113
+ end
114
+
115
+ return agents
116
+ end
117
+
118
+ def controllers
119
+ requests = Lesli::User::Request.where(lesli_user: current_user.account.users).group("request_controller")
120
+
121
+ requests = apply_filters(requests, query)
122
+
123
+ requests = requests.limit(LIMIT).order("requests DESC").select(
124
+ :request_controller,
125
+ "sum(request_count) requests"
126
+ )
127
+
128
+ return requests
129
+ end
130
+
131
+ private
132
+
133
+ def apply_filters requests, params
134
+
135
+ return requests
136
+
137
+ # filter by search string
138
+ unless params[:search].blank?
139
+ requests = requests.where(
140
+ "lower(request_agent) like :search_string or lower(request_controller) like :search_string or lower(request_action) like :search_string",
141
+ {
142
+ search_string: "%#{params[:search].downcase.gsub(" ","%")}%"
143
+ }
144
+ )
145
+ end
146
+
147
+ # filter by time
148
+ unless params[:bytime].blank? && params[:bytime] != 'all'
149
+ requests = requests.where(created_at: (Time.now.beginning_of_day)..) if params[:bytime] == 'day'
150
+ requests = requests.where(created_at: (Time.now.beginning_of_day - 7.day)..) if params[:bytime] == 'week'
151
+ requests = requests.where(created_at: (Time.now.beginning_of_day - 30.day)..) if params[:bytime] == 'month'
152
+ requests = requests.where(created_at: (Time.now.beginning_of_day - 6.month)..) if params[:bytime] == 'sixmonth'
153
+ requests = requests.where(created_at: (Time.now.beginning_of_day - 1.year)..) if params[:bytime] == 'year'
154
+ end
155
+
156
+ # filter by request format
157
+ if (!params[:byformat].blank? && ['html', 'json'].include?(params[:byformat]))
158
+ requests = requests.where(:request_action => 'show') if params[:byformat] == 'html'
159
+ requests = requests.where(:request_format => params[:byformat])
160
+ end
161
+
162
+ requests
163
+
164
+ end
165
+ end
166
+ end