DropBox Connector
Documentation
Version: 1
Documentation

DropBox Connector - Source Code


<ApiConfig Name="DropBox"
           Slug="dropbox-connector"
           Id="4D4D2932-C955-4A3A-AB78-F7A3A70B2797"
		   Version="1"
           EngineVersion="4"
           Desc="Read / write DropBox data inside your app; perform many DropBox operations without coding, just use easy to use high performance API Connector for DropBox"
           Logo="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAMAAABHPGVmAAAAAXNSR0IArs4c6QAAAWhQTFRFAAAAAAD/AICAAID/AKr/AID/AG3bAIDfAHHjAHToAIvoAIDVAIDqAHbrAIDtAHfuAIDvAHjhAIDjAIDmAHnnAIDqAHrgAHrrAIDrAHvlAH/mAITmAIDpAIDjAIDqAIDkAH3hAIDoAH3jAIDpAH3kAIDqAIDmAIDnAH7kAIDmAH7nAH7lAH3nAH7lAIDmAH7nAH3lAH7lAIDoAH3kAH7mAIDmAH3lAH7lAHzmAH3mAH3lAH3nAH7nAH7lAH3mAH/mAH7mAH/mAH3lAH3lAH/nAH7nAH/mAH3lAH/nAH7lAH7nAH3mAH7mAH3mAH7mAH7nAH3mAH7mAH7mAH7mAH7mAH7mAH7mAH7mAH7lAH7lAH7lAH7mAH7mAH7mAH7mAH7mAH7mAH7mAH7lAH7mAH7mAH7nAH7mAH7mAH7lAH7lAH7mAH7mAH7nAH3mAH7mAH7mAH3lAH3mAH7nAH7mAH3mAH7mAH7mAH7miZZsagAAAHd0Uk5TAAECAgMGBwgJCwsMDA0ODxAREhQVGBkZGh0eHyIkJCYrLC0uLzA0QEFIS09eY2hrbG1ucHFydnd7fH5+f4CDg4SHi5GTlJmdnZ6go6SvsLK1trrAwcLDxcbHyM7P1dnd3+Di4uPm6ezt7+/x8fLy9/j6+vv8/P7DVvC6AAACPUlEQVQYGe3B66MUcwCA4VdS5BROwukinByXEKIbIbcIRyRFopQISdf33292z7a7szO/y8zufpvnodPpdDodJEqm95b6KGHqS0zJvo8JeMI+pvG1A3eodcSBo7TmGGpcd4R2TllChSVf0oKTFihzEk39YdWHjHnYql9pxFrXGHrTWuT7zxAG/jbgCnk2G0GfERvIYNyDgHGkPGPK/nWmPEmUaS9gGmE7TbpC4QOTlgkzgQETnibGmLcZWjSGBMMouWgQSZ9bjwrr/UKGBWucpsZr1thJHisIsIJslq0QtN4yGvjJkb+IOunIBRp5yvtI8r7naMq+Q2TYYx8tWCDTvyqtnH+AfJdoR8mmtLHLwidkOWjhDRo75xoyuOYaDTlCwnWHaMRxrxCx5DjyPe4EgpzwMpl+sOIitVat+JMs1lqiylpkMIQJhpCyYNhXjHnVsBeJOm4UQ0ZdJsIk+n43hTDTXodHTPqfGGeChMsmwF3jfiPNmBsUPjWGLGcN+gzYDksGnSGXAYvwrH4DGEADh60D/GwPYJ1jNGMV4ABgFY3ttewW4BDwvWX7aMNxHwGO2Q3PO46Wtjm0AbZZ8h3g0DLtOQCccBLgAFN5yB7gplWAPUtMQQqX/AewFnDa2xSu0pZ+yxoDdtC3VWnLAoWNBn1BwQJt2XOe94xhxR7asgFaO2kupmEWprTFpPeZ3qpRd5kNI5iZRQMOMEs/WodZs4I52GTJO8zHOUeYHweYq8csvMu8nZFOp9PpdCbcAxbhkwz5LUNBAAAAAElFTkSuQmCC"
           TrustedDomains="content.dropboxapi.com"
           >

  <VersionHistory>
    <Change Date="2021-11-26">Initial version</Change>
  </VersionHistory>
  <ServiceUrls>
    <ServiceUrl Name="Version 2" Url="https://api.dropboxapi.com/2/" />
  </ServiceUrls>
  <Auths>
    <Auth Name="OAuth" Label="User Account" HelpLink="https://zappysys.com/links/?id=10002"
          Type="OAuth" ConnStr="Provider=DropBox;ExtraAttributesForAuthRequest=token_access_type=offline;ScopeSeparator={space};ReturnUrl=[$ReturnUrl$]"
          TestEndPoint="make_test"
      >
      <Notes>
        <![CDATA[<p>To use OAuth authentication, firstly, you need to create OAuth application:</p>
          <ol>
            <li>Log into your DropBox account.</li>
            <li>Go to https://www.dropbox.com/developers/apps.</li>
            <li>Press <em>Create app</em> button to create a new app.</li>
            <li>Once a new page opens, select <em>Scoped access</em> option.</li>
            <li>Next, select <em>Full Dropbox</em> to access all files and folders or <em>App folder</em> to access specific folder's files and folders option</li>
            <li>Give your app a name</li>
            <li>Click create app</li>
            <li>Once a new page opens, click <em>Scoped App</em> in <strong>Permission type</strong> line to select application scopes.</li>
            <li>Select all <em>Individual Scopes</em> and <em>Team Scopes</em> if you want to manage team data. Click <em>Submit</em> button.</li>
            <li>Select <em>Settings</em> tab, scroll down to <strong>App key</strong> and <strong>App secret</strong> and copy paste them into Notepad.</li>
            <li>Then in <strong>OAuth 2</strong> section add a URL as Redirect URI. If you don't have a working Redirect URI, you may add https://zappysys.com/oauth as Redirect URI</li>            
          </ol>
          <p>Use <em>App key</em> and <em>App secret</em> and Redirect URI for use in Connection String when connecting or in UI.</p>
    <div style="background-color: #f5f2c4; border-style: solid; border-color: #000000; border-width: 1px; margin-top: 3px; margin-bottom: 6px; padding: 6px;">
		<b>NOTE:</b> If you are planning to use your current data connection/token for automated processes, we recommend that you use a generic account for token generation when the login box appears (e.g. sales_automation@mycompany.com instead of bob_smith@mycompany.com). When you use a personal account which is tied to a specific employee profile and that employee leaves the company, the token may become invalid and any automated processes using that token will fail. Another potentially unwanted effect of using a personal token is incorrect logging; the API calls (e.g. Read, Edit, Delete, Upload) made with that token will record the specific user as performing the calls instead of an automated process.
    </div>
        ]]>

		
      </Notes>
      <Params>
        <Param Name="UseCustomApp" Value="True" Required="True" Hidden="False" Desc="Use your own app credentials or inbuilt app provided by ZappySys for ease of use. If you choose UseCustomApp=true then make sure to obtain your own ClientId and Secret using steps provided (Click [Steps to Configure] link found next to Authentication Type dropdown)" />
        <Param Name="ClientId" VisibleIf="UseCustomApp" RequiredIf="UseCustomApp"/>
        <Param Name="ClientSecret" Secret="True" VisibleIf="UseCustomApp" RequiredIf="UseCustomApp" />
        <Param Name="Scope" Value=""/>
        <Param Name="ReturnUrl" Value="https://zappysys.com/oauth" Required="True"/>
        <Param Name="RetryMode" Value="RetryWhenStatusCodeMatch" Options="None;RetryAny;RetryWhenStatusCodeMatch;" Hidden="True" />
        <Param Name="RetryStatusCodeList" Value="429" Hidden="True" />
        <Param Name="RetryCountMax" Value="5" Hidden="True" />
        <Param Name="RetryMultiplyWaitTime" Value="True" Hidden="True" />   		
      </Params>
    </Auth>
  </Auths>


  <Template>
  </Template>

  <EndPoints>
    <!--=====================================
        =============== TEST ================
        =====================================-->
    <EndPoint Name="make_test" Label="Make connection test" Desc="Makes a connection test"
	            Url="/check/user" Method="POST" ContentType="application/json"
              >
      <Body>
        { "query": "Test successful!"}
      </Body>
      <OutputColumns>
        <Column Name="result" Label="Result" DataType="DT_WSTR" Length="4000"/>
      </OutputColumns>
    </EndPoint>

    <!--=====================================
        ============ LIST FOLDER ============
        =====================================-->
    <EndPoint Name="list_folder" Label="List folder" Desc="Lists folder"
	            Url="/files/list_folder[$tag$]" Method="POST" ContentType="application/json" Filter="$.entries[*]"
    >
      <Params>
        <Param Name="Path" Value="" />
        <Param Name="Recursive" Value="false" Options="true;false" />
        <Param Name="FirstPageBodyPart" Type="Property" Value="{}" ValueTemplate="{ &quot;path&quot;: &quot;[$Path$]&quot;, &quot;recursive&quot;: [$Recursive$], &quot;limit&quot;: 200 }" />
        <Param Name="NextPageBodyPart" Type="Property" Value="{}" ValueTemplate="{ &quot;cursor&quot;: &quot;[$pagetoken$]&quot; }" />
        <Param Name="Filter" Type="Property" Value="$.entries[*]" Required="true" Options="All types=$.entries[*];
                                                                                           Files=$.entries[?(@['.tag']=='file')];
                                                                                           Folders=$.entries[?(@['.tag']=='folder')]" />
        <Param Name="NextUrlAttributeOrExpr" Type="Property" Value="$.cursor" />
        <Param Name="StopIndicatorAttributeOrExpr" Type="Property" Value="$.has_more" />
        <Param Name="NextUrlEndIndicator" Type="Property" Value="false" />
        <Param Name="EnablePageTokenForBody" Type="Property" Value="True" />
        <Param Name="HasDifferentNextPageInfo" Type="Property" Value="True" />
        <Param Name="PagePlaceholders" Type="Property" Value="url=|/continue" />
      </Params>
      <Body>[$tag$]</Body>
      <OutputColumns>
        <Column Name="id" Label="Id" DataType="DT_WSTR" Length="4000"/>
        <Column Name="name" Label="Name" DataType="DT_WSTR" Length="4000"/>
        <Column Name=".tag" Label="Type" DataType="DT_WSTR" Length="4000"/>
        <Column Name="path_lower" Label="PathLower" DataType="DT_WSTR" Length="4000"/>
        <Column Name="path_display" Label="PathDisplay" DataType="DT_WSTR" Length="4000"/>
        <Column Name="client_modified" Label="ClientModified" DataType="DT_DBTIMESTAMP"/>
        <Column Name="server_modified" Label="ServerModified" DataType="DT_DBTIMESTAMP"/>
        <Column Name="rev" Label="Revision" DataType="DT_WSTR" Length="4000"/>
        <Column Name="size" Label="Size" DataType="DT_I8"/>
        <Column Name="is_downloadable" Label="IsDownloadable" DataType="DT_BOOL"/>
        <Column Name="content_hash" Label="ContentHash" DataType="DT_WSTR" Length="4000"/>
      </OutputColumns>
    </EndPoint>

    <!--=====================================
        ========== DOWNLOAD FILE ============
        =====================================-->
    <EndPoint Name="download_file" Label="Download a file" Desc="Downloads a file"
	            Url="https://content.dropboxapi.com/2/files/download" Method="POST" ContentType="text/plain" Filter="$"
    >
      <Params>
        <Param Type="Header"
               Key="Dropbox-API-Arg"
               Name="SourceFilePath"
               Value=""
               ValueTemplate="{ &quot;path&quot;: &quot;{$value$}&quot; }"
               OptionsEndPoint="list_folder"
               OptionsEndPointValueColumn="Id"
               OptionsEndPointLabelColumn="Name"
               OptionEndPointParameters="Path=;Recursive=true;Filter=$.entries[?(@['.tag']=='file')]"
               Required="True"
               />
        <Param Name="SaveContentAsBinary"
               Required="True"
               Type="Property"
               Hidden="True"
               Value="True"
              />
        <Param Name="RequestTimeoutMs"
               Type="Property"
               Desc="Timeout in milliseconds after which download stops"
               Value="7200000"
              />
        <Param Name="FileOverwriteMode" Type="Property" Value="AlwaysOverwrite" Required="True"/>
        <Param Name="ResponseDataFile" Desc="Specify a disk file path to save file as" Required="True"
               Type="Property" Value="c:\ParentFolder\Subfolder\file.dat" Editor="FileSave" />
        <Param Name="RawOutputDataRowTemplate" Type="Property" Value="{Status:'Downloaded'}" />
        <Param Name="EnableRawOutputModeSingleRow" Type="Property" Value="True" />
      </Params>
      <OutputColumns>
        <Column Name="Status" DataType="DT_WSTR" />
      </OutputColumns>
    </EndPoint>

    <!--======================================
        ========== DOWNLOAD FOLDER ===========
        ======================================-->
    <EndPoint Name="download_folder" Label="Download a folder and folders/files within as ZIP archive" Desc="Downloads a folder with all the files and folders it contains as ZIP file"
	            Url="https://content.dropboxapi.com/2/files/download_zip" Method="POST" ContentType="text/plain" Filter="$"
    >
      <Params>
        <Param Type="Header"
               Key="Dropbox-API-Arg"
               Name="SourcePath"
               Value=""
               ValueTemplate="{ &quot;path&quot;: &quot;{$value$}&quot; }"
               OptionsEndPoint="list_folder"
               OptionsEndPointValueColumn="Id"
               OptionsEndPointLabelColumn="Name"
               OptionEndPointParameters="Path=;Recursive=true;Filter=$.entries[?(@['.tag']=='folder')]"
               Required="True"
               />
        <Param Name="SaveContentAsBinary"
               Required="True"
               Type="Property"
               Hidden="True"
               Value="True"
              />
        <Param Name="RequestTimeoutMs"
               Type="Property"
               Desc="Timeout in milliseconds after which download stops"
               Value="7200000"
              />
        <Param Name="FileOverwriteMode" Type="Property" Value="AlwaysOverwrite" Required="True"/>
        <Param Name="ResponseDataFile" Desc="Specify a disk file path to save file as" Required="True" Type="Property" Value="c:\ParentFolder\Subfolder\file.zip" Editor="FileSave" />
        <Param Name="RawOutputDataRowTemplate" Type="Property" Value="{Status:'Downloaded'}" />
        <Param Name="EnableRawOutputModeSingleRow" Type="Property" Value="True" />
      </Params>
      <OutputColumns>
        <Column Name="Status" DataType="DT_WSTR" />
      </OutputColumns>
    </EndPoint>

    <!--=====================================
        ============ UPLOAD FILE ============
        =====================================-->
    <EndPoint Name="upload_file" Label="Upload a file" Desc="Upload a file"
	            Url="https://content.dropboxapi.com/2/files/upload" Method="POST" ContentType="application/octet-stream" Filter="$"
    >
      <Params>
        <Param Type="Header"
               Key="Dropbox-API-Arg"
               Name="TargetFilePath"
               Desc="Specify a file path in DropBox to save file to"
               Value=""
               ValueTemplate="{ &quot;path&quot;: &quot;{$value$}&quot; }"
               Required="True"
               />
        <Param Name="SourceFilePath"
               Required="True"
               Type="Placeholder"
               Desc="Specify a disk file path to upload"
               Example="C:\MyParentFolder\Subfolder\file.txt"
               Editor="FileOpen"
               Value=""
              />
        <Param Name="IsMultiPart"
               Required="True"
               Type="Property"
               Hidden="True"
               Desc="Must be set to 'True'"
               Value="True"
        />
      </Params>
      <Body>
        <![CDATA[@[$SourceFilePath$]]]>
      </Body>
      <OutputColumns>
        <Column Name="id" Label="Id" DataType="DT_WSTR" Length="4000"/>
        <Column Name="name" Label="Name" DataType="DT_WSTR" Length="4000"/>
        <Column Name="path_lower" Label="PathLower" DataType="DT_WSTR" Length="4000"/>
        <Column Name="path_display" Label="PathDisplay" DataType="DT_WSTR" Length="4000"/>
        <Column Name="client_modified" Label="ClientModified" DataType="DT_DBTIMESTAMP"/>
        <Column Name="server_modified" Label="ServerModified" DataType="DT_DBTIMESTAMP"/>
        <Column Name="rev" Label="Revision" DataType="DT_WSTR" Length="4000"/>
        <Column Name="size" Label="Size" DataType="DT_I8"/>
        <Column Name="is_downloadable" Label="IsDownloadable" DataType="DT_BOOL"/>
        <Column Name="content_hash" Label="ContentHash" DataType="DT_WSTR" Length="4000"/>
      </OutputColumns>
    </EndPoint>

    <!--===========================================
        ============== CREATE FOLDER ==============
        ===========================================-->
    <EndPoint Name="create_folder" Label="Create folder" Desc="Creates folder"
	            Url="/files/create_folder_v2" Method="POST" ContentType="application/json" Filter="$.metadata"
    >
      <Params>
        <Param Name="Path" Value="" />
      </Params>
      <Body>
        { "path": "[$Path$]" }
      </Body>
      <OutputColumns>
        <Column Name="id" Label="Id" DataType="DT_WSTR" Length="4000"/>
        <Column Name="name" Label="Name" DataType="DT_WSTR" Length="4000"/>
        <Column Name="path_lower" Label="PathLower" DataType="DT_WSTR" Length="4000"/>
        <Column Name="path_display" Label="PathDisplay" DataType="DT_WSTR" Length="4000"/>
      </OutputColumns>
    </EndPoint>

    <!--=====================================
        ============== DELETE ===============
        =====================================-->
    <EndPoint Name="delete" Label="Delete" Desc="Deletes file or folder"
	            Url="/files/delete_v2" Method="POST" ContentType="application/json" Filter="$.metadata"
    >
      <Params>
        <Param Name="Path" Value="" />
      </Params>
      <Body>
        { "path": "[$Path$]" }
      </Body>
      <OutputColumns>
        <Column Name="id" Label="Id" DataType="DT_WSTR" Length="4000"/>
        <Column Name="name" Label="Name" DataType="DT_WSTR" Length="4000"/>
        <Column Name="path_lower" Label="PathLower" DataType="DT_WSTR" Length="4000"/>
        <Column Name="path_display" Label="PathDisplay" DataType="DT_WSTR" Length="4000"/>
        <Column Name="client_modified" Label="ClientModified" DataType="DT_DBTIMESTAMP"/>
        <Column Name="server_modified" Label="ServerModified" DataType="DT_DBTIMESTAMP"/>
        <Column Name="rev" Label="Revision" DataType="DT_WSTR" Length="4000"/>
        <Column Name="size" Label="Size" DataType="DT_I8"/>
        <Column Name="is_downloadable" Label="IsDownloadable" DataType="DT_BOOL"/>
        <Column Name="content_hash" Label="ContentHash" DataType="DT_WSTR" Length="4000"/>
      </OutputColumns>
    </EndPoint>
  </EndPoints>

  <!--=====================================
      ============ EXAMPLES ===============
      =====================================-->
  <Examples>
    <!-- TEST CONNECTION -->
    <Example Group="ODBC" Label="Test connection" Desc="Tests connection">
      <Code>
        <![CDATA[SELECT *
  FROM make_test]]>
      </Code>
    </Example>

    <!-- LIST FOLDER -->
    <Example Group="ODBC" Label="List folder #1" Desc="Lists all files and folders within a folder">
      <Code>
        <![CDATA[SELECT *
  FROM list_folder]]>
      </Code>
    </Example>
    <Example Group="ODBC" Label="List folder #2" Desc="Lists all files and folders within a folder">
      <Code>
        <![CDATA[SELECT *
  FROM list_folder
  WITH (Path='/MySubfolder'
       ,Recursive='true')]]>
      </Code>
    </Example>

    <!-- DOWNLOAD FILE -->
    <Example Group="ODBC" Label="Download file" Desc="Downloads a file">
      <Code>
        <![CDATA[SELECT *
  FROM download_file
  WITH (SourceFilePath='/file-I-want-to-download.dat'
        ,ResponseDataFile='C:\path\I\want\to\save\my\file\to.dat'
      )]]>
      </Code>
    </Example>

    <!-- DOWNLOAD FOLDER -->
    <Example Group="ODBC" Label="Download folder as ZIP file" Desc="Downloads a folder with all files and folders within it as ZIP file">
      <Code>
        <![CDATA[SELECT *
  FROM download_folder
  WITH (SourcePath='/folder-I-want-to-download'
        ,ResponseDataFile='C:\path\I\want\to\save\my\folder\to.zip'
      )]]>
      </Code>
    </Example>

    <!-- UPLOAD FILE -->
    <Example Group="ODBC" Label="Upload a file" Desc="Uploads a file">
      <Code>
        <![CDATA[SELECT *
  FROM upload_file
  WITH (TargetFilePath='/MySubfolder/file-I-want-to-upload-to-dropbox.dat'
        ,DiskFilePath='C:\file\I\want\to\upload.dat'
      )]]>
      </Code>
    </Example>

    <!-- DELETE FILE/FOLDER -->
    <Example Group="ODBC" Label="Delete a file or a folder" Desc="Deletes a file or a folder">
      <Code>
        <![CDATA[SELECT *
  FROM delete
  WITH (Path='/path/to/file/in/dropbox/I/want/to/delete.dat')]]>
      </Code>
    </Example>

    <!-- CREATE FOLDER -->
    <Example Group="ODBC" Label="Create a folder" Desc="Creates a folder">
      <Code>
        <![CDATA[SELECT *
  FROM create_folder
  WITH (Path='/folder/in/dropbox/I/want/to/create')]]>
      </Code>
    </Example>
  </Examples>
</ApiConfig>