lib/docspring/api/pdf.ex

# NOTE: This file is auto generated by OpenAPI Generator 7.11.0 (https://openapi-generator.tech).
# Do not edit this file manually.

defmodule Docspring.Api.PDF do
  @moduledoc """
  API calls for all endpoints tagged `PDF`.
  """

  alias Docspring.Connection
  import Docspring.RequestBuilder

  @doc """
  Add new fields to a Template

  ### Parameters

  - `connection` (Docspring.Connection): Connection to server
  - `template_id` (String.t): 
  - `data` (AddFieldsData): 
  - `opts` (keyword): Optional parameters

  ### Returns

  - `{:ok, Docspring.Model.TemplateAddFieldsResponse.t}` on success
  - `{:error, Tesla.Env.t}` on failure
  """
  @spec add_fields_to_template(Tesla.Env.client, String.t, Docspring.Model.AddFieldsData.t, keyword()) :: {:ok, Docspring.Model.TemplateAddFieldsResponse.t} | {:error, Tesla.Env.t}
  def add_fields_to_template(connection, template_id, data, _opts \\ []) do
    request =
      %{}
      |> method(:put)
      |> url("/templates/#{template_id}/add_fields")
      |> add_param(:body, :body, data)
      |> Enum.into([])

    connection
    |> Connection.request(request)
    |> evaluate_response([
      {200, Docspring.Model.TemplateAddFieldsResponse},
      {422, Docspring.Model.TemplateAddFieldsResponse}
    ])
  end

  @doc """
  Generates multiple PDFs

  ### Parameters

  - `connection` (Docspring.Connection): Connection to server
  - `data` (SubmissionBatchData): 
  - `opts` (keyword): Optional parameters
    - `:wait` (boolean()): Wait for submission batch to be processed before returning. Set to false to return immediately. Default: true (on sync.* subdomain)

  ### Returns

  - `{:ok, Docspring.Model.BatchGeneratePdfs201Response.t}` on success
  - `{:error, Tesla.Env.t}` on failure
  """
  @spec batch_generate_pdfs(Tesla.Env.client, Docspring.Model.SubmissionBatchData.t, keyword()) :: {:ok, Docspring.Model.ErrorResponse.t} | {:ok, Docspring.Model.MultipleErrorsResponse.t} | {:ok, Docspring.Model.BatchGeneratePdfs201Response.t} | {:error, Tesla.Env.t}
  def batch_generate_pdfs(connection, data, opts \\ []) do
    optional_params = %{
      :wait => :query
    }

    request =
      %{}
      |> method(:post)
      |> url("/submissions/batches")
      |> add_param(:body, :body, data)
      |> add_optional_params(optional_params, opts)
      |> Enum.into([])

    connection
    |> Connection.request(request)
    |> evaluate_response([
      {201, Docspring.Model.BatchGeneratePdfs201Response},
      {200, Docspring.Model.BatchGeneratePdfs201Response},
      {401, Docspring.Model.ErrorResponse},
      {422, Docspring.Model.MultipleErrorsResponse},
      {400, Docspring.Model.ErrorResponse}
    ])
  end

  @doc """
  Merge submission PDFs, template PDFs, or custom files

  ### Parameters

  - `connection` (Docspring.Connection): Connection to server
  - `data` (CombinePdfsData): 
  - `opts` (keyword): Optional parameters

  ### Returns

  - `{:ok, Docspring.Model.CreateCombinedSubmissionResponse.t}` on success
  - `{:error, Tesla.Env.t}` on failure
  """
  @spec combine_pdfs(Tesla.Env.client, Docspring.Model.CombinePdfsData.t, keyword()) :: {:ok, Docspring.Model.ErrorResponse.t} | {:ok, Docspring.Model.CreateCombinedSubmissionResponse.t} | {:ok, Docspring.Model.MultipleErrorsResponse.t} | {:error, Tesla.Env.t}
  def combine_pdfs(connection, data, _opts \\ []) do
    request =
      %{}
      |> method(:post)
      |> url("/combined_submissions?v=2")
      |> add_param(:body, :body, data)
      |> Enum.into([])

    connection
    |> Connection.request(request)
    |> evaluate_response([
      {201, Docspring.Model.CreateCombinedSubmissionResponse},
      {422, Docspring.Model.MultipleErrorsResponse},
      {400, Docspring.Model.ErrorResponse},
      {401, Docspring.Model.ErrorResponse}
    ])
  end

  @doc """
  Merge generated PDFs together

  ### Parameters

  - `connection` (Docspring.Connection): Connection to server
  - `data` (CombinedSubmissionData): 
  - `opts` (keyword): Optional parameters
    - `:wait` (boolean()): Wait for combined submission to be processed before returning. Set to false to return immediately. Default: true (on sync.* subdomain)

  ### Returns

  - `{:ok, Docspring.Model.CreateCombinedSubmissionResponse.t}` on success
  - `{:error, Tesla.Env.t}` on failure
  """
  @spec combine_submissions(Tesla.Env.client, Docspring.Model.CombinedSubmissionData.t, keyword()) :: {:ok, Docspring.Model.ErrorResponse.t} | {:ok, Docspring.Model.CreateCombinedSubmissionResponse.t} | {:ok, Docspring.Model.MultipleErrorsResponse.t} | {:error, Tesla.Env.t}
  def combine_submissions(connection, data, opts \\ []) do
    optional_params = %{
      :wait => :query
    }

    request =
      %{}
      |> method(:post)
      |> url("/combined_submissions")
      |> add_param(:body, :body, data)
      |> add_optional_params(optional_params, opts)
      |> Enum.into([])

    connection
    |> Connection.request(request)
    |> evaluate_response([
      {201, Docspring.Model.CreateCombinedSubmissionResponse},
      {422, Docspring.Model.MultipleErrorsResponse},
      {400, Docspring.Model.ErrorResponse},
      {401, Docspring.Model.ErrorResponse}
    ])
  end

  @doc """
  Copy a Template

  ### Parameters

  - `connection` (Docspring.Connection): Connection to server
  - `template_id` (String.t): 
  - `opts` (keyword): Optional parameters
    - `:body` (CopyTemplateOptions): 

  ### Returns

  - `{:ok, Docspring.Model.TemplatePreview.t}` on success
  - `{:error, Tesla.Env.t}` on failure
  """
  @spec copy_template(Tesla.Env.client, String.t, keyword()) :: {:ok, Docspring.Model.ErrorResponse.t} | {:ok, Docspring.Model.TemplatePreview.t} | {:error, Tesla.Env.t}
  def copy_template(connection, template_id, opts \\ []) do
    optional_params = %{
      :body => :body
    }

    request =
      %{}
      |> method(:post)
      |> url("/templates/#{template_id}/copy")
      |> add_optional_params(optional_params, opts)
      |> ensure_body()
      |> Enum.into([])

    connection
    |> Connection.request(request)
    |> evaluate_response([
      {200, Docspring.Model.TemplatePreview},
      {404, Docspring.Model.ErrorResponse}
    ])
  end

  @doc """
  Create a new custom file from a cached presign upload

  ### Parameters

  - `connection` (Docspring.Connection): Connection to server
  - `data` (CreateCustomFileData): 
  - `opts` (keyword): Optional parameters

  ### Returns

  - `{:ok, Docspring.Model.CreateCustomFileResponse.t}` on success
  - `{:error, Tesla.Env.t}` on failure
  """
  @spec create_custom_file_from_upload(Tesla.Env.client, Docspring.Model.CreateCustomFileData.t, keyword()) :: {:ok, Docspring.Model.ErrorResponse.t} | {:ok, Docspring.Model.CreateCustomFileResponse.t} | {:error, Tesla.Env.t}
  def create_custom_file_from_upload(connection, data, _opts \\ []) do
    request =
      %{}
      |> method(:post)
      |> url("/custom_files")
      |> add_param(:body, :body, data)
      |> Enum.into([])

    connection
    |> Connection.request(request)
    |> evaluate_response([
      {201, Docspring.Model.CreateCustomFileResponse},
      {401, Docspring.Model.ErrorResponse}
    ])
  end

  @doc """
  Creates a new event for emailing a signee a request for signature

  ### Parameters

  - `connection` (Docspring.Connection): Connection to server
  - `data_request_id` (String.t): 
  - `event` (CreateSubmissionDataRequestEventRequest): 
  - `opts` (keyword): Optional parameters

  ### Returns

  - `{:ok, Docspring.Model.CreateSubmissionDataRequestEventResponse.t}` on success
  - `{:error, Tesla.Env.t}` on failure
  """
  @spec create_data_request_event(Tesla.Env.client, String.t, Docspring.Model.CreateSubmissionDataRequestEventRequest.t, keyword()) :: {:ok, Docspring.Model.ErrorResponse.t} | {:ok, Docspring.Model.CreateSubmissionDataRequestEventResponse.t} | {:ok, Docspring.Model.MultipleErrorsResponse.t} | {:error, Tesla.Env.t}
  def create_data_request_event(connection, data_request_id, event, _opts \\ []) do
    request =
      %{}
      |> method(:post)
      |> url("/data_requests/#{data_request_id}/events")
      |> add_param(:body, :body, event)
      |> Enum.into([])

    connection
    |> Connection.request(request)
    |> evaluate_response([
      {201, Docspring.Model.CreateSubmissionDataRequestEventResponse},
      {401, Docspring.Model.ErrorResponse},
      {422, Docspring.Model.MultipleErrorsResponse}
    ])
  end

  @doc """
  Creates a new data request token for form authentication

  ### Parameters

  - `connection` (Docspring.Connection): Connection to server
  - `data_request_id` (String.t): 
  - `opts` (keyword): Optional parameters
    - `:type` (String.t): 

  ### Returns

  - `{:ok, Docspring.Model.CreateSubmissionDataRequestTokenResponse.t}` on success
  - `{:error, Tesla.Env.t}` on failure
  """
  @spec create_data_request_token(Tesla.Env.client, String.t, keyword()) :: {:ok, Docspring.Model.CreateSubmissionDataRequestTokenResponse.t} | {:ok, Docspring.Model.ErrorResponse.t} | {:error, Tesla.Env.t}
  def create_data_request_token(connection, data_request_id, opts \\ []) do
    optional_params = %{
      :type => :query
    }

    request =
      %{}
      |> method(:post)
      |> url("/data_requests/#{data_request_id}/tokens")
      |> add_optional_params(optional_params, opts)
      |> ensure_body()
      |> Enum.into([])

    connection
    |> Connection.request(request)
    |> evaluate_response([
      {201, Docspring.Model.CreateSubmissionDataRequestTokenResponse},
      {401, Docspring.Model.ErrorResponse},
      {422, Docspring.Model.ErrorResponse}
    ])
  end

  @doc """
  Create a folder

  ### Parameters

  - `connection` (Docspring.Connection): Connection to server
  - `data` (CreateFolderData): 
  - `opts` (keyword): Optional parameters

  ### Returns

  - `{:ok, Docspring.Model.Folder.t}` on success
  - `{:error, Tesla.Env.t}` on failure
  """
  @spec create_folder(Tesla.Env.client, Docspring.Model.CreateFolderData.t, keyword()) :: {:ok, Docspring.Model.ErrorResponse.t} | {:ok, Docspring.Model.Folder.t} | {:ok, Docspring.Model.MultipleErrorsResponse.t} | {:error, Tesla.Env.t}
  def create_folder(connection, data, _opts \\ []) do
    request =
      %{}
      |> method(:post)
      |> url("/folders/")
      |> add_param(:body, :body, data)
      |> Enum.into([])

    connection
    |> Connection.request(request)
    |> evaluate_response([
      {422, Docspring.Model.MultipleErrorsResponse},
      {404, Docspring.Model.ErrorResponse},
      {200, Docspring.Model.Folder},
      {401, Docspring.Model.ErrorResponse}
    ])
  end

  @doc """
  Create a new HTML template

  ### Parameters

  - `connection` (Docspring.Connection): Connection to server
  - `data` (CreateHtmlTemplate): 
  - `opts` (keyword): Optional parameters

  ### Returns

  - `{:ok, Docspring.Model.TemplatePreview.t}` on success
  - `{:error, Tesla.Env.t}` on failure
  """
  @spec create_html_template(Tesla.Env.client, Docspring.Model.CreateHtmlTemplate.t, keyword()) :: {:ok, Docspring.Model.ErrorResponse.t} | {:ok, Docspring.Model.TemplatePreview.t} | {:error, Tesla.Env.t}
  def create_html_template(connection, data, _opts \\ []) do
    request =
      %{}
      |> method(:post)
      |> url("/templates?endpoint_description=html")
      |> add_param(:body, :body, data)
      |> Enum.into([])

    connection
    |> Connection.request(request)
    |> evaluate_response([
      {201, Docspring.Model.TemplatePreview},
      {401, Docspring.Model.ErrorResponse}
    ])
  end

  @doc """
  Create a new PDF template with a form POST file upload

  ### Parameters

  - `connection` (Docspring.Connection): Connection to server
  - `template_left_square_bracketdocument_right_square_bracket` (String.t): 
  - `template_left_square_bracketname_right_square_bracket` (String.t): 
  - `opts` (keyword): Optional parameters
    - `:wait` (boolean()): Wait for template document to be processed before returning. Set to false to return immediately. Default: true (on sync.* subdomain)
    - `:"template[description]"` (String.t): 
    - `:"template[parent_folder_id]"` (String.t): 

  ### Returns

  - `{:ok, Docspring.Model.TemplatePreview.t}` on success
  - `{:error, Tesla.Env.t}` on failure
  """
  @spec create_pdf_template(Tesla.Env.client, String.t, String.t, keyword()) :: {:ok, Docspring.Model.ErrorResponse.t} | {:ok, Docspring.Model.TemplatePreview.t} | {:error, Tesla.Env.t}
  def create_pdf_template(connection, template_left_square_bracketdocument_right_square_bracket, template_left_square_bracketname_right_square_bracket, opts \\ []) do
    optional_params = %{
      :wait => :query,
      :"template[description]" => :form,
      :"template[parent_folder_id]" => :form
    }

    request =
      %{}
      |> method(:post)
      |> url("/templates")
      |> add_param(:file, :"template[document]", template_left_square_bracketdocument_right_square_bracket)
      |> add_param(:form, :"template[name]", template_left_square_bracketname_right_square_bracket)
      |> add_optional_params(optional_params, opts)
      |> Enum.into([])

    connection
    |> Connection.request(request)
    |> evaluate_response([
      {201, Docspring.Model.TemplatePreview},
      {401, Docspring.Model.ErrorResponse}
    ])
  end

  @doc """
  Create a new PDF template from a cached presign upload

  ### Parameters

  - `connection` (Docspring.Connection): Connection to server
  - `data` (CreatePdfTemplate): 
  - `opts` (keyword): Optional parameters

  ### Returns

  - `{:ok, Docspring.Model.TemplatePreview.t}` on success
  - `{:error, Tesla.Env.t}` on failure
  """
  @spec create_pdf_template_from_upload(Tesla.Env.client, Docspring.Model.CreatePdfTemplate.t, keyword()) :: {:ok, Docspring.Model.ErrorResponse.t} | {:ok, Docspring.Model.TemplatePreview.t} | {:error, Tesla.Env.t}
  def create_pdf_template_from_upload(connection, data, _opts \\ []) do
    request =
      %{}
      |> method(:post)
      |> url("/templates?endpoint_description=cached_upload")
      |> add_param(:body, :body, data)
      |> Enum.into([])

    connection
    |> Connection.request(request)
    |> evaluate_response([
      {201, Docspring.Model.TemplatePreview},
      {401, Docspring.Model.ErrorResponse}
    ])
  end

  @doc """
  Delete a folder

  ### Parameters

  - `connection` (Docspring.Connection): Connection to server
  - `folder_id` (String.t): 
  - `opts` (keyword): Optional parameters

  ### Returns

  - `{:ok, Docspring.Model.Folder.t}` on success
  - `{:error, Tesla.Env.t}` on failure
  """
  @spec delete_folder(Tesla.Env.client, String.t, keyword()) :: {:ok, Docspring.Model.ErrorResponse.t} | {:ok, Docspring.Model.Folder.t} | {:error, Tesla.Env.t}
  def delete_folder(connection, folder_id, _opts \\ []) do
    request =
      %{}
      |> method(:delete)
      |> url("/folders/#{folder_id}")
      |> Enum.into([])

    connection
    |> Connection.request(request)
    |> evaluate_response([
      {404, Docspring.Model.ErrorResponse},
      {422, Docspring.Model.ErrorResponse},
      {200, Docspring.Model.Folder},
      {401, Docspring.Model.ErrorResponse}
    ])
  end

  @doc """
  Delete a template

  ### Parameters

  - `connection` (Docspring.Connection): Connection to server
  - `template_id` (String.t): 
  - `opts` (keyword): Optional parameters
    - `:version` (String.t): 

  ### Returns

  - `{:ok, Docspring.Model.TemplateDeleteResponse.t}` on success
  - `{:error, Tesla.Env.t}` on failure
  """
  @spec delete_template(Tesla.Env.client, String.t, keyword()) :: {:ok, Docspring.Model.ErrorResponse.t} | {:ok, Docspring.Model.TemplateDeleteResponse.t} | {:error, Tesla.Env.t}
  def delete_template(connection, template_id, opts \\ []) do
    optional_params = %{
      :version => :query
    }

    request =
      %{}
      |> method(:delete)
      |> url("/templates/#{template_id}")
      |> add_optional_params(optional_params, opts)
      |> Enum.into([])

    connection
    |> Connection.request(request)
    |> evaluate_response([
      {200, Docspring.Model.TemplateDeleteResponse},
      {404, Docspring.Model.ErrorResponse},
      {401, Docspring.Model.ErrorResponse}
    ])
  end

  @doc """
  Expire a combined submission

  ### Parameters

  - `connection` (Docspring.Connection): Connection to server
  - `combined_submission_id` (String.t): 
  - `opts` (keyword): Optional parameters

  ### Returns

  - `{:ok, Docspring.Model.CombinedSubmission.t}` on success
  - `{:error, Tesla.Env.t}` on failure
  """
  @spec expire_combined_submission(Tesla.Env.client, String.t, keyword()) :: {:ok, Docspring.Model.ErrorResponse.t} | {:ok, Docspring.Model.CombinedSubmission.t} | {:error, Tesla.Env.t}
  def expire_combined_submission(connection, combined_submission_id, _opts \\ []) do
    request =
      %{}
      |> method(:delete)
      |> url("/combined_submissions/#{combined_submission_id}")
      |> Enum.into([])

    connection
    |> Connection.request(request)
    |> evaluate_response([
      {200, Docspring.Model.CombinedSubmission},
      {404, Docspring.Model.ErrorResponse},
      {403, Docspring.Model.ErrorResponse},
      {401, Docspring.Model.ErrorResponse}
    ])
  end

  @doc """
  Expire a PDF submission

  ### Parameters

  - `connection` (Docspring.Connection): Connection to server
  - `submission_id` (String.t): 
  - `opts` (keyword): Optional parameters

  ### Returns

  - `{:ok, Docspring.Model.SubmissionPreview.t}` on success
  - `{:error, Tesla.Env.t}` on failure
  """
  @spec expire_submission(Tesla.Env.client, String.t, keyword()) :: {:ok, Docspring.Model.ErrorResponse.t} | {:ok, Docspring.Model.SubmissionPreview.t} | {:error, Tesla.Env.t}
  def expire_submission(connection, submission_id, _opts \\ []) do
    request =
      %{}
      |> method(:delete)
      |> url("/submissions/#{submission_id}")
      |> Enum.into([])

    connection
    |> Connection.request(request)
    |> evaluate_response([
      {200, Docspring.Model.SubmissionPreview},
      {404, Docspring.Model.ErrorResponse},
      {401, Docspring.Model.ErrorResponse},
      {403, Docspring.Model.ErrorResponse}
    ])
  end

  @doc """
  Generates a new PDF

  ### Parameters

  - `connection` (Docspring.Connection): Connection to server
  - `template_id` (String.t): 
  - `submission` (CreatePdfSubmissionData): 
  - `opts` (keyword): Optional parameters
    - `:wait` (boolean()): Wait for submission to be processed before returning. Set to false to return immediately. Default: true (on sync.* subdomain)

  ### Returns

  - `{:ok, Docspring.Model.CreateSubmissionResponse.t}` on success
  - `{:error, Tesla.Env.t}` on failure
  """
  @spec generate_pdf(Tesla.Env.client, String.t, Docspring.Model.CreatePdfSubmissionData.t, keyword()) :: {:ok, Docspring.Model.ErrorResponse.t} | {:ok, Docspring.Model.CreateSubmissionResponse.t} | {:error, Tesla.Env.t}
  def generate_pdf(connection, template_id, submission, opts \\ []) do
    optional_params = %{
      :wait => :query
    }

    request =
      %{}
      |> method(:post)
      |> url("/templates/#{template_id}/submissions")
      |> add_param(:body, :body, submission)
      |> add_optional_params(optional_params, opts)
      |> Enum.into([])

    connection
    |> Connection.request(request)
    |> evaluate_response([
      {201, Docspring.Model.CreateSubmissionResponse},
      {422, Docspring.Model.ErrorResponse},
      {401, Docspring.Model.ErrorResponse}
    ])
  end

  @doc """
  Generates a new PDF for an HTML template

  ### Parameters

  - `connection` (Docspring.Connection): Connection to server
  - `template_id` (String.t): 
  - `submission` (CreateHtmlSubmissionData): 
  - `opts` (keyword): Optional parameters
    - `:wait` (boolean()): Wait for submission to be processed before returning. Set to false to return immediately. Default: true (on sync.* subdomain)

  ### Returns

  - `{:ok, Docspring.Model.CreateSubmissionResponse.t}` on success
  - `{:error, Tesla.Env.t}` on failure
  """
  @spec generate_pdf_for_html_template(Tesla.Env.client, String.t, Docspring.Model.CreateHtmlSubmissionData.t, keyword()) :: {:ok, Docspring.Model.CreateSubmissionResponse.t} | {:error, Tesla.Env.t}
  def generate_pdf_for_html_template(connection, template_id, submission, opts \\ []) do
    optional_params = %{
      :wait => :query
    }

    request =
      %{}
      |> method(:post)
      |> url("/templates/#{template_id}/submissions?endpoint_description=html_templates")
      |> add_param(:body, :body, submission)
      |> add_optional_params(optional_params, opts)
      |> Enum.into([])

    connection
    |> Connection.request(request)
    |> evaluate_response([
      {201, Docspring.Model.CreateSubmissionResponse}
    ])
  end

  @doc """
  Generated a preview PDF for partially completed data requests

  ### Parameters

  - `connection` (Docspring.Connection): Connection to server
  - `submission_id` (String.t): 
  - `opts` (keyword): Optional parameters

  ### Returns

  - `{:ok, Docspring.Model.SuccessErrorResponse.t}` on success
  - `{:error, Tesla.Env.t}` on failure
  """
  @spec generate_preview(Tesla.Env.client, String.t, keyword()) :: {:ok, Docspring.Model.ErrorResponse.t} | {:ok, Docspring.Model.SuccessErrorResponse.t} | {:error, Tesla.Env.t}
  def generate_preview(connection, submission_id, _opts \\ []) do
    request =
      %{}
      |> method(:post)
      |> url("/submissions/#{submission_id}/generate_preview")
      |> ensure_body()
      |> Enum.into([])

    connection
    |> Connection.request(request)
    |> evaluate_response([
      {200, Docspring.Model.SuccessErrorResponse},
      {404, Docspring.Model.ErrorResponse},
      {422, Docspring.Model.SuccessErrorResponse}
    ])
  end

  @doc """
  Check the status of a combined submission (merged PDFs)

  ### Parameters

  - `connection` (Docspring.Connection): Connection to server
  - `combined_submission_id` (String.t): 
  - `opts` (keyword): Optional parameters

  ### Returns

  - `{:ok, Docspring.Model.CombinedSubmission.t}` on success
  - `{:error, Tesla.Env.t}` on failure
  """
  @spec get_combined_submission(Tesla.Env.client, String.t, keyword()) :: {:ok, Docspring.Model.ErrorResponse.t} | {:ok, Docspring.Model.CombinedSubmission.t} | {:error, Tesla.Env.t}
  def get_combined_submission(connection, combined_submission_id, _opts \\ []) do
    request =
      %{}
      |> method(:get)
      |> url("/combined_submissions/#{combined_submission_id}")
      |> Enum.into([])

    connection
    |> Connection.request(request)
    |> evaluate_response([
      {200, Docspring.Model.CombinedSubmission},
      {404, Docspring.Model.ErrorResponse},
      {401, Docspring.Model.ErrorResponse}
    ])
  end

  @doc """
  Look up a submission data request

  ### Parameters

  - `connection` (Docspring.Connection): Connection to server
  - `data_request_id` (String.t): 
  - `opts` (keyword): Optional parameters

  ### Returns

  - `{:ok, Docspring.Model.SubmissionDataRequestShow.t}` on success
  - `{:error, Tesla.Env.t}` on failure
  """
  @spec get_data_request(Tesla.Env.client, String.t, keyword()) :: {:ok, Docspring.Model.ErrorResponse.t} | {:ok, Docspring.Model.SubmissionDataRequestShow.t} | {:error, Tesla.Env.t}
  def get_data_request(connection, data_request_id, _opts \\ []) do
    request =
      %{}
      |> method(:get)
      |> url("/data_requests/#{data_request_id}")
      |> Enum.into([])

    connection
    |> Connection.request(request)
    |> evaluate_response([
      {200, Docspring.Model.SubmissionDataRequestShow},
      {404, Docspring.Model.ErrorResponse},
      {401, Docspring.Model.ErrorResponse}
    ])
  end

  @doc """
  Fetch the full attributes for a PDF template

  ### Parameters

  - `connection` (Docspring.Connection): Connection to server
  - `template_id` (String.t): 
  - `opts` (keyword): Optional parameters

  ### Returns

  - `{:ok, Docspring.Model.Template.t}` on success
  - `{:error, Tesla.Env.t}` on failure
  """
  @spec get_full_template(Tesla.Env.client, String.t, keyword()) :: {:ok, Docspring.Model.ErrorResponse.t} | {:ok, Docspring.Model.Template.t} | {:error, Tesla.Env.t}
  def get_full_template(connection, template_id, _opts \\ []) do
    request =
      %{}
      |> method(:get)
      |> url("/templates/#{template_id}?full=true")
      |> Enum.into([])

    connection
    |> Connection.request(request)
    |> evaluate_response([
      {200, Docspring.Model.Template},
      {404, Docspring.Model.ErrorResponse},
      {401, Docspring.Model.ErrorResponse}
    ])
  end

  @doc """
  Get a presigned URL so that you can upload a file to our AWS S3 bucket

  ### Parameters

  - `connection` (Docspring.Connection): Connection to server
  - `opts` (keyword): Optional parameters

  ### Returns

  - `{:ok, Docspring.Model.UploadPresignResponse.t}` on success
  - `{:error, Tesla.Env.t}` on failure
  """
  @spec get_presign_url(Tesla.Env.client, keyword()) :: {:ok, Docspring.Model.ErrorResponse.t} | {:ok, Docspring.Model.UploadPresignResponse.t} | {:error, Tesla.Env.t}
  def get_presign_url(connection, _opts \\ []) do
    request =
      %{}
      |> method(:get)
      |> url("/uploads/presign")
      |> Enum.into([])

    connection
    |> Connection.request(request)
    |> evaluate_response([
      {200, Docspring.Model.UploadPresignResponse},
      {401, Docspring.Model.ErrorResponse}
    ])
  end

  @doc """
  Check the status of a PDF

  ### Parameters

  - `connection` (Docspring.Connection): Connection to server
  - `submission_id` (String.t): 
  - `opts` (keyword): Optional parameters
    - `:include_data` (boolean()): 

  ### Returns

  - `{:ok, Docspring.Model.Submission.t}` on success
  - `{:error, Tesla.Env.t}` on failure
  """
  @spec get_submission(Tesla.Env.client, String.t, keyword()) :: {:ok, Docspring.Model.ErrorResponse.t} | {:ok, Docspring.Model.Submission.t} | {:error, Tesla.Env.t}
  def get_submission(connection, submission_id, opts \\ []) do
    optional_params = %{
      :include_data => :query
    }

    request =
      %{}
      |> method(:get)
      |> url("/submissions/#{submission_id}")
      |> add_optional_params(optional_params, opts)
      |> Enum.into([])

    connection
    |> Connection.request(request)
    |> evaluate_response([
      {200, Docspring.Model.Submission},
      {404, Docspring.Model.ErrorResponse},
      {401, Docspring.Model.ErrorResponse}
    ])
  end

  @doc """
  Check the status of a submission batch job

  ### Parameters

  - `connection` (Docspring.Connection): Connection to server
  - `submission_batch_id` (String.t): 
  - `opts` (keyword): Optional parameters
    - `:include_submissions` (boolean()): 

  ### Returns

  - `{:ok, Docspring.Model.SubmissionBatchWithSubmissions.t}` on success
  - `{:error, Tesla.Env.t}` on failure
  """
  @spec get_submission_batch(Tesla.Env.client, String.t, keyword()) :: {:ok, Docspring.Model.ErrorResponse.t} | {:ok, Docspring.Model.SubmissionBatchWithSubmissions.t} | {:error, Tesla.Env.t}
  def get_submission_batch(connection, submission_batch_id, opts \\ []) do
    optional_params = %{
      :include_submissions => :query
    }

    request =
      %{}
      |> method(:get)
      |> url("/submissions/batches/#{submission_batch_id}")
      |> add_optional_params(optional_params, opts)
      |> Enum.into([])

    connection
    |> Connection.request(request)
    |> evaluate_response([
      {200, Docspring.Model.SubmissionBatchWithSubmissions},
      {404, Docspring.Model.ErrorResponse},
      {401, Docspring.Model.ErrorResponse}
    ])
  end

  @doc """
  Check the status of an uploaded template

  ### Parameters

  - `connection` (Docspring.Connection): Connection to server
  - `template_id` (String.t): 
  - `opts` (keyword): Optional parameters

  ### Returns

  - `{:ok, Docspring.Model.TemplatePreview.t}` on success
  - `{:error, Tesla.Env.t}` on failure
  """
  @spec get_template(Tesla.Env.client, String.t, keyword()) :: {:ok, Docspring.Model.ErrorResponse.t} | {:ok, Docspring.Model.TemplatePreview.t} | {:error, Tesla.Env.t}
  def get_template(connection, template_id, _opts \\ []) do
    request =
      %{}
      |> method(:get)
      |> url("/templates/#{template_id}")
      |> Enum.into([])

    connection
    |> Connection.request(request)
    |> evaluate_response([
      {200, Docspring.Model.TemplatePreview},
      {404, Docspring.Model.ErrorResponse},
      {401, Docspring.Model.ErrorResponse}
    ])
  end

  @doc """
  Fetch the JSON schema for a template

  ### Parameters

  - `connection` (Docspring.Connection): Connection to server
  - `template_id` (String.t): 
  - `opts` (keyword): Optional parameters

  ### Returns

  - `{:ok, Docspring.Model.JsonSchema.t}` on success
  - `{:error, Tesla.Env.t}` on failure
  """
  @spec get_template_schema(Tesla.Env.client, String.t, keyword()) :: {:ok, Docspring.Model.ErrorResponse.t} | {:ok, Docspring.Model.JsonSchema.t} | {:error, Tesla.Env.t}
  def get_template_schema(connection, template_id, _opts \\ []) do
    request =
      %{}
      |> method(:get)
      |> url("/templates/#{template_id}/schema")
      |> Enum.into([])

    connection
    |> Connection.request(request)
    |> evaluate_response([
      {200, Docspring.Model.JsonSchema},
      {404, Docspring.Model.ErrorResponse},
      {401, Docspring.Model.ErrorResponse}
    ])
  end

  @doc """
  Get a list of all combined submissions

  ### Parameters

  - `connection` (Docspring.Connection): Connection to server
  - `opts` (keyword): Optional parameters
    - `:page` (integer()): Default: 1
    - `:per_page` (integer()): Default: 50

  ### Returns

  - `{:ok, [%CombinedSubmission{}, ...]}` on success
  - `{:error, Tesla.Env.t}` on failure
  """
  @spec list_combined_submissions(Tesla.Env.client, keyword()) :: {:ok, Docspring.Model.ErrorResponse.t} | {:ok, [Docspring.Model.CombinedSubmission.t]} | {:error, Tesla.Env.t}
  def list_combined_submissions(connection, opts \\ []) do
    optional_params = %{
      :page => :query,
      :per_page => :query
    }

    request =
      %{}
      |> method(:get)
      |> url("/combined_submissions")
      |> add_optional_params(optional_params, opts)
      |> Enum.into([])

    connection
    |> Connection.request(request)
    |> evaluate_response([
      {200, Docspring.Model.CombinedSubmission},
      {401, Docspring.Model.ErrorResponse}
    ])
  end

  @doc """
  Get a list of all folders

  ### Parameters

  - `connection` (Docspring.Connection): Connection to server
  - `opts` (keyword): Optional parameters
    - `:parent_folder_id` (String.t): Filter By Folder Id

  ### Returns

  - `{:ok, [%Folder{}, ...]}` on success
  - `{:error, Tesla.Env.t}` on failure
  """
  @spec list_folders(Tesla.Env.client, keyword()) :: {:ok, Docspring.Model.ErrorResponse.t} | {:ok, [Docspring.Model.Folder.t]} | {:error, Tesla.Env.t}
  def list_folders(connection, opts \\ []) do
    optional_params = %{
      :parent_folder_id => :query
    }

    request =
      %{}
      |> method(:get)
      |> url("/folders/")
      |> add_optional_params(optional_params, opts)
      |> Enum.into([])

    connection
    |> Connection.request(request)
    |> evaluate_response([
      {200, Docspring.Model.Folder},
      {401, Docspring.Model.ErrorResponse}
    ])
  end

  @doc """
  List all submissions

  ### Parameters

  - `connection` (Docspring.Connection): Connection to server
  - `opts` (keyword): Optional parameters
    - `:cursor` (String.t): 
    - `:limit` (float()): 
    - `:created_after` (String.t): 
    - `:created_before` (String.t): 
    - `:type` (String.t): 
    - `:include_data` (boolean()): 

  ### Returns

  - `{:ok, Docspring.Model.ListSubmissionsResponse.t}` on success
  - `{:error, Tesla.Env.t}` on failure
  """
  @spec list_submissions(Tesla.Env.client, keyword()) :: {:ok, Docspring.Model.ErrorResponse.t} | {:ok, Docspring.Model.ListSubmissionsResponse.t} | {:error, Tesla.Env.t}
  def list_submissions(connection, opts \\ []) do
    optional_params = %{
      :cursor => :query,
      :limit => :query,
      :created_after => :query,
      :created_before => :query,
      :type => :query,
      :include_data => :query
    }

    request =
      %{}
      |> method(:get)
      |> url("/submissions")
      |> add_optional_params(optional_params, opts)
      |> Enum.into([])

    connection
    |> Connection.request(request)
    |> evaluate_response([
      {200, Docspring.Model.ListSubmissionsResponse},
      {422, Docspring.Model.ErrorResponse},
      {401, Docspring.Model.ErrorResponse}
    ])
  end

  @doc """
  List all submissions for a given template

  ### Parameters

  - `connection` (Docspring.Connection): Connection to server
  - `template_id` (String.t): 
  - `opts` (keyword): Optional parameters
    - `:cursor` (String.t): 
    - `:limit` (float()): 
    - `:created_after` (String.t): 
    - `:created_before` (String.t): 
    - `:type` (String.t): 
    - `:include_data` (boolean()): 

  ### Returns

  - `{:ok, Docspring.Model.ListSubmissionsResponse.t}` on success
  - `{:error, Tesla.Env.t}` on failure
  """
  @spec list_template_submissions(Tesla.Env.client, String.t, keyword()) :: {:ok, Docspring.Model.ErrorResponse.t} | {:ok, Docspring.Model.ListSubmissionsResponse.t} | {:error, Tesla.Env.t}
  def list_template_submissions(connection, template_id, opts \\ []) do
    optional_params = %{
      :cursor => :query,
      :limit => :query,
      :created_after => :query,
      :created_before => :query,
      :type => :query,
      :include_data => :query
    }

    request =
      %{}
      |> method(:get)
      |> url("/templates/#{template_id}/submissions")
      |> add_optional_params(optional_params, opts)
      |> Enum.into([])

    connection
    |> Connection.request(request)
    |> evaluate_response([
      {200, Docspring.Model.ListSubmissionsResponse},
      {404, Docspring.Model.ErrorResponse}
    ])
  end

  @doc """
  Get a list of all templates

  ### Parameters

  - `connection` (Docspring.Connection): Connection to server
  - `opts` (keyword): Optional parameters
    - `:query` (String.t): Search By Name
    - `:parent_folder_id` (String.t): Filter By Folder Id
    - `:page` (integer()): Default: 1
    - `:per_page` (integer()): Default: 50

  ### Returns

  - `{:ok, [%TemplatePreview{}, ...]}` on success
  - `{:error, Tesla.Env.t}` on failure
  """
  @spec list_templates(Tesla.Env.client, keyword()) :: {:ok, Docspring.Model.ErrorResponse.t} | {:ok, [Docspring.Model.TemplatePreview.t]} | {:error, Tesla.Env.t}
  def list_templates(connection, opts \\ []) do
    optional_params = %{
      :query => :query,
      :parent_folder_id => :query,
      :page => :query,
      :per_page => :query
    }

    request =
      %{}
      |> method(:get)
      |> url("/templates")
      |> add_optional_params(optional_params, opts)
      |> Enum.into([])

    connection
    |> Connection.request(request)
    |> evaluate_response([
      {200, Docspring.Model.TemplatePreview},
      {404, Docspring.Model.ErrorResponse},
      {401, Docspring.Model.ErrorResponse}
    ])
  end

  @doc """
  Move a folder

  ### Parameters

  - `connection` (Docspring.Connection): Connection to server
  - `folder_id` (String.t): 
  - `data` (MoveFolderData): 
  - `opts` (keyword): Optional parameters

  ### Returns

  - `{:ok, Docspring.Model.Folder.t}` on success
  - `{:error, Tesla.Env.t}` on failure
  """
  @spec move_folder_to_folder(Tesla.Env.client, String.t, Docspring.Model.MoveFolderData.t, keyword()) :: {:ok, Docspring.Model.ErrorResponse.t} | {:ok, Docspring.Model.Folder.t} | {:error, Tesla.Env.t}
  def move_folder_to_folder(connection, folder_id, data, _opts \\ []) do
    request =
      %{}
      |> method(:post)
      |> url("/folders/#{folder_id}/move")
      |> add_param(:body, :body, data)
      |> Enum.into([])

    connection
    |> Connection.request(request)
    |> evaluate_response([
      {404, Docspring.Model.ErrorResponse},
      {200, Docspring.Model.Folder},
      {401, Docspring.Model.ErrorResponse}
    ])
  end

  @doc """
  Move Template to folder

  ### Parameters

  - `connection` (Docspring.Connection): Connection to server
  - `template_id` (String.t): 
  - `data` (MoveTemplateData): 
  - `opts` (keyword): Optional parameters

  ### Returns

  - `{:ok, Docspring.Model.TemplatePreview.t}` on success
  - `{:error, Tesla.Env.t}` on failure
  """
  @spec move_template_to_folder(Tesla.Env.client, String.t, Docspring.Model.MoveTemplateData.t, keyword()) :: {:ok, Docspring.Model.ErrorResponse.t} | {:ok, Docspring.Model.TemplatePreview.t} | {:error, Tesla.Env.t}
  def move_template_to_folder(connection, template_id, data, _opts \\ []) do
    request =
      %{}
      |> method(:post)
      |> url("/templates/#{template_id}/move")
      |> add_param(:body, :body, data)
      |> Enum.into([])

    connection
    |> Connection.request(request)
    |> evaluate_response([
      {200, Docspring.Model.TemplatePreview},
      {404, Docspring.Model.ErrorResponse}
    ])
  end

  @doc """
  Publish a template version

  ### Parameters

  - `connection` (Docspring.Connection): Connection to server
  - `template_id` (String.t): 
  - `data` (PublishVersionData): 
  - `opts` (keyword): Optional parameters

  ### Returns

  - `{:ok, Docspring.Model.TemplatePublishVersionResponse.t}` on success
  - `{:error, Tesla.Env.t}` on failure
  """
  @spec publish_template_version(Tesla.Env.client, String.t, Docspring.Model.PublishVersionData.t, keyword()) :: {:ok, Docspring.Model.SuccessMultipleErrorsResponse.t} | {:ok, Docspring.Model.ErrorResponse.t} | {:ok, Docspring.Model.TemplatePublishVersionResponse.t} | {:error, Tesla.Env.t}
  def publish_template_version(connection, template_id, data, _opts \\ []) do
    request =
      %{}
      |> method(:post)
      |> url("/templates/#{template_id}/publish_version")
      |> add_param(:body, :body, data)
      |> Enum.into([])

    connection
    |> Connection.request(request)
    |> evaluate_response([
      {200, Docspring.Model.TemplatePublishVersionResponse},
      {422, Docspring.Model.SuccessMultipleErrorsResponse},
      {404, Docspring.Model.ErrorResponse},
      {401, Docspring.Model.ErrorResponse}
    ])
  end

  @doc """
  Rename a folder

  ### Parameters

  - `connection` (Docspring.Connection): Connection to server
  - `folder_id` (String.t): 
  - `data` (RenameFolderData): 
  - `opts` (keyword): Optional parameters

  ### Returns

  - `{:ok, Docspring.Model.Folder.t}` on success
  - `{:error, Tesla.Env.t}` on failure
  """
  @spec rename_folder(Tesla.Env.client, String.t, Docspring.Model.RenameFolderData.t, keyword()) :: {:ok, Docspring.Model.ErrorResponse.t} | {:ok, Docspring.Model.Folder.t} | {:ok, Docspring.Model.MultipleErrorsResponse.t} | {:error, Tesla.Env.t}
  def rename_folder(connection, folder_id, data, _opts \\ []) do
    request =
      %{}
      |> method(:post)
      |> url("/folders/#{folder_id}/rename")
      |> add_param(:body, :body, data)
      |> Enum.into([])

    connection
    |> Connection.request(request)
    |> evaluate_response([
      {422, Docspring.Model.MultipleErrorsResponse},
      {404, Docspring.Model.ErrorResponse},
      {200, Docspring.Model.Folder},
      {401, Docspring.Model.ErrorResponse}
    ])
  end

  @doc """
  Restore a template version

  ### Parameters

  - `connection` (Docspring.Connection): Connection to server
  - `template_id` (String.t): 
  - `data` (RestoreVersionData): 
  - `opts` (keyword): Optional parameters

  ### Returns

  - `{:ok, Docspring.Model.SuccessErrorResponse.t}` on success
  - `{:error, Tesla.Env.t}` on failure
  """
  @spec restore_template_version(Tesla.Env.client, String.t, Docspring.Model.RestoreVersionData.t, keyword()) :: {:ok, Docspring.Model.SuccessMultipleErrorsResponse.t} | {:ok, Docspring.Model.ErrorResponse.t} | {:ok, Docspring.Model.SuccessErrorResponse.t} | {:error, Tesla.Env.t}
  def restore_template_version(connection, template_id, data, _opts \\ []) do
    request =
      %{}
      |> method(:post)
      |> url("/templates/#{template_id}/restore_version")
      |> add_param(:body, :body, data)
      |> Enum.into([])

    connection
    |> Connection.request(request)
    |> evaluate_response([
      {200, Docspring.Model.SuccessErrorResponse},
      {422, Docspring.Model.SuccessMultipleErrorsResponse},
      {404, Docspring.Model.SuccessMultipleErrorsResponse},
      {401, Docspring.Model.ErrorResponse}
    ])
  end

  @doc """
  Test Authentication

  ### Parameters

  - `connection` (Docspring.Connection): Connection to server
  - `opts` (keyword): Optional parameters

  ### Returns

  - `{:ok, Docspring.Model.SuccessErrorResponse.t}` on success
  - `{:error, Tesla.Env.t}` on failure
  """
  @spec test_authentication(Tesla.Env.client, keyword()) :: {:ok, Docspring.Model.SuccessErrorResponse.t} | {:error, Tesla.Env.t}
  def test_authentication(connection, _opts \\ []) do
    request =
      %{}
      |> method(:get)
      |> url("/authentication")
      |> Enum.into([])

    connection
    |> Connection.request(request)
    |> evaluate_response([
      {200, Docspring.Model.SuccessErrorResponse},
      {401, Docspring.Model.SuccessErrorResponse}
    ])
  end

  @doc """
  Update a submission data request

  ### Parameters

  - `connection` (Docspring.Connection): Connection to server
  - `data_request_id` (String.t): 
  - `data` (UpdateSubmissionDataRequestData): 
  - `opts` (keyword): Optional parameters

  ### Returns

  - `{:ok, Docspring.Model.CreateSubmissionDataRequestResponse.t}` on success
  - `{:error, Tesla.Env.t}` on failure
  """
  @spec update_data_request(Tesla.Env.client, String.t, Docspring.Model.UpdateSubmissionDataRequestData.t, keyword()) :: {:ok, Docspring.Model.ErrorResponse.t} | {:ok, Docspring.Model.CreateSubmissionDataRequestResponse.t} | {:ok, Docspring.Model.MultipleErrorsResponse.t} | {:error, Tesla.Env.t}
  def update_data_request(connection, data_request_id, data, _opts \\ []) do
    request =
      %{}
      |> method(:put)
      |> url("/data_requests/#{data_request_id}")
      |> add_param(:body, :body, data)
      |> Enum.into([])

    connection
    |> Connection.request(request)
    |> evaluate_response([
      {200, Docspring.Model.CreateSubmissionDataRequestResponse},
      {422, Docspring.Model.MultipleErrorsResponse},
      {404, Docspring.Model.ErrorResponse},
      {401, Docspring.Model.ErrorResponse}
    ])
  end

  @doc """
  Update a Template

  ### Parameters

  - `connection` (Docspring.Connection): Connection to server
  - `template_id` (String.t): 
  - `data` (UpdateHtmlTemplate): 
  - `opts` (keyword): Optional parameters

  ### Returns

  - `{:ok, Docspring.Model.SuccessMultipleErrorsResponse.t}` on success
  - `{:error, Tesla.Env.t}` on failure
  """
  @spec update_template(Tesla.Env.client, String.t, Docspring.Model.UpdateHtmlTemplate.t, keyword()) :: {:ok, Docspring.Model.SuccessMultipleErrorsResponse.t} | {:error, Tesla.Env.t}
  def update_template(connection, template_id, data, _opts \\ []) do
    request =
      %{}
      |> method(:put)
      |> url("/templates/#{template_id}")
      |> add_param(:body, :body, data)
      |> Enum.into([])

    connection
    |> Connection.request(request)
    |> evaluate_response([
      {200, Docspring.Model.SuccessMultipleErrorsResponse}
    ])
  end
end