1
0
mirror of https://github.com/meineerde/redmine.git synced 2026-02-01 03:57:15 +00:00

Adds webooks for versions (#29664).

git-svn-id: https://svn.redmine.org/redmine/trunk@24204 e93f8b46-1217-0410-a6f0-8f06a7374b81
This commit is contained in:
Marius Balteanu 2025-12-06 13:59:14 +00:00
parent ea0a6dfbcb
commit c749dc2bd3
3 changed files with 63 additions and 0 deletions

View File

@ -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.

View File

@ -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

View File

@ -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