[GraphQL] expose dossier pdf, geojson and attestation
This commit is contained in:
parent
e3f2421741
commit
0aa06d0197
8 changed files with 129 additions and 3 deletions
26
app/controllers/api/v2/dossiers_controller.rb
Normal file
26
app/controllers/api/v2/dossiers_controller.rb
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
class API::V2::DossiersController < API::V2::BaseController
|
||||||
|
before_action :ensure_dossier_present
|
||||||
|
|
||||||
|
def pdf
|
||||||
|
@include_infos_administration = true
|
||||||
|
render(file: 'dossiers/show', formats: [:pdf])
|
||||||
|
end
|
||||||
|
|
||||||
|
def geojson
|
||||||
|
send_data dossier.to_feature_collection.to_json,
|
||||||
|
type: 'application/json',
|
||||||
|
filename: "dossier-#{dossier.id}-features.json"
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def ensure_dossier_present
|
||||||
|
if dossier.blank?
|
||||||
|
head :unauthorized
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def dossier
|
||||||
|
@dossier ||= GlobalID::Locator.locate_signed(params[:id].to_s, for: 'api_v2')
|
||||||
|
end
|
||||||
|
end
|
|
@ -1,6 +1,5 @@
|
||||||
module Types::Champs
|
module Types::Champs
|
||||||
class PieceJustificativeChampType < Types::BaseObject
|
class PieceJustificativeChampType < Types::BaseObject
|
||||||
include Rails.application.routes.url_helpers
|
|
||||||
implements Types::ChampType
|
implements Types::ChampType
|
||||||
|
|
||||||
field :file, Types::File, null: true, extensions: [
|
field :file, Types::File, null: true, extensions: [
|
||||||
|
|
|
@ -24,6 +24,10 @@ module Types
|
||||||
{ Extensions::Attachment => { attachment: :justificatif_motivation } }
|
{ Extensions::Attachment => { attachment: :justificatif_motivation } }
|
||||||
]
|
]
|
||||||
|
|
||||||
|
field :pdf, Types::File, "L’URL du dossier au format PDF.", null: true
|
||||||
|
field :geojson, Types::File, "L’URL du GeoJSON contenant les données cartographiques du dossier.", null: true
|
||||||
|
field :attestation, Types::File, "L’URL de l’attestation au format PDF.", null: true
|
||||||
|
|
||||||
field :usager, Types::ProfileType, null: false
|
field :usager, Types::ProfileType, null: false
|
||||||
field :groupe_instructeur, Types::GroupeInstructeurType, null: false
|
field :groupe_instructeur, Types::GroupeInstructeurType, null: false
|
||||||
field :revision, Types::RevisionType, null: false
|
field :revision, Types::RevisionType, null: false
|
||||||
|
@ -81,6 +85,30 @@ module Types
|
||||||
Loaders::Association.for(object.class, :champs_private).load(object)
|
Loaders::Association.for(object.class, :champs_private).load(object)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def pdf
|
||||||
|
sgid = object.to_sgid(expires_in: 1.hour, for: 'api_v2')
|
||||||
|
{
|
||||||
|
filename: "dossier-#{object.id}.pdf",
|
||||||
|
content_type: 'application/pdf',
|
||||||
|
url: Rails.application.routes.url_helpers.api_v2_dossier_pdf_url(id: sgid)
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
def geojson
|
||||||
|
sgid = object.to_sgid(expires_in: 1.hour, for: 'api_v2')
|
||||||
|
{
|
||||||
|
filename: "dossier-#{object.id}-features.json",
|
||||||
|
content_type: 'application/json',
|
||||||
|
url: Rails.application.routes.url_helpers.api_v2_dossier_geojson_url(id: sgid)
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
def attestation
|
||||||
|
if object.termine? && object.procedure.attestation_template&.activated?
|
||||||
|
Loaders::Association.for(object.class, attestation: { pdf_attachment: :blob }).load(object).then(&:pdf)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def self.authorized?(object, context)
|
def self.authorized?(object, context)
|
||||||
authorized_demarche?(object.procedure, context)
|
authorized_demarche?(object.procedure, context)
|
||||||
end
|
end
|
||||||
|
|
|
@ -7,7 +7,11 @@ module Types
|
||||||
field :content_type, String, null: false
|
field :content_type, String, null: false
|
||||||
|
|
||||||
def url
|
def url
|
||||||
object.service_url
|
if object.is_a?(Hash)
|
||||||
|
object[:url]
|
||||||
|
else
|
||||||
|
object.service_url
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -286,7 +286,7 @@ class Dossier < ApplicationRecord
|
||||||
end
|
end
|
||||||
|
|
||||||
scope :for_procedure, -> (procedure) { includes(:user, :groupe_instructeur).where(groupe_instructeurs: { procedure: procedure }) }
|
scope :for_procedure, -> (procedure) { includes(:user, :groupe_instructeur).where(groupe_instructeurs: { procedure: procedure }) }
|
||||||
scope :for_api_v2, -> { includes(procedure: [:administrateurs], etablissement: [], individual: [], traitements: []) }
|
scope :for_api_v2, -> { includes(procedure: [:administrateurs, :attestation_template], etablissement: [], individual: [], traitements: []) }
|
||||||
|
|
||||||
scope :with_notifications, -> do
|
scope :with_notifications, -> do
|
||||||
joins(:follows)
|
joins(:follows)
|
||||||
|
|
|
@ -222,6 +222,8 @@ Rails.application.routes.draw do
|
||||||
|
|
||||||
namespace :v2 do
|
namespace :v2 do
|
||||||
post :graphql, to: "graphql#execute"
|
post :graphql, to: "graphql#execute"
|
||||||
|
get 'dossiers/pdf/:id', format: :pdf, to: "dossiers#pdf", as: :dossier_pdf
|
||||||
|
get 'dossiers/geojson/:id', to: "dossiers#geojson", as: :dossier_geojson
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
38
spec/controllers/api/v2/dossiers_controller_spec.rb
Normal file
38
spec/controllers/api/v2/dossiers_controller_spec.rb
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
describe API::V2::DossiersController do
|
||||||
|
let(:dossier) { create(:dossier, :accepte, :with_attestation) }
|
||||||
|
let(:sgid) { dossier.to_sgid(expires_in: 1.hour, for: 'api_v2') }
|
||||||
|
|
||||||
|
describe 'fetch pdf' do
|
||||||
|
subject { get :pdf, params: { id: sgid } }
|
||||||
|
|
||||||
|
it 'should get' do
|
||||||
|
expect(subject.status).to eq(200)
|
||||||
|
expect(subject.body).not_to be_nil
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'error' do
|
||||||
|
let(:sgid) { 'yolo' }
|
||||||
|
|
||||||
|
it 'should error' do
|
||||||
|
expect(subject.status).to eq(401)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe 'fetch geojson' do
|
||||||
|
subject { get :geojson, params: { id: sgid } }
|
||||||
|
|
||||||
|
it 'should get' do
|
||||||
|
expect(subject.status).to eq(200)
|
||||||
|
expect(subject.body).not_to be_nil
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'error' do
|
||||||
|
let(:sgid) { 'yolo' }
|
||||||
|
|
||||||
|
it 'should error' do
|
||||||
|
expect(subject.status).to eq(401)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -436,6 +436,35 @@ describe API::V2::GraphqlController do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context "with links" do
|
||||||
|
let(:dossier) { create(:dossier, :accepte, :with_attestation, procedure: procedure) }
|
||||||
|
let(:query) do
|
||||||
|
"{
|
||||||
|
dossier(number: #{dossier.id}) {
|
||||||
|
id
|
||||||
|
number
|
||||||
|
pdf {
|
||||||
|
url
|
||||||
|
}
|
||||||
|
geojson {
|
||||||
|
url
|
||||||
|
}
|
||||||
|
attestation {
|
||||||
|
url
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}"
|
||||||
|
end
|
||||||
|
|
||||||
|
it "urls should be returned" do
|
||||||
|
expect(gql_errors).to eq(nil)
|
||||||
|
|
||||||
|
expect(gql_data[:dossier][:pdf][:url]).not_to be_nil
|
||||||
|
expect(gql_data[:dossier][:geojson][:url]).not_to be_nil
|
||||||
|
expect(gql_data[:dossier][:attestation][:url]).not_to be_nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
context "when there are missing data" do
|
context "when there are missing data" do
|
||||||
before do
|
before do
|
||||||
dossier.etablissement.update!(entreprise_code_effectif_entreprise: nil, entreprise_capital_social: nil,
|
dossier.etablissement.update!(entreprise_code_effectif_entreprise: nil, entreprise_capital_social: nil,
|
||||||
|
|
Loading…
Reference in a new issue