Merge pull request #10670 from tchak/feat-graphql-desarchiver

feat(graphql): add desarchiver mutation
This commit is contained in:
Paul Chavard 2024-08-01 13:26:25 +00:00 committed by GitHub
commit 45d5e79e55
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 109 additions and 0 deletions

View file

@ -728,6 +728,18 @@ class API::V2::StoredQuery
}
}
mutation dossierDesarchiver($input: DossierDesarchiverInput!) {
dossierDesarchiver(input: $input) {
dossier {
id
archived
}
errors {
message
}
}
}
mutation dossierPasserEnInstruction($input: DossierPasserEnInstructionInput!) {
dossierPasserEnInstruction(input: $input) {
dossier {

View file

@ -0,0 +1,25 @@
module Mutations
class DossierDesarchiver < Mutations::BaseMutation
description "Désarchiver le dossier."
argument :dossier_id, ID, "Dossier ID", required: true, loads: Types::DossierType
argument :instructeur_id, ID, "Instructeur qui prend la décision sur le dossier.", required: true, loads: Types::ProfileType
field :dossier, Types::DossierType, null: true
field :errors, [Types::ValidationErrorType], null: true
def resolve(dossier:, instructeur:)
dossier.desarchiver!
{ dossier: }
end
def authorized?(dossier:, instructeur:)
if !dossier.archived?
return false, { errors: ["Un dossier non archivé ne peut pas être désarchivé"] }
end
dossier_authorized_for?(dossier, instructeur)
end
end
end

View file

@ -1682,6 +1682,38 @@ enum DossierDeclarativeState {
en_instruction
}
"""
Autogenerated input type of DossierDesarchiver
"""
input DossierDesarchiverInput {
"""
A unique identifier for the client performing the mutation.
"""
clientMutationId: String
"""
Dossier ID
"""
dossierId: ID!
"""
Instructeur qui prend la décision sur le dossier.
"""
instructeurId: ID!
}
"""
Autogenerated return type of DossierDesarchiver.
"""
type DossierDesarchiverPayload {
"""
A unique identifier for the client performing the mutation.
"""
clientMutationId: String
dossier: Dossier
errors: [ValidationError!]
}
"""
An edge in a connection.
"""
@ -3271,6 +3303,16 @@ type Mutation {
input: DossierClasserSansSuiteInput!
): DossierClasserSansSuitePayload
"""
Désarchiver le dossier.
"""
dossierDesarchiver(
"""
Parameters for DossierDesarchiver
"""
input: DossierDesarchiverInput!
): DossierDesarchiverPayload
"""
Envoyer un message à l'usager du dossier.
"""

View file

@ -11,6 +11,7 @@ module Types
field :dossier_repasser_en_instruction, mutation: Mutations::DossierRepasserEnInstruction
field :dossier_repasser_en_construction, mutation: Mutations::DossierRepasserEnConstruction
field :dossier_archiver, mutation: Mutations::DossierArchiver
field :dossier_desarchiver, mutation: Mutations::DossierDesarchiver
field :dossier_changer_groupe_instructeur, mutation: Mutations::DossierChangerGroupeInstructeur
field :dossier_modifier_annotation_text, mutation: Mutations::DossierModifierAnnotationText

View file

@ -889,6 +889,35 @@ describe API::V2::GraphqlController do
end
end
context 'dossierDesarchiver' do
let(:dossier) { create(:dossier, :refuse, :with_individual, :archived, procedure:) }
let(:variables) { { input: { dossierId: dossier.to_typed_id, instructeurId: instructeur.to_typed_id } } }
let(:operation_name) { 'dossierDesarchiver' }
it {
expect(gql_errors).to be_nil
expect(gql_data[:dossierDesarchiver][:errors]).to be_nil
expect(gql_data[:dossierDesarchiver][:dossier][:id]).to eq(dossier.to_typed_id)
expect(gql_data[:dossierDesarchiver][:dossier][:archived]).to be_falsey
}
context 'read only token' do
before { api_token.update(write_access: false) }
it {
expect(gql_data[:dossierDesarchiver][:errors].first[:message]).to eq('Le jeton utilisé est configuré seulement en lecture')
}
end
context 'when not processed' do
let(:dossier) { create(:dossier, :refuse, :with_individual, procedure:) }
it {
expect(gql_data[:dossierDesarchiver][:errors].first[:message]).to eq('Un dossier non archivé ne peut pas être désarchivé')
}
end
end
context 'dossierPasserEnInstruction' do
let(:dossier) { create(:dossier, :en_construction, :with_individual, procedure: procedure) }
let(:variables) { { input: { dossierId: dossier.to_typed_id, instructeurId: instructeur.to_typed_id, disableNotification: } } }