demarches-normaliennes/app/graphql/api/v2/schema.rb

159 lines
5.9 KiB
Ruby
Raw Normal View History

2020-08-05 18:40:47 +02:00
class API::V2::Schema < GraphQL::Schema
2018-11-19 20:58:51 +01:00
default_max_page_size 100
2022-10-31 11:49:41 +01:00
default_page_size 100
# Disable max_complexity for now because of what looks like a bug in graphql gem.
# After some internal changes complexity for our avarage query went from < 300 to 25 000.
max_complexity nil
2018-11-19 20:58:51 +01:00
max_depth 15
2018-11-19 21:06:13 +01:00
query Types::QueryType
mutation Types::MutationType
2020-08-05 18:40:47 +02:00
context_class API::V2::Context
2020-12-18 11:16:18 +01:00
2018-11-20 22:59:51 +01:00
def self.id_from_object(object, type_definition, ctx)
if type_definition == Types::DemarcheDescriptorType
(object.is_a?(Procedure) ? object : object.procedure).to_typed_id
elsif type_definition == Types::DeletedDossierType
object.is_a?(DeletedDossier) ? object.to_typed_id : GraphQL::Schema::UniqueWithinType.encode('DeletedDossier', object.id)
elsif object.is_a?(Hash)
object[:id]
else
object.to_typed_id
end
2018-11-20 22:59:51 +01:00
end
def self.object_from_id(id, ctx)
2018-11-20 22:59:51 +01:00
ApplicationRecord.record_from_typed_id(id)
rescue => e
raise GraphQL::ExecutionError.new(e.message, extensions: { code: :not_found })
end
def self.resolve_type(type_definition, object, ctx)
case object
2018-11-20 22:59:51 +01:00
when Procedure
if type_definition == Types::DemarcheDescriptorType
type_definition
else
Types::DemarcheType
end
2018-11-20 22:59:51 +01:00
when Dossier
Types::DossierType
2018-11-23 18:54:51 +01:00
when Commentaire
Types::MessageType
2021-02-25 09:32:23 +01:00
when Instructeur, User, Expert
2018-11-20 22:59:51 +01:00
Types::ProfileType
when Individual
Types::PersonnePhysiqueType
when Etablissement
Types::PersonneMoraleType
when GroupeInstructeur
Types::GroupeInstructeurType
2018-11-20 22:59:51 +01:00
else
raise GraphQL::ExecutionError.new("Unexpected object: #{object}")
2018-11-20 22:59:51 +01:00
end
end
orphan_types Types::Champs::AddressChampType,
Types::Champs::CarteChampType,
Types::Champs::CheckboxChampType,
Types::Champs::CiviliteChampType,
Types::Champs::CommuneChampType,
Types::Champs::DateChampType,
2020-12-18 11:21:03 +01:00
Types::Champs::DatetimeChampType,
Types::Champs::DecimalNumberChampType,
Types::Champs::DepartementChampType,
Types::Champs::DossierLinkChampType,
2023-01-19 09:43:19 +01:00
Types::Champs::EpciChampType,
Types::Champs::IntegerNumberChampType,
Types::Champs::LinkedDropDownListChampType,
Types::Champs::MultipleDropDownListChampType,
2022-12-21 17:35:05 +01:00
Types::Champs::PaysChampType,
Types::Champs::PieceJustificativeChampType,
Types::Champs::RegionChampType,
Types::Champs::RepetitionChampType,
Types::Champs::SiretChampType,
Types::Champs::TextChampType,
2020-09-24 12:02:14 +02:00
Types::Champs::TitreIdentiteChampType,
Types::GeoAreas::ParcelleCadastraleType,
Types::GeoAreas::SelectionUtilisateurType,
Types::PersonneMoraleType,
Types::PersonnePhysiqueType,
Types::Champs::Descriptor::AddressChampDescriptorType,
Types::Champs::Descriptor::AnnuaireEducationChampDescriptorType,
Types::Champs::Descriptor::CarteChampDescriptorType,
Types::Champs::Descriptor::CheckboxChampDescriptorType,
Types::Champs::Descriptor::CiviliteChampDescriptorType,
Types::Champs::Descriptor::CnafChampDescriptorType,
Types::Champs::Descriptor::CommuneChampDescriptorType,
Types::Champs::Descriptor::DateChampDescriptorType,
Types::Champs::Descriptor::DatetimeChampDescriptorType,
Types::Champs::Descriptor::DecimalNumberChampDescriptorType,
Types::Champs::Descriptor::DepartementChampDescriptorType,
Types::Champs::Descriptor::DgfipChampDescriptorType,
Types::Champs::Descriptor::DossierLinkChampDescriptorType,
Types::Champs::Descriptor::DropDownListChampDescriptorType,
Types::Champs::Descriptor::EmailChampDescriptorType,
2023-01-19 09:43:19 +01:00
Types::Champs::Descriptor::EpciChampDescriptorType,
Types::Champs::Descriptor::ExplicationChampDescriptorType,
Types::Champs::Descriptor::HeaderSectionChampDescriptorType,
Types::Champs::Descriptor::IbanChampDescriptorType,
Types::Champs::Descriptor::IntegerNumberChampDescriptorType,
Types::Champs::Descriptor::LinkedDropDownListChampDescriptorType,
Types::Champs::Descriptor::MesriChampDescriptorType,
Types::Champs::Descriptor::MultipleDropDownListChampDescriptorType,
Types::Champs::Descriptor::NumberChampDescriptorType,
Types::Champs::Descriptor::PaysChampDescriptorType,
Types::Champs::Descriptor::PhoneChampDescriptorType,
Types::Champs::Descriptor::PieceJustificativeChampDescriptorType,
Types::Champs::Descriptor::PoleEmploiChampDescriptorType,
Types::Champs::Descriptor::RegionChampDescriptorType,
Types::Champs::Descriptor::RepetitionChampDescriptorType,
Types::Champs::Descriptor::RNAChampDescriptorType,
Types::Champs::Descriptor::SiretChampDescriptorType,
Types::Champs::Descriptor::TextareaChampDescriptorType,
2023-01-19 09:43:19 +01:00
Types::Champs::Descriptor::TextChampDescriptorType,
Types::Champs::Descriptor::TitreIdentiteChampDescriptorType,
Types::Champs::Descriptor::YesNoChampDescriptorType
2018-11-19 20:58:51 +01:00
def self.unauthorized_object(error)
# Add a top-level error to the response instead of returning nil:
raise GraphQL::ExecutionError.new("An object of type #{error.type.graphql_name} was hidden due to permissions", extensions: { code: :unauthorized })
end
def self.type_error(error, ctx)
# Capture type errors in Sentry. Thouse errors are our responsability and usually linked to
# instances of "bad data".
Sentry.capture_exception(error)
super
end
class Timeout < GraphQL::Schema::Timeout
def handle_timeout(error, query)
extra = { query: query.query_string, variables: query.provided_variables&.to_json }
Sentry.capture_exception(error, extra:)
end
end
use Timeout, max_seconds: 10
use GraphQL::Batch
use GraphQL::Backtrace
2018-11-19 20:58:51 +01:00
if Rails.env.development?
class LogQueryDepth < GraphQL::Analysis::AST::QueryDepth
def result
Rails.logger.info("[GraphQL Query Depth] #{super}")
end
end
2018-11-19 20:58:51 +01:00
class LogQueryComplexity < GraphQL::Analysis::AST::QueryComplexity
def result
Rails.logger.info("[GraphQL Query Complexity] #{super}")
end
end
query_analyzer(LogQueryComplexity)
query_analyzer(LogQueryDepth)
end
2018-11-19 20:58:51 +01:00
end