diff --git a/app/models/version.rb b/app/models/version.rb index 3ca4f2bff..68ff4cc31 100644 --- a/app/models/version.rb +++ b/app/models/version.rb @@ -123,6 +123,10 @@ class Version < ApplicationRecord before_destroy :nullify_projects_default_version after_save :update_default_project_version + after_create_commit ->{ Webhook.trigger('version.created', self) } + after_update_commit ->{ Webhook.trigger('version.updated', self) } + after_destroy_commit ->{ Webhook.trigger('version.deleted', self) } + belongs_to :project has_many :fixed_issues, :class_name => 'Issue', :foreign_key => 'fixed_version_id', :dependent => :nullify, :extend => FixedIssuesExtension @@ -412,6 +416,14 @@ class Version < ApplicationRecord @default_project_version = (arg == '1' || arg == true) end + def created_on + created_at + end + + def updated_on + updated_at + end + private # Update the issue's fixed versions. Used if a version's sharing changes. diff --git a/app/models/webhook_payload.rb b/app/models/webhook_payload.rb index eeab9a921..0a080d827 100644 --- a/app/models/webhook_payload.rb +++ b/app/models/webhook_payload.rb @@ -32,6 +32,7 @@ class WebhookPayload wiki_page: %w[created updated deleted], time_entry: %w[created updated deleted], news: %w[created updated deleted], + version: %w[created updated deleted], } def to_h @@ -150,6 +151,25 @@ class WebhookPayload } end + def version_payload(action) + version = object + ts = case action + when 'created' + version.created_on + when 'deleted' + Time.now + else + version.updated_on + end + { + type: event, + timestamp: ts.iso8601, + data: { + version: ApiRenderer.new("app/views/versions/show.api.rsb", user).to_h(version: version) + } + } + end + # given a path to an API template (relative to RAILS_ROOT), renders it and returns the resulting hash class ApiRenderer include ApplicationHelper diff --git a/test/unit/webhook_payload_test.rb b/test/unit/webhook_payload_test.rb index 317cec055..df60d36c6 100644 --- a/test/unit/webhook_payload_test.rb +++ b/test/unit/webhook_payload_test.rb @@ -156,4 +156,35 @@ class WebhookPayloadTest < ActiveSupport::TestCase assert_equal 'news.deleted', h[:type] assert_equal 'Updated title', h.dig(:data, :news, :title) end + + test "version created payload should contain version details" do + version = Version.generate! + + p = WebhookPayload.new('version.created', version, @dlopper) + assert h = p.to_h + assert_equal 'version.created', h[:type] + assert_equal version.name, h.dig(:data, :version, :name) + end + + test "version updated payload should contain updated timestamp" do + version = Version.first + + version.name = 'Updated name' + version.save! + + p = WebhookPayload.new('version.updated', version, @dlopper) + h = p.to_h + assert_equal 'version.updated', h[:type] + assert_equal 'Updated name', h.dig(:data, :version, :name) + end + + test "version deleted payload should contain basic info" do + version = Version.first + version.destroy + + p = WebhookPayload.new('version.deleted', version, @dlopper) + h = p.to_h + assert_equal 'version.deleted', h[:type] + assert_equal 'Updated name', h.dig(:data, :version, :name) + end end