[GraphQL] allow to query dossiers by groupe instructeur

This commit is contained in:
Paul Chavard 2020-04-08 19:30:16 +02:00
parent 7e806f191c
commit 32f783142c
6 changed files with 149 additions and 0 deletions

View file

@ -745,6 +745,69 @@ type GroupeInstructeur {
id: ID! id: ID!
instructeurs: [Profile!]! instructeurs: [Profile!]!
label: String! label: String!
"""
Le numero du groupe instructeur.
"""
number: Int!
}
"""
Un groupe instructeur avec ces dossiers
"""
type GroupeInstructeurWithDossiers {
"""
Liste de tous les dossiers d'une démarche.
"""
dossiers(
"""
Returns the elements in the list that come after the specified cursor.
"""
after: String
"""
Returns the elements in the list that come before the specified cursor.
"""
before: String
"""
Dossiers déposés depuis la date.
"""
createdSince: ISO8601DateTime
"""
Returns the first _n_ elements from the list.
"""
first: Int
"""
Returns the last _n_ elements from the list.
"""
last: Int
"""
L'ordre des dossiers.
"""
order: Order = ASC
"""
Dossiers avec statut.
"""
state: DossierState
"""
Dossiers mis à jour depuis la date.
"""
updatedSince: ISO8601DateTime
): DossierConnection!
id: ID!
instructeurs: [Profile!]!
label: String!
"""
Le numero du groupe instructeur.
"""
number: Int!
} }
""" """
@ -975,6 +1038,16 @@ type Query {
""" """
number: Int! number: Int!
): Dossier! ): Dossier!
"""
Informations sur un groupe instructeur.
"""
groupeInstructeur(
"""
Numéro du groupe instructeur.
"""
number: Int!
): GroupeInstructeurWithDossiers!
} }
type RepetitionChamp implements Champ { type RepetitionChamp implements Champ {

View file

@ -3,6 +3,7 @@ module Types
description "Un groupe instructeur" description "Un groupe instructeur"
global_id_field :id global_id_field :id
field :number, Int, "Le numero du groupe instructeur.", null: false, method: :id
field :label, String, null: false field :label, String, null: false
field :instructeurs, [Types::ProfileType], null: false field :instructeurs, [Types::ProfileType], null: false

View file

@ -0,0 +1,32 @@
module Types
class GroupeInstructeurWithDossiersType < GroupeInstructeurType
description "Un groupe instructeur avec ces dossiers"
field :dossiers, Types::DossierType.connection_type, "Liste de tous les dossiers d'une démarche.", null: false 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."
end
def dossiers(updated_since: nil, created_since: nil, state: nil, order:)
dossiers = object.dossiers.state_not_brouillon.for_api_v2
if state.present?
dossiers = dossiers.where(state: state)
end
if updated_since.present?
dossiers = dossiers.updated_since(updated_since).order_by_updated_at(order)
else
if created_since.present?
dossiers = dossiers.created_since(created_since)
end
dossiers = dossiers.order_by_created_at(order)
end
dossiers
end
end
end

View file

@ -8,6 +8,10 @@ module Types
argument :number, Int, "Numéro du dossier.", required: true argument :number, Int, "Numéro du dossier.", required: true
end end
field :groupe_instructeur, GroupeInstructeurWithDossiersType, null: false, description: "Informations sur un groupe instructeur." do
argument :number, Int, "Numéro du groupe instructeur.", required: true
end
def demarche(number:) def demarche(number:)
Procedure.for_api_v2.find(number) Procedure.for_api_v2.find(number)
rescue => e rescue => e
@ -20,6 +24,12 @@ module Types
raise GraphQL::ExecutionError.new(e.message, extensions: { code: :not_found }) raise GraphQL::ExecutionError.new(e.message, extensions: { code: :not_found })
end end
def groupe_instructeur(number:)
GroupeInstructeur.for_api_v2.find(number)
rescue => e
raise GraphQL::ExecutionError.new(e.message, extensions: { code: :not_found })
end
def self.accessible?(context) def self.accessible?(context)
context[:token] || context[:administrateur_id] context[:token] || context[:administrateur_id]
end end

View file

@ -12,4 +12,5 @@ class GroupeInstructeur < ApplicationRecord
before_validation -> { label&.strip! } before_validation -> { label&.strip! }
scope :without_group, -> (group) { where.not(id: group) } scope :without_group, -> (group) { where.not(id: group) }
scope :for_api_v2, -> { includes(procedure: [:administrateurs]) }
end end

View file

@ -201,6 +201,7 @@ describe API::V2::GraphqlController do
} }
groupeInstructeur { groupeInstructeur {
id id
number
label label
} }
messages { messages {
@ -259,6 +260,7 @@ describe API::V2::GraphqlController do
], ],
groupeInstructeur: { groupeInstructeur: {
id: dossier.groupe_instructeur.to_typed_id, id: dossier.groupe_instructeur.to_typed_id,
number: dossier.groupe_instructeur.id,
label: dossier.groupe_instructeur.label label: dossier.groupe_instructeur.label
}, },
demandeur: { demandeur: {
@ -346,6 +348,36 @@ describe API::V2::GraphqlController do
end end
end end
context "groupeInstructeur" do
let(:groupe_instructeur) { procedure.groupe_instructeurs.first }
let(:query) do
"{
groupeInstructeur(number: #{groupe_instructeur.id}) {
id
number
label
dossiers {
nodes {
id
}
}
}
}"
end
it "should be returned" do
expect(gql_errors).to eq(nil)
expect(gql_data).to eq(groupeInstructeur: {
id: groupe_instructeur.to_typed_id,
number: groupe_instructeur.id,
label: groupe_instructeur.label,
dossiers: {
nodes: dossiers.map { |dossier| { id: dossier.to_typed_id } }
}
})
end
end
context "mutations" do context "mutations" do
describe 'dossierEnvoyerMessage' do describe 'dossierEnvoyerMessage' do
context 'success' do context 'success' do