deferred_request 0.0.1 → 1.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +22 -4
- data/app/controllers/deferred_request/test_controller.rb +9 -16
- data/app/jobs/deferred_request/deferred_request_job.rb +1 -1
- data/app/models/deferred_request/deferred_request.rb +28 -21
- data/config/routes.rb +2 -1
- data/lib/deferred_request/version.rb +1 -1
- data/lib/deferred_request.rb +8 -0
- metadata +21 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4a12d759682c3ca5d2e1171cc6da944e80ce6a9b0f3ccfb65dcaca5d10b2a0c9
|
4
|
+
data.tar.gz: 6ef803175b32093e08d330caebb28d06fbd31e0c3db33f34304ec3163b31e63a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d2efcff67bba0f0d7fcd75ae8e08e8cb120412753cc1a1e5439ea37b13bae5323095a866e9d7671be31c13701e8c85aeeb060592537d9b1e087a658884a08cb7
|
7
|
+
data.tar.gz: 5004f590c976b08777e42753b19bb53588dfe54386e6470818ab366f60b363748f0c87728c963a499eba0cd6fafcbba0b422430c35353f784ff3d10921ff5399
|
data/README.md
CHANGED
@@ -45,10 +45,7 @@ def status_callback
|
|
45
45
|
head :ok
|
46
46
|
|
47
47
|
# Then queue the request to run later
|
48
|
-
deferred_request = DeferredRequest::DeferredRequest.
|
49
|
-
deferred_request.save!
|
50
|
-
|
51
|
-
deferred_request.peform_later
|
48
|
+
deferred_request = DeferredRequest::DeferredRequest.perform_later_from_request!(request)
|
52
49
|
end
|
53
50
|
|
54
51
|
# Your deferred request method will be called later (via a job)
|
@@ -65,6 +62,27 @@ end
|
|
65
62
|
# ...
|
66
63
|
```
|
67
64
|
|
65
|
+
### Class Methods
|
66
|
+
- `DeferredRequest::DeferredRequest.from_request(request)` - returns a DeferredRequest::DeferredRequest object (unsaved). Returns the DeferredRequest::DeferredRequest instance.
|
67
|
+
- `DeferredRequest::DeferredRequest.perform_later_from_request!(request)` - creates a deferred request (saved) and enqueues job to process the request. Returns the DeferredRequest::DeferredRequest instance.
|
68
|
+
|
69
|
+
### Instance Methods
|
70
|
+
- `deferred_request.perform_later` - Enqueues a job to `perform!` the deferred request later. Returns the job id.
|
71
|
+
- `deferred_request.perform!` - Calls the `#{controller}_deferred(deferred_request)` method to be processed. Returns the deferred_request instance or raises an exception.
|
72
|
+
|
73
|
+
## Configuration
|
74
|
+
|
75
|
+
- `DeferredRequest.model_parent_class` - Set the parent class
|
76
|
+
- `DeferredRequest.deferred_request_instance_class` - Set the instance class that is created (in-case you sub-class)
|
77
|
+
- `DeferredRequest.job_queue` - Set the job queue for the deferred request job
|
78
|
+
|
79
|
+
```ruby
|
80
|
+
# config/initializers/deferred_request.rb
|
81
|
+
DeferredRequest.model_parent_class = "MyParentClass"
|
82
|
+
DeferredRequest.job_queue = "low"
|
83
|
+
```
|
84
|
+
|
85
|
+
|
68
86
|
## 🙏 Contributing
|
69
87
|
|
70
88
|
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.
|
@@ -1,26 +1,19 @@
|
|
1
1
|
module DeferredRequest
|
2
2
|
class TestController < ApplicationController
|
3
|
-
skip_before_action :verify_authenticity_token
|
4
|
-
|
5
3
|
def status_callback
|
6
|
-
# We can go ahead and give a :ok response (fast and snappy)
|
7
4
|
head :ok
|
8
|
-
|
9
|
-
# Then queue the request to run later
|
10
|
-
deferred_request = DeferredRequest::DeferredRequest.from_request(request, params)
|
11
|
-
deferred_request.save!
|
12
|
-
|
13
|
-
deferred_request.peform_later
|
5
|
+
DeferredRequest.perform_later_from_request!(request)
|
14
6
|
end
|
15
7
|
|
16
8
|
def status_callback_deferred(deferred_request)
|
17
|
-
#
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
#
|
23
|
-
|
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)
|
24
17
|
end
|
25
18
|
end
|
26
19
|
end
|
@@ -1,7 +1,8 @@
|
|
1
1
|
module DeferredRequest
|
2
|
-
class DeferredRequest <
|
3
|
-
serialize :routing
|
4
|
-
serialize :request
|
2
|
+
class DeferredRequest < DeferredRequest.model_parent_class.constantize
|
3
|
+
serialize :routing
|
4
|
+
serialize :request
|
5
|
+
serialize :result
|
5
6
|
|
6
7
|
store_accessor :routing, "controller", "action"
|
7
8
|
store_accessor :request, "url", "method", "headers", "params", "remote_ip"
|
@@ -11,12 +12,11 @@ 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
|
-
|
17
|
-
deferred_request.controller = request.controller_class
|
17
|
+
deferred_request.controller = request.controller_class.name
|
18
18
|
deferred_request.action = request.params["action"]
|
19
|
-
|
19
|
+
|
20
20
|
deferred_request.url = request.url
|
21
21
|
deferred_request.method = request.method
|
22
22
|
deferred_request.headers = get_headers(request)
|
@@ -26,37 +26,44 @@ module DeferredRequest
|
|
26
26
|
deferred_request
|
27
27
|
end
|
28
28
|
|
29
|
+
def self.perform_later_from_request!(request)
|
30
|
+
deferred_request = DeferredRequest.from_request(request)
|
31
|
+
deferred_request.save!
|
32
|
+
|
33
|
+
deferred_request.perform_later
|
34
|
+
|
35
|
+
deferred_request
|
36
|
+
end
|
37
|
+
|
29
38
|
def perform_later
|
30
|
-
DeferredRequestJob.perform_later(
|
39
|
+
DeferredRequestJob.perform_later(id)
|
31
40
|
end
|
32
41
|
|
33
42
|
def perform!
|
34
43
|
begin
|
35
44
|
self.status = :processing
|
36
|
-
|
45
|
+
save!
|
37
46
|
|
38
|
-
klass =
|
47
|
+
klass = controller.constantize.new
|
39
48
|
|
40
|
-
self.result = klass.
|
49
|
+
self.result = klass.send("#{action}_deferred".to_sym, self)
|
41
50
|
self.status = :complete
|
42
51
|
rescue => e
|
43
52
|
Rails.logger.error("DeferredRequest::DeferredRequestJob: #{e.message}")
|
44
53
|
self.result = e.message
|
45
54
|
self.status = :error
|
46
55
|
end
|
47
|
-
|
48
|
-
self.save!
|
49
|
-
end
|
50
56
|
|
51
|
-
|
57
|
+
save!
|
58
|
+
end
|
52
59
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
end
|
60
|
+
def self.get_headers(request)
|
61
|
+
# Get the request headers from the request
|
62
|
+
{}.tap do |t|
|
63
|
+
request.headers.each do |key, value|
|
64
|
+
t[key] = value if key.downcase.starts_with?("http")
|
59
65
|
end
|
60
66
|
end
|
67
|
+
end
|
61
68
|
end
|
62
69
|
end
|
data/config/routes.rb
CHANGED
data/lib/deferred_request.rb
CHANGED
@@ -3,4 +3,12 @@ require "deferred_request/engine"
|
|
3
3
|
|
4
4
|
module DeferredRequest
|
5
5
|
# Your code goes here...
|
6
|
+
mattr_accessor :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"
|
6
14
|
end
|
metadata
CHANGED
@@ -1,29 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: deferred_request
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 1.0.2
|
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-02-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 6.0.0
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
26
|
+
version: 6.0.0
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: standardrb
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
27
41
|
description: A simple library to defer http requests until you can actually process
|
28
42
|
them. (Think webhooks. Stripe webhooks, Twilio status callbacks, ect.)
|
29
43
|
email:
|
@@ -75,7 +89,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
75
89
|
- !ruby/object:Gem::Version
|
76
90
|
version: '0'
|
77
91
|
requirements: []
|
78
|
-
rubygems_version: 3.2.
|
92
|
+
rubygems_version: 3.2.3
|
79
93
|
signing_key:
|
80
94
|
specification_version: 4
|
81
95
|
summary: Deferred Request
|