feat(graphql): improuve groupe instructeur query

This commit is contained in:
Paul Chavard 2022-11-02 13:18:18 +01:00
parent 4952ba1cee
commit 3ced06d59b
4 changed files with 78 additions and 6 deletions

View file

@ -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

View file

@ -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 dune démarche.
Liste de tous les dossiers dun 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
"""
Lordre des dossiers.
"""
order: Order = ASC
"""
Seulement les dossiers pour la révision donnée.
"""
revision: ID
"""
Dossiers avec statut.
"""

View file

@ -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 dune démarche.", null: false do
field :dossiers, Types::DossierType.connection_type, "Liste de tous les dossiers dun groupe instructeur.", null: false, extras: [:lookahead] do
argument :order, Types::Order, default_value: :asc, required: false, description: "Lordre 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

View file

@ -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' }