Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
ActiveStorage file uploading in GraphQL API in Rails
# app/graphql/types/objects/document_type.rb
module Mutations
class CreateDocument < BaseMutation
description "creates a document for the user in the system"
argument :doc, ApolloUploadServer::Upload, required: true
field :document, Types::Objects::DocumentType, null: false
def resolve(doc:)
authenticate_user
user = context[:current_user]
document = user.documents.build(doc: doc)
if document.save
return {document: document}
else
raise GraphQL::ExecutionError.new(document.errors.full_messages.join(', '))
end
end
end
end
# app/models/document.rb
class Document < ApplicationRecord
## RELATIONSHIPS
has_one_attached :doc
belongs_to :documentable, polymorphic: true, optional: true
belongs_to :user, optional: true
## VALIDATIONS
validate :doc_presence, on: :create
# This validation validates that attachment can be any image of pdf
def doc_presence
pattern = %r{^(image|application)/(.)+$}
unless doc.attached? && pattern.match?(doc.attachment.blob.content_type)
errors.add(:doc, I18n.t("errors.models.document.file_presence"))
end
end
end
# app/graphql/types/objects/document_type.rb
module Types
module Objects
class DocumentType < Types::BaseObject
field :id, Integer, null: false
field :documentable_type, String, null: true
field :documentable_id, Integer, null: true
field :content_type, String, null: true
field :url, String, null: false
field :created_at, GraphQL::Types::ISO8601DateTime, null: false
field :updated_at, GraphQL::Types::ISO8601DateTime, null: false
def url
if Rails.env.production?
object.doc.service_url
else
Rails.application.routes.url_helpers.rails_blob_url(object.doc)
end
end
def content_type
if object.doc.present?
object.doc.content_type
else
nil
end
end
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment