module Mutations class CreateDirectUpload < Mutations::BaseMutation description "File information required to prepare a direct upload" argument :dossier_id, ID, "Dossier ID", required: true, loads: Types::DossierType argument :filename, String, "Original file name", required: true argument :byte_size, Int, "File size (bytes)", required: true argument :checksum, String, "MD5 file checksum as base64", required: true argument :content_type, String, "File content type", required: true class DirectUpload < Types::BaseObject description "Represents direct upload credentials" field :url, String, "Upload URL", null: false field :headers, String, "HTTP request headers (JSON-encoded)", null: false field :blob_id, ID, "Created blob record ID", null: false field :signed_blob_id, ID, "Created blob record signed ID", null: false end field :direct_upload, DirectUpload, null: false def resolve(filename:, byte_size:, checksum:, content_type:, dossier:) blob = ActiveStorage::Blob.create_before_direct_upload!( filename: filename, byte_size: byte_size, checksum: checksum, content_type: content_type ) { direct_upload: { url: blob.service_url_for_direct_upload, # NOTE: we pass headers as JSON since they have no schema headers: blob.service_headers_for_direct_upload.to_json, blob_id: blob.id, signed_blob_id: blob.signed_id } } end end end