From 3ced06d59bcaf789f4a57d07bb44e8f39df3facd Mon Sep 17 00:00:00 2001 From: Paul Chavard Date: Wed, 2 Nov 2022 13:18:18 +0100 Subject: [PATCH] feat(graphql): improuve groupe instructeur query --- app/graphql/api/v2/stored_query.rb | 4 +++ app/graphql/schema.graphql | 24 ++++++++++++-- .../groupe_instructeur_with_dossiers_type.rb | 32 ++++++++++++++++--- .../api/v2/graphql_controller_spec.rb | 24 ++++++++++++++ 4 files changed, 78 insertions(+), 6 deletions(-) diff --git a/app/graphql/api/v2/stored_query.rb b/app/graphql/api/v2/stored_query.rb index d9ae6c79b..ddaee688d 100644 --- a/app/graphql/api/v2/stored_query.rb +++ b/app/graphql/api/v2/stored_query.rb @@ -98,6 +98,8 @@ class API::V2::StoredQuery $order: Order $first: Int $after: String + $archived: Boolean + $revision: ID $createdSince: ISO8601DateTime $updatedSince: ISO8601DateTime $includeDossiers: Boolean = false @@ -122,8 +124,10 @@ class API::V2::StoredQuery order: $order first: $first after: $after + archived: $archived createdSince: $createdSince updatedSince: $updatedSince + revision: $revision ) @include(if: $includeDossiers) { pageInfo { ...PageInfoFragment diff --git a/app/graphql/schema.graphql b/app/graphql/schema.graphql index 5379787a5..11a5ec0ac 100644 --- a/app/graphql/schema.graphql +++ b/app/graphql/schema.graphql @@ -1534,11 +1534,11 @@ type GroupeInstructeur { } """ -Un groupe instructeur avec ces dossiers +Un groupe instructeur avec ses dossiers """ type GroupeInstructeurWithDossiers { """ - Liste de tous les dossiers d’une démarche. + Liste de tous les dossiers d’un groupe instructeur. """ dossiers( """ @@ -1546,6 +1546,11 @@ type GroupeInstructeurWithDossiers { """ after: String + """ + Seulement les dossiers archivés. + """ + archived: Boolean + """ Returns the elements in the list that come before the specified cursor. """ @@ -1566,11 +1571,26 @@ type GroupeInstructeurWithDossiers { """ last: Int + """ + Seulement les dossiers pour les révisons avant la révision donnée. + """ + maxRevision: ID + + """ + Seulement les dossiers pour les révisons après la révision donnée. + """ + minRevision: ID + """ L’ordre des dossiers. """ order: Order = ASC + """ + Seulement les dossiers pour la révision donnée. + """ + revision: ID + """ Dossiers avec statut. """ diff --git a/app/graphql/types/groupe_instructeur_with_dossiers_type.rb b/app/graphql/types/groupe_instructeur_with_dossiers_type.rb index 1c5675f3f..b9908b40a 100644 --- a/app/graphql/types/groupe_instructeur_with_dossiers_type.rb +++ b/app/graphql/types/groupe_instructeur_with_dossiers_type.rb @@ -1,15 +1,19 @@ module Types class GroupeInstructeurWithDossiersType < GroupeInstructeurType - description "Un groupe instructeur avec ces dossiers" + description "Un groupe instructeur avec ses dossiers" - field :dossiers, Types::DossierType.connection_type, "Liste de tous les dossiers d’une démarche.", null: false do + field :dossiers, Types::DossierType.connection_type, "Liste de tous les dossiers d’un groupe instructeur.", null: false, extras: [:lookahead] do argument :order, Types::Order, default_value: :asc, required: false, description: "L’ordre des dossiers." argument :created_since, GraphQL::Types::ISO8601DateTime, required: false, description: "Dossiers déposés depuis la date." argument :updated_since, GraphQL::Types::ISO8601DateTime, required: false, description: "Dossiers mis à jour depuis la date." argument :state, Types::DossierType::DossierState, required: false, description: "Dossiers avec statut." + argument :archived, Boolean, required: false, description: "Seulement les dossiers archivés." + argument :revision, ID, required: false, description: "Seulement les dossiers pour la révision donnée." + argument :max_revision, ID, required: false, description: "Seulement les dossiers pour les révisons avant la révision donnée." + argument :min_revision, ID, required: false, description: "Seulement les dossiers pour les révisons après la révision donnée." end - def dossiers(updated_since: nil, created_since: nil, state: nil, order:) + def dossiers(updated_since: nil, created_since: nil, state: nil, archived: nil, revision: nil, max_revision: nil, min_revision: nil, order:, lookahead:) dossiers = object .dossiers .visible_by_administration @@ -19,6 +23,22 @@ module Types dossiers = dossiers.where(state: state) end + if !archived.nil? + dossiers = dossiers.where(archived: archived) + end + + if !revision.nil? + dossiers = dossiers.where(revision: find_revision(revision)) + else + if !min_revision.nil? + dossiers = dossiers.joins(:revision).where('procedure_revisions.created_at >= ?', find_revision(min_revision).created_at) + end + + if !max_revision.nil? + dossiers = dossiers.joins(:revision).where('procedure_revisions.created_at <= ?', find_revision(max_revision).created_at) + end + end + if updated_since.present? dossiers = dossiers.updated_since(updated_since).order_by_updated_at(order) else @@ -29,7 +49,11 @@ module Types dossiers = dossiers.order_by_created_at(order) end - dossiers + # We wrap dossiers in a custom connection alongsite the lookahead for the query. + # The custom connection is responsible for preloading paginated dossiers. + # https://graphql-ruby.org/pagination/custom_connections.html#using-a-custom-connection + # https://graphql-ruby.org/queries/lookahead.html + Connections::DossiersConnection.new(dossiers, lookahead: lookahead) end end end diff --git a/spec/controllers/api/v2/graphql_controller_spec.rb b/spec/controllers/api/v2/graphql_controller_spec.rb index 7ecc06aba..f0675af1e 100644 --- a/spec/controllers/api/v2/graphql_controller_spec.rb +++ b/spec/controllers/api/v2/graphql_controller_spec.rb @@ -878,6 +878,30 @@ describe API::V2::GraphqlController do end end + context 'getGroupeInstructeur' do + let(:groupe_instructeur) { procedure.groupe_instructeurs.first } + let(:variables) { { groupeInstructeurNumber: groupe_instructeur.id } } + let(:operation_name) { 'getGroupeInstructeur' } + + before { dossier } + + it { + expect(gql_errors).to be_nil + expect(gql_data[:groupeInstructeur][:id]).to eq(groupe_instructeur.to_typed_id) + expect(gql_data[:groupeInstructeur][:dossiers]).to be_nil + } + + context 'include Dossiers' do + let(:variables) { { groupeInstructeurNumber: groupe_instructeur.id, includeDossiers: true } } + + it { + expect(gql_errors).to be_nil + expect(gql_data[:groupeInstructeur][:id]).to eq(groupe_instructeur.to_typed_id) + expect(gql_data[:groupeInstructeur][:dossiers][:nodes].size).to eq(1) + } + end + end + context 'mutation' do let(:query_id) { 'ds-mutation-v2' }