74 lines
2.1 KiB
Ruby
74 lines
2.1 KiB
Ruby
module Mutations
|
||
class DossierModifierAnnotation < Mutations::BaseMutation
|
||
argument :dossier_id, ID, "Dossier ID", required: true, loads: Types::DossierType
|
||
argument :instructeur_id, ID, "Instructeur qui demande la modification.", required: true, loads: Types::ProfileType
|
||
argument :annotation_id, ID, "Annotation ID", required: true
|
||
|
||
field :annotation, Types::ChampType, null: true
|
||
field :errors, [Types::ValidationErrorType], null: true
|
||
|
||
def resolve_with_type(dossier:, annotation_id:, instructeur:, value:)
|
||
annotation = find_annotation(dossier, annotation_id)
|
||
|
||
if annotation.nil?
|
||
return { errors: ["L’annotation \"#{annotation_id}\" n’existe pas"] }
|
||
end
|
||
|
||
if block_given?
|
||
annotation.value = yield annotation.type_champ, value
|
||
else
|
||
annotation.value = value
|
||
end
|
||
|
||
if annotation.save
|
||
dossier.log_modifier_annotation!(annotation, instructeur)
|
||
|
||
{ annotation: annotation }
|
||
else
|
||
{ errors: annotation.errors.full_messages }
|
||
end
|
||
end
|
||
|
||
def authorized?(dossier:, instructeur:, **args)
|
||
dossier_authorized_for?(dossier, instructeur)
|
||
end
|
||
|
||
private
|
||
|
||
def input_type
|
||
:text
|
||
end
|
||
|
||
def find_annotation(dossier, annotation_id)
|
||
stable_id, row = Champ.decode_typed_id(annotation_id)
|
||
|
||
Champ.joins(:type_de_champ).find_by(type_de_champ: {
|
||
type_champ: annotation_type_champ,
|
||
stable_id: stable_id,
|
||
private: true
|
||
}, private: true, row: row, dossier: dossier)
|
||
end
|
||
|
||
def annotation_type_champ
|
||
case input_type
|
||
when :text
|
||
[
|
||
TypeDeChamp.type_champs.fetch(:text),
|
||
TypeDeChamp.type_champs.fetch(:textarea)
|
||
]
|
||
when :checkbox
|
||
[
|
||
TypeDeChamp.type_champs.fetch(:checkbox),
|
||
TypeDeChamp.type_champs.fetch(:yes_no),
|
||
TypeDeChamp.type_champs.fetch(:engagement)
|
||
]
|
||
when :date
|
||
TypeDeChamp.type_champs.fetch(:date)
|
||
when :datetime
|
||
TypeDeChamp.type_champs.fetch(:datetime)
|
||
when :integer_number
|
||
TypeDeChamp.type_champs.fetch(:integer_number)
|
||
end
|
||
end
|
||
end
|
||
end
|