resource_quotable 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|