1
0
Эх сурвалжийг харах

a webhook agent to create events from webhooks.

j-wilkins 11 жил өмнө
parent
commit
66054f92c0

+ 35 - 0
app/models/agents/webhook_agent.rb

@@ -0,0 +1,35 @@
+module Agents
+  class WebhookAgent < Agent
+    cannot_be_scheduled!
+
+    description <<-MD
+      Use this Agent to create events by receiving webhooks from any source.
+
+      Options:
+
+        * `secret` - A token that the host will provide for authentication.
+    MD
+
+    def default_options
+      { "secret" => "supersecretstring", }
+    end
+
+    def receive_webhook(params)
+      return ["Not Authorized", 401] unless params[:secret] == options[:secret]
+
+      create_event(:payload => params[:payload])
+
+      ['Event Created', 201]
+    end
+
+    def working?
+      true
+    end
+
+    def validate_options
+      unless options[:secret].present?
+        errors.add(:base, "Must specify a :secret for 'Authenticating' requests")
+      end
+    end
+  end
+end

+ 31 - 0
spec/models/agents/webhook_agent_spec.rb

@@ -0,0 +1,31 @@
+require 'spec_helper'
+
+describe Agents::WebhookAgent do
+  let(:agent) do
+    _agent = Agents::WebhookAgent.new(:name => 'webhook',
+                             :options => {:secret => :foobar})
+    _agent.user = users(:bob)
+    _agent.save!
+    _agent
+  end
+
+  after { agent.destroy }
+
+  describe 'receive_webhook' do
+    it 'should create event if secret matches' do
+      out = nil
+      lambda {
+        out = agent.receive_webhook({:secret => :foobar, :payload => {:some => :info}})
+      }.should change { Event.count }.by(1)
+      out.should eq(['Event Created', 201])
+    end
+
+    it 'should not create event if secrets dont match' do
+      out = nil
+      lambda {
+        out = agent.receive_webhook({:secret => :bazbat, :payload => {:some => :info}})
+      }.should change { Event.count }.by(0)
+      out.should eq(['Not Authorized', 401])
+    end
+  end
+end