Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 7 additions & 1 deletion app/controllers/api/v2/plans_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,13 @@ module Api
module V2
class PlansController < BaseApiController # rubocop:todo Style/Documentation
respond_to :json
before_action :set_complete_param, only: %i[show index]

# GET /api/v2/plans/:id
def show
raise Pundit::NotAuthorizedError unless @scopes.include?('read')

@plan = Plan.find_by(id: params[:id])
@plan = Plan.includes(roles: :user).find_by(id: params[:id])

raise Pundit::NotAuthorizedError unless @plan.present?

Expand All @@ -28,6 +29,11 @@ def index
@items = paginate_response(results: @plans)
render '/api/v2/plans/index', status: :ok
end

# GET /api/v2/plans?complete=true and /api/v2/plans/:id?complete=true
def set_complete_param
@complete = params[:complete].to_s.downcase == 'true'
end
end
end
end
23 changes: 21 additions & 2 deletions app/presenters/api/v2/plan_presenter.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@ module Api
module V2
# Helper class for the API V2 project / DMP
class PlanPresenter
attr_reader :data_contact, :contributors, :costs
attr_reader :data_contact, :contributors, :costs, :complete_plan_data

def initialize(plan:)
def initialize(plan:, complete: false)
@contributors = []
return unless plan.present?

Expand All @@ -22,6 +22,8 @@ def initialize(plan:)
end

@costs = plan_costs(plan: @plan)

@complete_plan_data = fetch_all_q_and_a if complete
end

# Extract the ARK or DOI for the DMP OR use its URL if none exists
Expand Down Expand Up @@ -55,6 +57,23 @@ def plan_costs(plan:)
currency_code: 'usd', value: answer.text }
end
end

# Fetch all questions and answers from a plan, regardless of theme
def fetch_all_q_and_a
answers = @plan.answers.includes(:question)
return [] unless answers.present?

answers.filter_map do |answer|
q = answer.question
next unless q.present?

{
title: "Question #{q.number || q.id}",
question: q.text.to_s,
answer: answer.text.to_s
}
end
end
end
end
end
15 changes: 14 additions & 1 deletion app/views/api/v2/plans/_show.json.jbuilder
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

json.schema 'https://github.com/RDA-DMP-Common/RDA-DMP-Common-Standard/tree/master/examples/JSON/JSON-schema/1.0'

presenter = Api::V2::PlanPresenter.new(plan: plan)
presenter = Api::V2::PlanPresenter.new(plan: plan, complete: @complete)

# Note the symbol of the dmproadmap json object
# nested in extensions which is the container for the json template object, etc.
Expand Down Expand Up @@ -68,5 +68,18 @@ unless @minimal
json.title template.title
end
end

if @complete
json.complete_plan do
q_and_a = presenter.complete_plan_data
next if q_and_a.blank?

json.array! q_and_a do |item|
json.title item[:title]
json.question item[:question]
json.answer item[:answer]
end
end
end
end
end