Use elixir-google-api to create a folder in GDrive

210 views Asked by At

I am trying to use elixir-google-api to create an application that maintains files and folders on GDrive. I have the following code but am struggling determining exactly how to pass in the name and mimeType.

Has anyone used this api before and can shed some light on where I am going wrong?

Thanks, Peter

def create_folder(name) do
    connection
    |> File.create(name: name, mimeType: type_folder())
  end

  def File.create(connection, opts \\ []) do
        optional_params =
          %{
            :ignoreDefaultVisibility => :query,
            :keepRevisionForever => :query,
            :ocrLanguage => :query,
            :supportsTeamDrives => :query,
            :useContentAsIndexableText => :query,
            :appProperties => :form,
            :description => :form,
            :folderColorRgb => :form,
            :id => :form,
            :mimeType => :form,
            :modifiedTime => :form,
            :name => :form,
            :originalFilename => :form,
            :parents => :form,
            :properties => :form,
            :starred => :form,
            :viewedByMeTime => :form,
            :viewersCanCopyContent => :form,
            :writersCanShare => :form
          }
          |> Map.merge(standard_params())

        connection
        |> GoogleApi.Drive.V3.Api.Files.drive_files_create(Map.to_list(optional_params), opts)
        |> IO.inspect
      end
1

There are 1 answers

1
z5ottu On

I have a working example.

In mix.exs:

#
  defp deps do
    [
      # [your deps]
      #
      {:google_api_drive, "~> 0.12.0"},
      {:goth, "~> 1.1.0"},
    ]
  end
#

In app.ex:

#
# token = [your-valid-oauth-token]
# connection = GoogleApi.Drive.V3.Connection.new(token)
#
# # example:
# create_folder(connection,"foo")
#
# create_folder(connection,"bar", parent_id)   # parent_id = parent folder's id

    def create_folder(connection, name, parent_folder_id \\ nil) do
        parent_folder_id_list = case parent_folder_id do
            nil -> nil
            _ -> [parent_folder_id]
        end
        file_meta = %GoogleApi.Drive.V3.Model.File{name: name, parents: parent_folder_id_list, mimeType: "application/vnd.google-apps.folder"}
        connection |> GoogleApi.Drive.V3.Api.Files.drive_files_create_iodata(nil,file_meta,"",[],[])
    end

# create_file_iodata(connection,"probe.json",%{"asd" => 1}, "application/json")

    def create_file_iodata(connection, name, iodata, mime_type, parent_folder_id \\ nil) do
        parent_folder_id_list = case parent_folder_id do
            nil -> nil
            _ -> [parent_folder_id]
        end
        file_meta = %GoogleApi.Drive.V3.Model.File{name: name, parents: parent_folder_id_list, mimeType: mime_type}
        connection |> GoogleApi.Drive.V3.Api.Files.drive_files_create_iodata("multipart",file_meta,iodata,[],[])
    end
#

You can use drive_files_create_simple instead of drive_files_create_iodata when you want to upload files.

I hope this answer helps you.