resque-approval
A Resque plugin allowing jobs to be sent to a temporary queue to await approval. Once the job is approved, it is placed on its normal queue.
Installation
Add this line to your application's Gemfile:
gem 'resque-approval'
And then execute:
$ bundle
Or install it yourself as:
$ gem install resque-approval
Usage
To enable approval holding for a job class, simply extend that class with Resque::Plugins::Approval, like so:
class Job
extend Resque::Plugins::Approval
@queue = 'dummy'
def self.perform
# ...
end
end
Then, when you want to queue up a job of that class, add a couple special arguments to your job:
Resque.enqueue(Job, :requires_approval => true, :approval_message => 'Test')
:requires_approval
tells resque-approval to put your job in a special queue to
wait for approval. If its missing or false, your job is placed in its default
queue.
:approval_message
is an optional message you can reference later.
To get a list of pending jobs:
Resque::Plugins::Approval.pending_job_keys
This will return a list in first-in, first-out order. Each entry contains an id and any message you may have specified when enqueueing the job.
To approve a job:
Job.approve(key)
where key is an entry from the list returned by pending_job_keys. This will move the job from the approval_required queue to the default queue for that job.
To reject a job:
Job.reject(key)
This will delete the job from the approval_required queue, but will not move it to the job's default queue. This effectively drops the job from the system.
Example
A sample session using the Job class above might look like this:
# Queue up a job with a message.
Resque.enqueue(Job, :requires_approval => true, :approval_message => 'Just a test')
# Queue up a job without a message.
Resque.enqueue(Job, :requires_approval => true)
# List the ids and messages.
pending_actions = Resque::Plugins::Approval.pending_job_keys
pending_actions.each do |action|
puts "id: #{action['id'], message: #{action['approval_message']}"
end
# Approve the first job...
Job.approve(pending_actions[0])
# But reject the second
Job.reject(pending_actions[1])
Contributing
- Fork it
- Create your feature branch (
git checkout -b my-new-feature
) - Commit your changes (
git commit -am 'Added some feature'
) - Push to the branch (
git push origin my-new-feature
) - Create new Pull Request