deferred_request 1.0.0 → 1.0.4
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/README.md +24 -4
- data/app/controllers/deferred_request/test_controller.rb +19 -0
- data/app/helpers/deferred_request/test_helper.rb +4 -0
- data/app/jobs/deferred_request/deferred_request_job.rb +1 -1
- data/app/models/deferred_request/deferred_request.rb +7 -4
- data/config/routes.rb +2 -0
- data/lib/deferred_request/version.rb +1 -1
- data/lib/deferred_request.rb +7 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e70685ead353b7f372259b99b066332d915805dfbf38ddedc21078f44b74ed82
|
4
|
+
data.tar.gz: 39af06490c5cfa0da0c3f915e5d36a97512e0c01507cd4dc5b69bc63c2e6a6b0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cd8748279c4834f63a412102aca293c3b60ab750386057e898060a7b400467b3130b32bfc2a9840c5dfc687810a78fb4e0b351d2bd6a78148134ae3e0d25e69f
|
7
|
+
data.tar.gz: a85efe11d6530d6071f5562e5c8fe7920e20f0c8fccb88fa30527ec13559323ead68b5dfe46f40bea44e97fd31d464ae85351352dff5ff39be4d563ef30b0dfd
|
data/README.md
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
[](https://badge.fury.io/rb/deferred_request)
|
2
|
+
|
1
3
|
# Deferred Request
|
2
4
|
A simple plugin to defer an http request until you can actually process it. This is good in situtations where work performed is not needed immidiately (think status callbacks from services like Twilio or Stripe). This pattern can help prevent you from getting DDoS'd by services you might interact with.
|
3
5
|
|
@@ -45,10 +47,7 @@ def status_callback
|
|
45
47
|
head :ok
|
46
48
|
|
47
49
|
# Then queue the request to run later
|
48
|
-
deferred_request = DeferredRequest::DeferredRequest.
|
49
|
-
deferred_request.save!
|
50
|
-
|
51
|
-
deferred_request.peform_later
|
50
|
+
deferred_request = DeferredRequest::DeferredRequest.perform_later_from_request!(request)
|
52
51
|
end
|
53
52
|
|
54
53
|
# Your deferred request method will be called later (via a job)
|
@@ -65,6 +64,27 @@ end
|
|
65
64
|
# ...
|
66
65
|
```
|
67
66
|
|
67
|
+
### Class Methods
|
68
|
+
- `DeferredRequest::DeferredRequest.from_request(request)` - returns a DeferredRequest::DeferredRequest object (unsaved). Returns the DeferredRequest::DeferredRequest instance.
|
69
|
+
- `DeferredRequest::DeferredRequest.perform_later_from_request!(request)` - creates a deferred request (saved) and enqueues job to process the request. Returns the DeferredRequest::DeferredRequest instance.
|
70
|
+
|
71
|
+
### Instance Methods
|
72
|
+
- `deferred_request.perform_later` - Enqueues a job to `perform!` the deferred request later. Returns the job id.
|
73
|
+
- `deferred_request.perform!` - Calls the `#{controller}_deferred(deferred_request)` method to be processed. Returns the deferred_request instance or raises an exception.
|
74
|
+
|
75
|
+
## Configuration
|
76
|
+
|
77
|
+
- `DeferredRequest.model_parent_class` - Set the parent class
|
78
|
+
- `DeferredRequest.deferred_request_instance_class` - Set the instance class that is created (in-case you sub-class)
|
79
|
+
- `DeferredRequest.job_queue` - Set the job queue for the deferred request job
|
80
|
+
|
81
|
+
```ruby
|
82
|
+
# config/initializers/deferred_request.rb
|
83
|
+
DeferredRequest.model_parent_class = "MyParentClass"
|
84
|
+
DeferredRequest.job_queue = "low"
|
85
|
+
```
|
86
|
+
|
87
|
+
|
68
88
|
## 🙏 Contributing
|
69
89
|
|
70
90
|
If you have an issue you'd like to submit, please do so using the issue tracker in GitHub. In order for us to help you in the best way possible, please be as detailed as you can.
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module DeferredRequest
|
2
|
+
class TestController < ApplicationController
|
3
|
+
def status_callback
|
4
|
+
head :ok
|
5
|
+
DeferredRequest.perform_later_from_request!(request)
|
6
|
+
end
|
7
|
+
|
8
|
+
def status_callback_deferred(deferred_request)
|
9
|
+
# Do something with the deferred request
|
10
|
+
deferred_request.params.dig("answer")
|
11
|
+
end
|
12
|
+
|
13
|
+
def status_error
|
14
|
+
# don't add the "_deferred" method (used for testing)
|
15
|
+
head :ok
|
16
|
+
DeferredRequest.perform_later_from_request!(request)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -1,7 +1,8 @@
|
|
1
1
|
module DeferredRequest
|
2
|
-
class DeferredRequest <
|
2
|
+
class DeferredRequest < DeferredRequest.model_parent_class.constantize
|
3
3
|
serialize :routing, JSON
|
4
4
|
serialize :request, JSON
|
5
|
+
serialize :result, JSON
|
5
6
|
|
6
7
|
store_accessor :routing, "controller", "action"
|
7
8
|
store_accessor :request, "url", "method", "headers", "params", "remote_ip"
|
@@ -11,9 +12,9 @@ module DeferredRequest
|
|
11
12
|
# request: ActionDispatch::Request
|
12
13
|
# create a deferred request from a ActionDispatch::Request
|
13
14
|
def self.from_request(request)
|
14
|
-
deferred_request = DeferredRequest.new
|
15
|
+
deferred_request = ::DeferredRequest.deferred_request_instance_class.constantize.new
|
15
16
|
|
16
|
-
deferred_request.controller = request.controller_class
|
17
|
+
deferred_request.controller = request.controller_class.name
|
17
18
|
deferred_request.action = request.params["action"]
|
18
19
|
|
19
20
|
deferred_request.url = request.url
|
@@ -30,6 +31,8 @@ module DeferredRequest
|
|
30
31
|
deferred_request.save!
|
31
32
|
|
32
33
|
deferred_request.perform_later
|
34
|
+
|
35
|
+
deferred_request
|
33
36
|
end
|
34
37
|
|
35
38
|
def perform_later
|
@@ -43,7 +46,7 @@ module DeferredRequest
|
|
43
46
|
|
44
47
|
klass = controller.constantize.new
|
45
48
|
|
46
|
-
self.result = klass.
|
49
|
+
self.result = klass.send("#{action}_deferred".to_sym, self)
|
47
50
|
self.status = :complete
|
48
51
|
rescue => e
|
49
52
|
Rails.logger.error("DeferredRequest::DeferredRequestJob: #{e.message}")
|
data/config/routes.rb
CHANGED
data/lib/deferred_request.rb
CHANGED
@@ -4,5 +4,11 @@ require "deferred_request/engine"
|
|
4
4
|
module DeferredRequest
|
5
5
|
# Your code goes here...
|
6
6
|
mattr_accessor :model_parent_class
|
7
|
-
@@model_parent_class = "
|
7
|
+
@@model_parent_class = "ApplicationRecord"
|
8
|
+
|
9
|
+
mattr_accessor :deferred_request_instance_class
|
10
|
+
@@deferred_request_instance_class = "DeferredRequest::DeferredRequest"
|
11
|
+
|
12
|
+
mattr_accessor :job_queue
|
13
|
+
@@job_queue = "default"
|
8
14
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: deferred_request
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Austin Miller
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-02
|
11
|
+
date: 2022-08-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -52,7 +52,9 @@ files:
|
|
52
52
|
- app/assets/config/deferred_request_manifest.js
|
53
53
|
- app/assets/stylesheets/deferred_request/application.css
|
54
54
|
- app/controllers/deferred_request/application_controller.rb
|
55
|
+
- app/controllers/deferred_request/test_controller.rb
|
55
56
|
- app/helpers/deferred_request/application_helper.rb
|
57
|
+
- app/helpers/deferred_request/test_helper.rb
|
56
58
|
- app/jobs/deferred_request/application_job.rb
|
57
59
|
- app/jobs/deferred_request/deferred_request_job.rb
|
58
60
|
- app/mailers/deferred_request/application_mailer.rb
|