resource_quotable 0.2.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.
- checksums.yaml +7 -0
- data/Changelog.md +17 -0
- data/MIT-LICENSE +20 -0
- data/Rakefile +18 -0
- data/Readme.md +206 -0
- data/app/assets/config/resource_quotable_manifest.js +1 -0
- data/app/assets/stylesheets/resource_quotable/application.css +15 -0
- data/app/controllers/resource_quotable/application_controller.rb +15 -0
- data/app/controllers/resource_quotable/quota_controller.rb +106 -0
- data/app/controllers/resource_quotable/quotum_trackers_controller.rb +23 -0
- data/app/models/resource_quotable/application_record.rb +7 -0
- data/app/models/resource_quotable/quotum.rb +46 -0
- data/app/models/resource_quotable/quotum_tracker.rb +60 -0
- data/app/services/resource_quotable/action_services/base.rb +23 -0
- data/app/services/resource_quotable/action_services/check.rb +19 -0
- data/app/services/resource_quotable/action_services/check_multiple.rb +23 -0
- data/app/services/resource_quotable/action_services/increment.rb +18 -0
- data/app/services/resource_quotable/action_services/increment_multiple.rb +22 -0
- data/app/services/resource_quotable/base.rb +24 -0
- data/app/services/resource_quotable/create.rb +29 -0
- data/app/services/resource_quotable/destroy.rb +14 -0
- data/app/services/resource_quotable/quotum_tracker_services/reset.rb +17 -0
- data/app/services/resource_quotable/reset/all.rb +16 -0
- data/app/services/resource_quotable/reset/any.rb +16 -0
- data/app/services/resource_quotable/reset/base.rb +22 -0
- data/app/services/resource_quotable/reset/daily.rb +16 -0
- data/app/services/resource_quotable/reset/monthly.rb +16 -0
- data/app/services/resource_quotable/reset/weekly.rb +16 -0
- data/app/services/resource_quotable/reset/yearly.rb +16 -0
- data/app/services/resource_quotable/update.rb +23 -0
- data/app/views/layouts/resource_quotable/application.html.erb +15 -0
- data/app/views/resource_quotable/quota/_edit.html.erb +11 -0
- data/app/views/resource_quotable/quota/_index.html.erb +43 -0
- data/app/views/resource_quotable/quota/_new.html.erb +34 -0
- data/app/views/resource_quotable/quota/_show.html.erb +41 -0
- data/app/views/resource_quotable/quota/create.js.erb +3 -0
- data/app/views/resource_quotable/quota/destroy.js.erb +3 -0
- data/app/views/resource_quotable/quota/edit.html.erb +1 -0
- data/app/views/resource_quotable/quota/edit.js.erb +1 -0
- data/app/views/resource_quotable/quota/index/_row.html.erb +3 -0
- data/app/views/resource_quotable/quota/index/_row_content.html.erb +43 -0
- data/app/views/resource_quotable/quota/index.html.erb +1 -0
- data/app/views/resource_quotable/quota/index.js.erb +1 -0
- data/app/views/resource_quotable/quota/new.html.erb +1 -0
- data/app/views/resource_quotable/quota/new.js.erb +1 -0
- data/app/views/resource_quotable/quota/show/_row.html.erb +3 -0
- data/app/views/resource_quotable/quota/show/_row_content.html.erb +7 -0
- data/app/views/resource_quotable/quota/show.html.erb +1 -0
- data/app/views/resource_quotable/quota/show.js.erb +1 -0
- data/app/views/resource_quotable/quota/update.js.erb +3 -0
- data/app/views/resource_quotable/quotum_trackers/index/_row_content.html.erb +8 -0
- data/app/views/resource_quotable/quotum_trackers/reset.js.erb +3 -0
- data/config/routes.rb +11 -0
- data/db/migrate/20220805102601_create_resource_quotable_quota.rb +17 -0
- data/db/migrate/20220811072023_create_resource_quotable_quotum_trackers.rb +18 -0
- data/lib/concerns/controllers/allowed_to_manage_quota_check.rb +73 -0
- data/lib/concerns/models/act_as_quota_trackable.rb +23 -0
- data/lib/concerns/models/act_as_quotable.rb +19 -0
- data/lib/resource_quotable/engine.rb +13 -0
- data/lib/resource_quotable/exeptions.rb +9 -0
- data/lib/resource_quotable/generators/views_generator.rb +18 -0
- data/lib/resource_quotable/helper.rb +27 -0
- data/lib/resource_quotable/version.rb +5 -0
- data/lib/resource_quotable.rb +68 -0
- data/lib/tasks/resource_quotable_tasks.rake +5 -0
- metadata +322 -0
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ResourceQuotable
|
4
|
+
# Create Quota and all quota_trackers for a group of users.
|
5
|
+
class Create < Base
|
6
|
+
attr_accessor :group, :action, :resource, :limit, :period
|
7
|
+
|
8
|
+
validates :group, :resource, presence: true
|
9
|
+
validates_inclusion_of :action, in: ResourceQuotable.actions.keys
|
10
|
+
validates_inclusion_of :period, in: Quotum.periods.keys.map(&:to_sym)
|
11
|
+
validates_numericality_of :limit, only_integer: true, greater_than_or_equal_to: 0
|
12
|
+
|
13
|
+
def call
|
14
|
+
# Crear Quotum
|
15
|
+
# Crear QuotaTracker user existentes.
|
16
|
+
quotum = nil
|
17
|
+
flag = !limit.positive?
|
18
|
+
|
19
|
+
ResourceQuotable::Quotum.transaction do
|
20
|
+
quotum = group.quota.create!(resource_class: resource, action: action, period: period, limit: limit)
|
21
|
+
group.resource_quotable_users.map { |user| user.quotum_trackers.create!(quotum: quotum, counter: 0, flag: flag) }
|
22
|
+
end
|
23
|
+
|
24
|
+
quotum
|
25
|
+
rescue ActiveRecord::RecordNotUnique
|
26
|
+
raise ResourceQuotable::QuotaDuplicateError
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ResourceQuotable
|
4
|
+
module QuotumTrackerServices
|
5
|
+
# Reset a quotum_tracker instance.
|
6
|
+
class Reset < ::ResourceQuotable::Base
|
7
|
+
attr_accessor :quotum_tracker
|
8
|
+
|
9
|
+
validates :quotum_tracker, presence: true
|
10
|
+
|
11
|
+
def call
|
12
|
+
quotum_tracker.reset!
|
13
|
+
quotum_tracker.reload
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ResourceQuotable
|
4
|
+
module Reset
|
5
|
+
# Base Reset Quota for X period.
|
6
|
+
class Base < ResourceQuotable::Base
|
7
|
+
include ActiveModel::Validations
|
8
|
+
|
9
|
+
def call
|
10
|
+
quotum_in_period.each do |quotum|
|
11
|
+
quotum.quotum_trackers.with_active_counter.map(&:reset!)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
protected
|
16
|
+
|
17
|
+
def quotum_in_period
|
18
|
+
raise ResourceQuotable::AbstractClassError
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ResourceQuotable
|
4
|
+
module Reset
|
5
|
+
# Reset Quota for daily period.
|
6
|
+
class Daily < Base
|
7
|
+
include ActiveModel::Validations
|
8
|
+
|
9
|
+
protected
|
10
|
+
|
11
|
+
def quotum_in_period
|
12
|
+
Quotum.daily_period
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ResourceQuotable
|
4
|
+
module Reset
|
5
|
+
# Reset Quota for Monthly period.
|
6
|
+
class Monthly < Base
|
7
|
+
include ActiveModel::Validations
|
8
|
+
|
9
|
+
protected
|
10
|
+
|
11
|
+
def quotum_in_period
|
12
|
+
Quotum.monthly_period
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ResourceQuotable
|
4
|
+
module Reset
|
5
|
+
# Reset Quota for Weekly period.
|
6
|
+
class Weekly < Base
|
7
|
+
include ActiveModel::Validations
|
8
|
+
|
9
|
+
protected
|
10
|
+
|
11
|
+
def quotum_in_period
|
12
|
+
Quotum.weekly_period
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ResourceQuotable
|
4
|
+
module Reset
|
5
|
+
# Reset Quota for Yearly period.
|
6
|
+
class Yearly < Base
|
7
|
+
include ActiveModel::Validations
|
8
|
+
|
9
|
+
protected
|
10
|
+
|
11
|
+
def quotum_in_period
|
12
|
+
Quotum.yearly_period
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ResourceQuotable
|
4
|
+
# Update Quota and reset QuotumTracker flag according
|
5
|
+
class Update < Base
|
6
|
+
attr_accessor :quotum, :limit
|
7
|
+
|
8
|
+
validates :quotum, presence: true
|
9
|
+
validates_numericality_of :limit, only_integer: true, greater_than_or_equal_to: 0
|
10
|
+
|
11
|
+
def call
|
12
|
+
quotum.update(limit: limit)
|
13
|
+
|
14
|
+
# rubocop:disable Rails/SkipsModelValidations
|
15
|
+
# We know what we are doing. Validation and callback are not needed here.
|
16
|
+
quotum.quotum_trackers.under_limit(limit).flagged.update_all(flag: false)
|
17
|
+
quotum.quotum_trackers.over_limit(limit).not_flagged.update_all(flag: true)
|
18
|
+
# rubocop:enable Rails/SkipsModelValidations
|
19
|
+
|
20
|
+
quotum
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<title>Resource quotable</title>
|
5
|
+
<%= csrf_meta_tags %>
|
6
|
+
<%= csp_meta_tag %>
|
7
|
+
|
8
|
+
<%= stylesheet_link_tag "resource_quotable/application", media: "all" %>
|
9
|
+
</head>
|
10
|
+
<body>
|
11
|
+
|
12
|
+
<%= yield %>
|
13
|
+
|
14
|
+
</body>
|
15
|
+
</html>
|
@@ -0,0 +1,11 @@
|
|
1
|
+
<%= form_for @quotum, method: :put, remote: true do |f| %>
|
2
|
+
<fieldset>
|
3
|
+
<div class="form-group col-md-12">
|
4
|
+
<label class="form-control-label">Limit</label>
|
5
|
+
<%= f.number_field :limit, class: 'form-control', required: true %>
|
6
|
+
</div>
|
7
|
+
<div class="form-group col-md-12">
|
8
|
+
<%= f.submit 'Save', class: 'btn btn-success' %>
|
9
|
+
</div>
|
10
|
+
</fieldset>
|
11
|
+
<% end %>
|
@@ -0,0 +1,43 @@
|
|
1
|
+
<div class="row">
|
2
|
+
<div class="col-md-12">
|
3
|
+
<div class="panel panel-inverse lobiable lobi_scrollable" data-unpin=false data-minimize=false data-close=false data-edit-title=false data-reload=false data-edit=false data-fullscreen=true>
|
4
|
+
<div class="panel-heading">
|
5
|
+
<div class="panel-title" style="max-width: calc(100% - 120px);">
|
6
|
+
<h4>Quotas</h4>
|
7
|
+
</div>
|
8
|
+
</div>
|
9
|
+
|
10
|
+
<div class="panel-body" >
|
11
|
+
<% if @quota.empty? %>
|
12
|
+
<div class='row'>
|
13
|
+
<div class='col-md-12 text-center'>
|
14
|
+
<h3>No results</h3>
|
15
|
+
</div>
|
16
|
+
</div>
|
17
|
+
<% else %>
|
18
|
+
<div class='row'>
|
19
|
+
<div class='col-md-12'>
|
20
|
+
<table id='resource_quotable_table' class="table table-striped medium text-left">
|
21
|
+
<tbody>
|
22
|
+
<tr>
|
23
|
+
<th>Id</th>
|
24
|
+
<th>User</th>
|
25
|
+
<th>Resource</th>
|
26
|
+
<th>Action</th>
|
27
|
+
<th>Period</th>
|
28
|
+
<th>Limit</th>
|
29
|
+
<th></th>
|
30
|
+
</tr>
|
31
|
+
<% @quota.each do |quotum| %>
|
32
|
+
<%= render partial: 'resource_quotable/quota/index/row', locals: { quotum: quotum } %>
|
33
|
+
<% end %>
|
34
|
+
</tbody>
|
35
|
+
</table>
|
36
|
+
<%= paginate @quota, remote: true %>
|
37
|
+
</div>
|
38
|
+
</div>
|
39
|
+
<% end %>
|
40
|
+
</div>
|
41
|
+
</div>
|
42
|
+
</div>
|
43
|
+
</div>
|
@@ -0,0 +1,34 @@
|
|
1
|
+
<%= form_for @quotum_limit, remote: true do |f| %>
|
2
|
+
<fieldset>
|
3
|
+
<%= f.fields_for :quotum do |quotum_form| %>
|
4
|
+
<div class="form-group col-md-12">
|
5
|
+
<label class="form-control-label">User</label>
|
6
|
+
<%= quotum_form.select :user_id, options_from_collection_for_select(ResourceQuotable.user_class.all, :id, :name), { prompt: 'Select' }, class: "form-control", required: true %>
|
7
|
+
</div>
|
8
|
+
|
9
|
+
<div class="form-group col-md-12">
|
10
|
+
<label class="form-control-label">Resource</label>
|
11
|
+
<%= quotum_form.select :resource_class, options_for_select(ResourceQuotable.resources, @quotum_limit.quotum.resource_class), { prompt: 'Select' }, class: "form-control", required: true %>
|
12
|
+
</div>
|
13
|
+
|
14
|
+
<div class="form-group col-md-12">
|
15
|
+
<label class="form-control-label">Action</label>
|
16
|
+
<%= quotum_form.select :action, options_for_select(ResourceQuotable.actions.keys, @quotum_limit.quotum.action.to_s), { prompt: 'Select' }, class: "form-control", required: true %>
|
17
|
+
</div>
|
18
|
+
<% end %>
|
19
|
+
|
20
|
+
<div class="form-group col-md-12">
|
21
|
+
<label class="form-control-label">Period</label>
|
22
|
+
<%= f.select :period, options_for_select(ResourceQuotable::QuotumLimit.periods.keys, @quotum_limit.period.to_s), { prompt: 'Select' }, class: "form-control", required: true %>
|
23
|
+
</div>
|
24
|
+
|
25
|
+
<div class="form-group col-md-12">
|
26
|
+
<label class="form-control-label">Limit</label>
|
27
|
+
<%= f.number_field :limit, class: 'form-control', required: true %>
|
28
|
+
</div>
|
29
|
+
|
30
|
+
<div class="form-group col-md-12">
|
31
|
+
<%= f.submit 'Save', class: 'btn btn-success' %>
|
32
|
+
</div>
|
33
|
+
</fieldset>
|
34
|
+
<% end %>
|
@@ -0,0 +1,41 @@
|
|
1
|
+
<div class="row">
|
2
|
+
<div class="col-md-12">
|
3
|
+
<div class="panel panel-inverse lobiable lobi_scrollable" data-unpin=false data-minimize=false data-close=false data-edit-title=false data-reload=false data-edit=false data-fullscreen=true>
|
4
|
+
<div class="panel-heading">
|
5
|
+
<div class="panel-title" style="max-width: calc(100% - 120px);">
|
6
|
+
<h4>Quota Details for <%= "#{@quotum.action} #{@quotum.resource_class}. Period: #{@quotum.period}" %></h4>
|
7
|
+
</div>
|
8
|
+
</div>
|
9
|
+
|
10
|
+
<div class="panel-body" >
|
11
|
+
<% if @quotum_trackers.empty? %>
|
12
|
+
<div class='row'>
|
13
|
+
<div class='col-md-12 text-center'>
|
14
|
+
<h3>No results</h3>
|
15
|
+
</div>
|
16
|
+
</div>
|
17
|
+
<% else %>
|
18
|
+
<div class='row'>
|
19
|
+
<div class='col-md-12'>
|
20
|
+
<table id='resource_quotable_table' class="table table-striped medium text-left">
|
21
|
+
<tbody>
|
22
|
+
<tr>
|
23
|
+
<th>Id</th>
|
24
|
+
<th>User</th>
|
25
|
+
<th>Counter</th>
|
26
|
+
<th>Flag</th>
|
27
|
+
<th></th>
|
28
|
+
</tr>
|
29
|
+
<% @quotum_trackers.each do |quotum_tracker| %>
|
30
|
+
<%= render partial: 'resource_quotable/quota/show/row', locals: { quotum_tracker: quotum_tracker } %>
|
31
|
+
<% end %>
|
32
|
+
</tbody>
|
33
|
+
</table>
|
34
|
+
<%= paginate @quotum_trackers, remote: true %>
|
35
|
+
</div>
|
36
|
+
</div>
|
37
|
+
<% end %>
|
38
|
+
</div>
|
39
|
+
</div>
|
40
|
+
</div>
|
41
|
+
</div>
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= render partial: 'edit' %>
|
@@ -0,0 +1 @@
|
|
1
|
+
$("#<%= ResourceQuotable.main_content %>").html("<%= escape_javascript render partial: 'edit' %>")
|
@@ -0,0 +1,43 @@
|
|
1
|
+
<td><%= link_to quotum.id, quotum_path(quotum), remote: true %></td>
|
2
|
+
<td><%= quotum.user.name %></td>
|
3
|
+
<td><%= quotum.resource_class %></td>
|
4
|
+
<td><%= quotum.action %></td>
|
5
|
+
<td><%= quotum.period %></td>
|
6
|
+
<td><%= quotum.limit %></td>
|
7
|
+
|
8
|
+
<td class='text-right'>
|
9
|
+
<%= link_to '',
|
10
|
+
reset_quotum_path(quotum),
|
11
|
+
remote: true,
|
12
|
+
method: :put,
|
13
|
+
data: {
|
14
|
+
confirm: 'Are you sure you want to reset this quotum?',
|
15
|
+
tooltip: 'Reset quotum',
|
16
|
+
toggle: 'tooltip',
|
17
|
+
title: 'Reset quotum',
|
18
|
+
placement: 'bottom'
|
19
|
+
},
|
20
|
+
class: "fa fa-reload" %>
|
21
|
+
<%= link_to '',
|
22
|
+
edit_quotum_path(quotum),
|
23
|
+
remote: true,
|
24
|
+
class: 'fa fa-edit',
|
25
|
+
data: {
|
26
|
+
tooltip: 'Edit',
|
27
|
+
title: 'Edit',
|
28
|
+
toggle:'tooltip',
|
29
|
+
placement: 'left'
|
30
|
+
} %>
|
31
|
+
<%= link_to '',
|
32
|
+
quotum_path(quotum),
|
33
|
+
remote: true,
|
34
|
+
method: :delete,
|
35
|
+
data: {
|
36
|
+
confirm: 'Are you sure you want to destroy this quotum?',
|
37
|
+
tooltip: 'Delete',
|
38
|
+
toggle: 'tooltip',
|
39
|
+
title: 'Delete',
|
40
|
+
placement: 'left'
|
41
|
+
},
|
42
|
+
class: 'fa fa-trash' %>
|
43
|
+
</td>
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= render partial: 'index' %>
|
@@ -0,0 +1 @@
|
|
1
|
+
$("#<%= ResourceQuotable.main_content %>").html("<%= escape_javascript render partial: 'index' %>")
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= render partial: 'new' %>
|
@@ -0,0 +1 @@
|
|
1
|
+
$("#<%= ResourceQuotable.main_content %>").html("<%= escape_javascript render partial: 'new' %>")
|
@@ -0,0 +1,7 @@
|
|
1
|
+
<td><%= quotum_tracker.id %></td>
|
2
|
+
<td><%= link_to quotum_tracker.user.full_name, sp_app_user_path(quotum_tracker.user), remote: true, class: 'leadser_js_link_disable leadser_ujs_partial', data: { 'partial-spinner_div': '#leadser_page_content', 'url-push': true } %>
|
3
|
+
<td><%= quotum_tracker.counter %>/<%= quotum_tracker.limit %></td>
|
4
|
+
<td><%= quotum_tracker.flag %></td>
|
5
|
+
|
6
|
+
<td class='text-right'>
|
7
|
+
</td>
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= render partial: 'show' %>
|
@@ -0,0 +1 @@
|
|
1
|
+
$("#<%= ResourceQuotable.main_content %>").html("<%= escape_javascript render partial: 'show' %>")
|
data/config/routes.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class CreateResourceQuotableQuota < ActiveRecord::Migration[4.2] # :nodoc:
|
4
|
+
def change
|
5
|
+
create_table :resource_quotable_quota do |t|
|
6
|
+
t.integer :group_id, null: false, index: true
|
7
|
+
t.string :group_type, null: false
|
8
|
+
t.string :resource_class, null: false
|
9
|
+
t.integer :action, null: false, default: 0
|
10
|
+
t.integer :period, null: false, default: 0
|
11
|
+
t.integer :limit, null: false, default: 1
|
12
|
+
|
13
|
+
t.timestamps
|
14
|
+
end
|
15
|
+
add_index :resource_quotable_quota, %i[group_id resource_class action period], unique: true, name: 'resource_quotable_quota_unique_index'
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# rubocop:disable Rails/CreateTableWithTimestamps
|
4
|
+
# No needs for timestamp here.
|
5
|
+
class CreateResourceQuotableQuotumTrackers < ActiveRecord::Migration[4.2] # :nodoc:
|
6
|
+
def change
|
7
|
+
create_table :resource_quotable_quotum_trackers do |t|
|
8
|
+
t.integer :quotum_id, null: false, index: true
|
9
|
+
t.integer :user_id, null: false, index: true
|
10
|
+
t.string :user_type, null: false
|
11
|
+
t.boolean :flag, null: false, default: false
|
12
|
+
t.integer :counter, null: false, default: 0
|
13
|
+
end
|
14
|
+
add_index :resource_quotable_quotum_trackers, %i[user_id quotum_id], unique: true, name: 'resource_quotable_quotum_trackers_unique_index'
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
# rubocop:enable Rails/CreateTableWithTimestamps
|
@@ -0,0 +1,73 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ResourceQuotable
|
4
|
+
# API inclusion to ApplicationController in order to allow customizations.
|
5
|
+
#
|
6
|
+
module AllowedToManageQuotaCheck
|
7
|
+
extend ActiveSupport::Concern
|
8
|
+
|
9
|
+
included do
|
10
|
+
helper_method :allowed_to?
|
11
|
+
|
12
|
+
def allowed_to?(action, resource)
|
13
|
+
!ResourceQuotable::ActionServices::Check.call(
|
14
|
+
user: load_quotable_tracker_user,
|
15
|
+
resource: resource,
|
16
|
+
action: action
|
17
|
+
)
|
18
|
+
end
|
19
|
+
|
20
|
+
def allowed_to_do_multi?(action, resource, amount)
|
21
|
+
!ResourceQuotable::ActionServices::CheckMultiple.call(
|
22
|
+
user: load_quotable_tracker_user,
|
23
|
+
resource: resource,
|
24
|
+
action: action,
|
25
|
+
amount: amount
|
26
|
+
)
|
27
|
+
end
|
28
|
+
|
29
|
+
def quota_authorize!(action, resource)
|
30
|
+
raise ResourceQuotable::QuotaLimitError unless allowed_to?(action, resource)
|
31
|
+
end
|
32
|
+
|
33
|
+
def quota_authorize_multiple!(action, resource, amount)
|
34
|
+
raise ResourceQuotable::QuotaMultiLimitError unless allowed_to_do_multi?(action, resource, amount)
|
35
|
+
end
|
36
|
+
|
37
|
+
def quota_increment!(action, resource)
|
38
|
+
quota_authorize!(action, resource)
|
39
|
+
ResourceQuotable::ActionServices::Increment.call(
|
40
|
+
user: load_quotable_tracker_user,
|
41
|
+
resource: resource,
|
42
|
+
action: action
|
43
|
+
)
|
44
|
+
end
|
45
|
+
|
46
|
+
def quota_increment_multiple!(action, resource, amount)
|
47
|
+
quota_authorize_multiple!(action, resource, amount)
|
48
|
+
ResourceQuotable::ActionServices::IncrementMultiple.call(
|
49
|
+
user: load_quotable_tracker_user,
|
50
|
+
resource: resource,
|
51
|
+
action: action,
|
52
|
+
amount: amount
|
53
|
+
)
|
54
|
+
end
|
55
|
+
|
56
|
+
def allowed_to_manage_quota?
|
57
|
+
true
|
58
|
+
end
|
59
|
+
|
60
|
+
def quota_scoped
|
61
|
+
Quotum
|
62
|
+
end
|
63
|
+
|
64
|
+
def load_quotable_tracker_user
|
65
|
+
current_user
|
66
|
+
end
|
67
|
+
|
68
|
+
def load_quotable_group; end
|
69
|
+
def resource_quotable_before; end
|
70
|
+
def resource_quotable_after; end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ResourceQuotable
|
4
|
+
module ActsAsQuotaTrackable # :nodoc:
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
class_methods do
|
8
|
+
def acts_as_quota_trackable(_options = {})
|
9
|
+
has_many :quotum_trackers,
|
10
|
+
dependent: :destroy,
|
11
|
+
class_name: 'ResourceQuotable::QuotumTracker',
|
12
|
+
foreign_key: 'user_id',
|
13
|
+
inverse_of: :user
|
14
|
+
|
15
|
+
define_method(:resource_quotable_group) { send(ResourceQuotable.group_method) }
|
16
|
+
|
17
|
+
define_method(:quota_for_resource_action) do |resource, action|
|
18
|
+
resource_quotable_group.quota.for_resource_action(resource, action)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ResourceQuotable
|
4
|
+
module ActsAsQuotable # :nodoc:
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
class_methods do
|
8
|
+
def acts_as_quotable(_options = {})
|
9
|
+
has_many :quota,
|
10
|
+
dependent: :destroy,
|
11
|
+
class_name: 'ResourceQuotable::Quotum',
|
12
|
+
foreign_key: 'group_id',
|
13
|
+
inverse_of: :group
|
14
|
+
|
15
|
+
define_method(:resource_quotable_users) { send(ResourceQuotable.users_method) }
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|