lib/webhook_system/subscription.rb in webhook_system-0.0.1 vs lib/webhook_system/subscription.rb in webhook_system-0.1.0
- old
+ new
@@ -1,17 +1,51 @@
module WebhookSystem
+
+ # This is the model encompassing the actual record of a webhook subscription
class Subscription < ActiveRecord::Base
self.table_name = 'webhook_subscriptions'
- validates :url, presence: true
+ validates :url, presence: true, url: { no_local: true }
validates :secret, presence: true
has_many :topics, class_name: 'WebhookSystem::SubscriptionTopic', dependent: :destroy
+ accepts_nested_attributes_for :topics, allow_destroy: true
scope :active, -> { where(active: true) }
scope :for_topic, -> (topic) {
joins(:topics).where(WebhookSystem::SubscriptionTopic.table_name => { name: topic })
}
scope :interested_in_topic, -> (topic) { active.for_topic(topic) }
+
+ # Just a helper to get a nice representation of the subscription
+ def url_domain
+ URI.parse(url).host
+ end
+
+ # Abstraction around the topics relation, returns an array of the subscribed topic names
+ def topic_names
+ topics.map(&:name)
+ end
+
+ # Abstraction around the topics relation, sets the topic names, requires save to take effect
+ def topic_names=(new_topics)
+ new_topics.reject!(&:blank?)
+ add_topics = new_topics - topic_names
+
+ new_topics_attributes = []
+
+ topics.each do |topic|
+ new_topics_attributes << {
+ id: topic.id,
+ name: topic.name,
+ _destroy: !new_topics.include?(topic.name),
+ }
+ end
+
+ new_topics_attributes += add_topics.map { |topic| { name: topic } }
+
+ self.topics_attributes = new_topics_attributes
+ end
+
end
end