42 lines
1.5 KiB
Ruby
42 lines
1.5 KiB
Ruby
|
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
|