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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: dd9cbe479d0ec2429ded46aacbdd786b3ba69b19dcbc32609ca7875bb51b97a5
4
- data.tar.gz: fbdb8dee9068fb03bc4e5b6385968be177ad8b6e0d15149304d5876b0ec20bdc
3
+ metadata.gz: e70685ead353b7f372259b99b066332d915805dfbf38ddedc21078f44b74ed82
4
+ data.tar.gz: 39af06490c5cfa0da0c3f915e5d36a97512e0c01507cd4dc5b69bc63c2e6a6b0
5
5
  SHA512:
6
- metadata.gz: db92fd506d4170270ba261ca9c3909809fd3b411b36b6141d7f207840e60abcb72fb2862b934de4c5ea72e8d7ac99453e6fe97f5e0766b95ca48435d551f9b5d
7
- data.tar.gz: 0bd4f541e34984dd95f19942577e5a968c8f9b2fadf8bcf6151982fa8aea970259bf41264279aa47eb9d67abe457444973881b7a22f94652016349976ed5feb4
6
+ metadata.gz: cd8748279c4834f63a412102aca293c3b60ab750386057e898060a7b400467b3130b32bfc2a9840c5dfc687810a78fb4e0b351d2bd6a78148134ae3e0d25e69f
7
+ data.tar.gz: a85efe11d6530d6071f5562e5c8fe7920e20f0c8fccb88fa30527ec13559323ead68b5dfe46f40bea44e97fd31d464ae85351352dff5ff39be4d563ef30b0dfd
data/README.md CHANGED
@@ -1,3 +1,5 @@
1
+ [![Gem Version](https://badge.fury.io/rb/deferred_request.svg)](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.from_request(request)
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
@@ -0,0 +1,4 @@
1
+ module DeferredRequest
2
+ module TestHelper
3
+ end
4
+ end
@@ -1,6 +1,6 @@
1
1
  module DeferredRequest
2
2
  class DeferredRequestJob < ApplicationJob
3
- queue_as :default
3
+ queue_as ::DeferredRequest.job_queue
4
4
 
5
5
  def perform(*args)
6
6
  id = args[0]
@@ -1,7 +1,8 @@
1
1
  module DeferredRequest
2
- class DeferredRequest < ApplicationRecord
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.try("#{action}_deferred".to_sym, self)
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
@@ -1,2 +1,4 @@
1
1
  DeferredRequest::Engine.routes.draw do
2
+ post "status_callback" => "test#status_callback"
3
+ post "status_error" => "test#status_error"
2
4
  end
@@ -1,3 +1,3 @@
1
1
  module DeferredRequest
2
- VERSION = "1.0.0"
2
+ VERSION = "1.0.4"
3
3
  end
@@ -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 = "ActiveRecord::Base"
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.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-06 00:00:00.000000000 Z
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