From 12d4b7f65988bd702d2e4573d762df5cfa39c879 Mon Sep 17 00:00:00 2001 From: Eivind Tagseth Date: Tue, 16 Nov 2021 13:24:13 +0100 Subject: [PATCH 1/4] Add REST/JSON interface to access an issue's release note --- app/controllers/release_notes_controller.rb | 11 +++++++++++ app/models/release_notes_generator.rb | 8 ++++++++ app/views/release_notes/view.api.rsb | 7 +++++++ config/routes.rb | 6 ++++++ 4 files changed, 32 insertions(+) create mode 100644 app/views/release_notes/view.api.rsb diff --git a/app/controllers/release_notes_controller.rb b/app/controllers/release_notes_controller.rb index 821731b..90e6f2c 100755 --- a/app/controllers/release_notes_controller.rb +++ b/app/controllers/release_notes_controller.rb @@ -63,6 +63,17 @@ def update render_404 end + def view + @issue = Issue.find(params[:issue_id]) + @release_note = @issue.release_note + @format = release_notes_format_from_params + @content = ReleaseNotesGenerator.new(nil, @format).generate_single(@release_note) + + respond_to do |format| + format.api {} + end + end + def destroy release_note = ReleaseNote.find(params[:id]) @issue = release_note.issue diff --git a/app/models/release_notes_generator.rb b/app/models/release_notes_generator.rb index e1dc311..13d877f 100755 --- a/app/models/release_notes_generator.rb +++ b/app/models/release_notes_generator.rb @@ -92,6 +92,14 @@ def generate generate_header << "\n" << generate_release_notes end + def generate_single(release_note) + str = format.start + str << "\n" + str << make_substitutions(format.each_issue, values_for_issue(release_note.issue)) + str << "\n" + str << format.end + end + private def generate_header make_substitutions(format.header, values_for_header(version)) diff --git a/app/views/release_notes/view.api.rsb b/app/views/release_notes/view.api.rsb new file mode 100644 index 0000000..75e1cd7 --- /dev/null +++ b/app/views/release_notes/view.api.rsb @@ -0,0 +1,7 @@ +api.release_note do + api.id @release_note.id + api.issue_id @release_note.issue_id + api.status @issue.release_notes_custom_value.value + api.text @release_note.text + api.formatted @content +end diff --git a/config/routes.rb b/config/routes.rb index c369cb9..7bd21f1 100755 --- a/config/routes.rb +++ b/config/routes.rb @@ -26,6 +26,12 @@ :to => "release_notes#generate", :as => :generate_release_notes + get "/issues/:issue_id/release_notes", + :to => 'release_notes#view', + :as => :release_note_view, + defaults: { format: 'json' } + + patch 'release_notes_formats/preview', :to => 'release_notes_formats#preview', :as => :preview_release_notes_format From ec5d35225d3a0a9f60d69638ba3a5d975679bc8e Mon Sep 17 00:00:00 2001 From: Eivind Tagseth Date: Tue, 16 Nov 2021 14:27:43 +0100 Subject: [PATCH 2/4] Singular --- config/routes.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/routes.rb b/config/routes.rb index 7bd21f1..563cba9 100755 --- a/config/routes.rb +++ b/config/routes.rb @@ -26,7 +26,7 @@ :to => "release_notes#generate", :as => :generate_release_notes - get "/issues/:issue_id/release_notes", + get "/issues/:issue_id/release_note", :to => 'release_notes#view', :as => :release_note_view, defaults: { format: 'json' } From 4fcc109f9be73a3b52ce980a63659b6bb445c74e Mon Sep 17 00:00:00 2001 From: Eivind Tagseth Date: Tue, 16 Nov 2021 15:10:02 +0100 Subject: [PATCH 3/4] Handle missing release note --- app/controllers/release_notes_controller.rb | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/app/controllers/release_notes_controller.rb b/app/controllers/release_notes_controller.rb index 90e6f2c..f95daf0 100755 --- a/app/controllers/release_notes_controller.rb +++ b/app/controllers/release_notes_controller.rb @@ -67,10 +67,14 @@ def view @issue = Issue.find(params[:issue_id]) @release_note = @issue.release_note @format = release_notes_format_from_params - @content = ReleaseNotesGenerator.new(nil, @format).generate_single(@release_note) - - respond_to do |format| - format.api {} + if @release_note + @content = ReleaseNotesGenerator.new(nil, @format).generate_single(@release_note) + + respond_to do |format| + format.api {} + end + else + render_404 end end From f0c5c1b3e6f34be2f67779b837a4918f1d428014 Mon Sep 17 00:00:00 2001 From: Eivind Tagseth Date: Fri, 26 Nov 2021 08:59:30 +0100 Subject: [PATCH 4/4] Include release note in issues api is requested Doesn't look like the optimal way of doing it, but it's the only one I found. Inspired by the backlogs plugin. --- .../issues_controller_patch.rb | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/lib/redmine_release_notes/issues_controller_patch.rb b/lib/redmine_release_notes/issues_controller_patch.rb index 4811095..7187150 100644 --- a/lib/redmine_release_notes/issues_controller_patch.rb +++ b/lib/redmine_release_notes/issues_controller_patch.rb @@ -16,10 +16,48 @@ module RedmineReleaseNotes module IssuesControllerPatch + def self.included(base) + base.extend(ClassMethods) + base.send(:include, InstanceMethods) + + base.class_eval do + unloadable + after_action :add_releasenotes_fields, :only => [:index, :show] + end + end def self.perform IssuesController.class_eval do helper 'release_notes' end end + module ClassMethods + end + module InstanceMethods + def add_releasenotes_fields + if include_in_api_response?('release_notes') + case params[:format] + when 'xml' + body = Nokogiri::XML(response.body) + body.xpath('//issue').each { |xmlissue| + issue = Issue.find(xmlissue.at('.//id').text) + next unless issue.release_notes_done? + xmlissue << body.create_element('release_note', issue.release_note.text) + } + response.body = body.to_xml + when 'json' + jsonp = (request.params[:callback] || request.params[:jsonp]).to_s.gsub(/[^a-zA-Z0-9_]/, '') + body = JSON.parse(jsonp.present? ? response.body.sub("#{jsonp}(", "").chop : response.body) + (body['issues'] || [body['issue']]).each{|j_issue| + issue = Issue.find(j_issue['id']) + next unless issue.release_notes_done? + j_issue['release_note'] = issue.release_note.text + } + response.body = jsonp.present? ? "#{jsonp}(#{body.to_json})" : body.to_json + end + end + end + end end end + +IssuesController.send(:include, RedmineReleaseNotes::IssuesControllerPatch) unless IssuesController.included_modules.include? RedmineReleaseNotes::IssuesControllerPatch