0

I have a requirement to post comments in an application. This was implemented and is working fine. Now, I got an additional requirement to upload a photo along with the comment. So, I implemented the camera feature in the app and I am sending the image URI to the GraphQL API now. I have refactored the schema and types in elixir. But, somehow the params vanishes when it reaches the service class.

comment.ex

defmodule MyApp.Comment do
  use MyApp.Schema

  schema "comments" do
    field :art_id    , :string
    field :body      , :string
    field :image_url   , :string
    field :image_name  , :string

    belongs_to :user , User
    timestamps()
  end

  @optional_attributes ~w(body art_id image_url image_name)a

  def changeset(%Comment{} = schema, params) do
    schema
    |> cast(params, @optional_attributes)
    |> validate_required(@required_attributes)
  end
end

schema.ex contains:

 field :create_comment, :comment do
      arg :art_id, non_null(:string)
      arg :base64_image, :string
      arg :image_name, :string
      arg :body, :string

      middleware RequireAuth
      resolve &CommentService.create_comment/2
      middleware HandleErrors
 end

types.ex

object :comment do
    field :id     , :id
    field :art_id , :string
    field :body   , :string
    field :image_name  , :string
    field :image_url   , :image_url
    field :user   , :user do
      resolve &UserResolver.resolve/2
    end
  end

scalar :image_url, description: "S3 image url" do
    serialize fn(arg) ->
      {:ok, url} = MyApp.FileService.get_object_url(Application.get_env(:ex_aws, :bucket), arg)
      url
    end
  end

On my local server logs:

[info] POST /api/graphql
[debug] QUERY OK source="users" db=1.6ms
SELECT u0."id", u0."email", u0."fb_id", u0."full_name", u0."avatar_url", u0."password_digest", u0."email_confirmed_at", u0."inserted_at", u0."updated_at" FROM "users" AS u0 WHERE (u0."id" = $1) [1]
[debug] ABSINTHE schema=MyApp.API.Schema variables=%{"artId" => "comma-2005-06", "base64Image" => "data:image/jpeg;base64,/9j/4QMMRXhpZgAASUkqAAgAAAA3ADIBAgAUAAAAogIAAA8BAgAKAAAAtgIAAAEBAwABAAAAIAoAABABAgAIAAAAwAIAAAmSAwABAAAAEAAAAAiSAwABAAAAAAAAAAqkAwABAAAAAQAAAAikAwABAAAAAAAAAAmkAwABAAAAAAAAAAABAwABAAAAmAcAABIBAwABAAAAAAAAAAeSAwABAAAA/////yWIBAABAAAAyAIAAGmHBAABAAAA5gIAAAAAAABBd0FCQUFBQUFBQUFBQUFCQXdBQkFBQUFtQWNBQUJJQkF3QUJBQUFBQUFBQUFBZVNBd0FCQUFBQS8vLy8veVdJQkFBQkFBQUE3QUlBQUdtSEJBQUJBQUFBQ2dNQUFBQUFBQUJCUVVGQ1FYZEJRa0ZCUVVGdFFXTkJRVUpKUWtGM1FVSkJRVUZCUVVGQlFVRkJaVk5CZDBGQ1FVRkJRUzh2THk4dmVWZEpRa0ZCUWtGQlFVRTNRVWxCUVVkdFNFSkJRVUpCUVVGQlEyZE5RVUZCUVVGQlFVSkNVVlZHUTFGWVpFSlJhMFpDVVZWR2RGRlhUa0pSVlVwS1VXdEdNMUZWU2tKUlZVWkNVVlZHUWxGVlJrSmFWazVDWkRCR1ExRlZSa0pSVXpoMlRIazRkbVZXWkVwUmEwWkNVV3RHUWxGVlJUTlJWV3hDVVZWa2RGTkZTa0pSVlVwQ1VWVkdRbEV5WkU1UlZVWkNVVlZHUWxGVlVsZGtWa1pDVVZWR1FsRXdiR3RsVlRnd1VWVkdRbEZWUmtSUmJsbDRXVzEwUWxGVlJrSlJVM1JLWlZkNE1WVlZSa0pSVlVaRVRrVTVNRlo2VmtKUlZVWkNVVlU1UkdSRWFIbFpNRVpDVVZWR1FtUXdhRkZUTTFaU1VWVkcyMDE4OjA5OjEzIDEzOjI3OjU4AE1vdG9yb2xhAABYVDEwMzMAAAIAAAAAAFVraHdWMlJXUmtKUlZVWkNVVzA1UWxKWAIAAQIEAAEAAAAEAwAAAgIEAAEAAAAAAAAAAAAAAP/bAEMABQMEBAQDBQQEBAUFBQYHDAgHBwcHDwsLCQwRDxISEQ8RERMWHBcTFBoVEREYIRgaHR0fHx8TFyIkIh4kHB4fHv/bAEMBBQUFBwYHDggIDh4UERQeHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHv/AABEICiAHmAMBIgACEQEDEQH/xAAfAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgv/xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+fr/xAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgv/xAC1EQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl5ufo6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/APcLa1klu0w5KryRk1rPaK8e3IPHpUNpGIySARnpnrVxM+vWsUF+qMoaagmY7ckD9KcRtYgjkehrUIC5JwB25qnNtDblxnHUGmFyKIlVIX8aeuSc7jRtzinoSgIwKBXLNtIixbWAOfamyOEPHeokB6kUlwVWEux4FAiSbyfL3bxuPQ5/Soy3GM/jWbLOqo0jvtUdSTVYagzsQjEsTge9A0jUeVFnwoB4+8PWrSanbrJl8rxWeIWTJOB681S1lwsDoq7s4yfSgV7FfVdUF3fGW2un8pRwqngjNWbO6ubmQCOOQlQPm2kgVzUTWtkpaWUKFPU+/at/wrq989tJ5UUYtw/yNklmPcH0HpQTeysT6jqS/aUtrqYA4yAv+NYt6bK6vYkiRVcD5Gc4ye9WtPk0uyupb7VZfmJLYPzDr6Vj3982u6uf7Nt/s8UY8sykYO3sQKBppEPjDUotKvYmvb5pI9oIQtk/Sm+IfEltqemx2mjRqshUZlMfU46DPrzXE6rai28QrFrt817hgThj868ds8V2Hh6KK/MT6Pbl4j8sZCkAD8enemkJaaFO+8M6rDoEVxdaw7Ip8zyA3C+3vXMT6naWEZjt1V5TyechT6n1ru/Fj31pYJb3e1bfvyPlz34rz/xhP4b0zQkjtYIri/Y/IYj949eT+I96d+5Wm1i74F0uTUr5726uxFCpKj5wGY+o+nT8aj8T69ovhfV2tcyTbR83R8Z989q4zw1qniuO5ebT4VigZvL2Sp0zySM/zqWN9KjvXutbjLGNOFYk4OfTPzfShpoqcHzWTuT+L/EMniG6it7OHyVBBEmNvmE4646V0OkaBHDC7apdRsCu0qMAEdB16iuLvtX0+71V4NF0+YsRxtXHmHuf9kdvwqzc2l2xRNR3PsIAUngD047UaoTjZ7WPQr2/0zStOBdFWB1ICx8kj2FcL4nuLfULZlVm8tX3hd+P5Vb8SsE0wkneyLlvlJ6e1ee3c2oz2zOFKRN0bJH/AOqkTfQ6Xwxqek2Qla7hEssfMbdSD6cnv71hy3Nzq2uSpptkixyybhFAhKoMc/rz+Nc7omml7wzXTfvB8oJOSB9a7vw5eNots0scAl3IVAzg5/CnfzGlo2iO50y8SZVvZTlflK7snA46ms3xVqVgLKOCOPzWjBIIyAnPIx0Prmi61rUbu5d7k7ctkEcYH071R1OS1ijVpiHZugA3ZFSTZp2W7LOi6nf3lkHYvHDn5QRyV5A59PQdKni8Ox3cDyNKXVSeC+Npx3/Ssg61cpaIsRCxjJClai0+aUGaR7hwshBI7YoCCdpJon0R38P3M5toUZphiTPX8+uKg1VrjV78i/uCtuWwQgx8v5jNWVzKxdMntzVW8hlmwsS5btiglGsZ9FtIYotPjjFwF+fYGAJx3zWfq2q3V2xWSHy0I4Cjg8fqKoRwT2dwsdyoDEA4LZyK6CSTztPEakMWXByOlFim9blvwnqV3YWM7xbVndcxuAcrznPB6+/vTj4g1K71DdcXryRZysTPkE4Ayc9egpvh61nWzMTCM5J2hT0H40y1l0OzlZpooxOjHBRckmgPQk1dBcqzFfmJyD6Huay9MjaK6feQxY9M4wK0k1YallI4igKgkZ+4fSsueGa3umEnGDwQeo9aBJXRo+IPElvb2n2SNFeU7QwH3075H1rJsriWQEM21W5IH4/nVXXFt/PWSIjd0IA5+tRNNJ5IZHKsR1FO1yoc0Xc6/R7jT7OyuTJaxyzS5JLAc1x89zvu5XgUoN5x82Tj3NXvtQurQRN8vHUHrTdN0ae54t4iwwcH1q1sSlYriV5diyyF5O7EdatzR2T7XEKs7AZB5xiq0elzSXTiV/L8pyrZFWo5baxuhmNLjaOGPApoUHFLlRD4hubuS1eKWVxayPuMKghQ553DHSorOwtzapO2RK2SCDU+v6q1+uyKDyohnCk7vxrLtYH4k+7t6c0dRqL5bs0vtSRQJbwIAEOcgdTWffwTXMuOQpHzE9a1LGKFIjIyqzY5PWmRCS9uTHGMccfSnsF0zP0iymtphl1cDknpzW3q2qXdwqW4ghREUAFGK5OOpGOvvUYtxa3Xl3DKoH4gj1puqX0VwI4bWIRqg5OeSaLArSlfcngtwtuS5DsVH5Vm3lusoYbc5G3noRTImnRijysg9R6VpL5fkBkIbjsc0dR3ktLmXZLJbNKYnZFlXY6g4DAEEA/iKdZJEt0Wk" <> ..., "body" => "Sample picture", "imageName" => "1-1536824593426"}


mutation createComment($artId: String!, $body: String) {
  createComment(artId: $artId, body: $body) {
    id
    user {
      id
    }
    artId
    body
  }
}

I am not sure what is wrong with this. But, the mutation is showing only the old arguments. It didn't contain the new arguments added. Also, on my resolver service, I am getting only art_id and body as params as below.

%{art_id: "comma-2005-06", body: "Sample picture"}

Do I miss something? Can anyone please help?

Marcelo De Polli
  • 28,123
  • 4
  • 37
  • 47
Tessy Thomas
  • 1,475
  • 12
  • 19

1 Answers1

0

Not an elixir error

This was due to the schema definition in the FE doesn't contain the new attributes.

Schema Definition Language

To make it easy to understand the capabilities of a server, GraphQL implements a human-readable schema syntax known as its Schema Definition Language, or “SDL”. The SDL is used to express the types available within a schema and how those types relate to each other.

By updating the schema as below in schema.graphql:

mutation createComment($artId: String!, $body: String, $base64Image: String, $imageName: String) {
  createComment(artId: $artId, body: $body, base64Image: $base64Image, imageName: $imageName) {
    ...commentData
  }
}

fragment commentData on Comment {
  id
  user {
    id
    fullName
  }
  artId
  body
  imageUrl
  imageName
}

The GraphQL API works fine now.

Community
  • 1
  • 1
Tessy Thomas
  • 1,475
  • 12
  • 19