module Mutations class BaseMutation < GraphQL::Schema::RelayClassicMutation private delegate :current_administrateur, to: :context def ready?(**args) if context.write_access? authorized_before_load?(**args) else return false, { errors: ['Le jeton utilisé est configuré seulement en lecture'] } end end def authorized_before_load?(**args) true end def partition_instructeurs_by(instructeurs) instructeurs .partition { _1.id.present? } .then do |by_id, by_email| [ by_id.map { Instructeur.id_from_typed_id(_1.id) }, by_email.map { EmailSanitizableConcern::EmailSanitizer.sanitize(_1.email) } ] end end def validate_blob(blob_id) begin blob = ActiveStorage::Blob.find_signed(blob_id) raise ActiveSupport::MessageVerifier::InvalidSignature if blob.nil? # open downloads the file and checks its hash blob.open { |f| } true rescue ActiveStorage::FileNotFoundError return false, { errors: ['Le fichier n’a pas été correctement téléversé sur le serveur de stockage'] } rescue ActiveSupport::MessageVerifier::InvalidSignature return false, { errors: ['L’identifiant du fichier téléversé est invalide'] } rescue ActiveStorage::IntegrityError return false, { errors: ['Le hash du fichier téléversé est invalide'] } end end def dossier_authorized_for?(dossier, instructeur) if instructeur.is_a?(Instructeur) && instructeur.dossiers.exists?(id: dossier.id) true else return false, { errors: ['L’instructeur n’a pas les droits d’accès à ce dossier'] } end end end end