mirror of
https://github.com/appwrite/appwrite.git
synced 2026-05-26 13:51:13 +00:00
Continuing implementing transfers
This commit is contained in:
+3
-2
@@ -29,7 +29,7 @@ ENV VITE_APPWRITE_GROWTH_ENDPOINT=$VITE_APPWRITE_GROWTH_ENDPOINT
|
||||
RUN npm ci
|
||||
RUN npm run build
|
||||
|
||||
FROM appwrite/base:0.1.0 as final
|
||||
FROM ionic/base as final
|
||||
|
||||
LABEL maintainer="team@appwrite.io"
|
||||
|
||||
@@ -176,7 +176,8 @@ RUN chmod +x /usr/local/bin/doctor && \
|
||||
chmod +x /usr/local/bin/worker-builds && \
|
||||
chmod +x /usr/local/bin/worker-mails && \
|
||||
chmod +x /usr/local/bin/worker-messaging && \
|
||||
chmod +x /usr/local/bin/worker-webhooks
|
||||
chmod +x /usr/local/bin/worker-webhooks && \
|
||||
chmod +x /usr/local/bin/worker-transfers
|
||||
|
||||
# Letsencrypt Permissions
|
||||
RUN mkdir -p /etc/letsencrypt/live/ && chmod -Rf 755 /etc/letsencrypt/live/
|
||||
|
||||
+249
-2
@@ -3185,7 +3185,7 @@ $collections = [
|
||||
'array' => false,
|
||||
'filters' => [],
|
||||
],
|
||||
],
|
||||
],
|
||||
'indexes' => [
|
||||
[
|
||||
'$id' => '_key_accessedAt',
|
||||
@@ -3503,7 +3503,7 @@ $collections = [
|
||||
'required' => true,
|
||||
'default' => null,
|
||||
'array' => false,
|
||||
'filters' => [ 'encrypt' ]
|
||||
'filters' => ['encrypt']
|
||||
],
|
||||
[
|
||||
'$id' => ID::custom('search'),
|
||||
@@ -3548,6 +3548,253 @@ $collections = [
|
||||
],
|
||||
],
|
||||
],
|
||||
|
||||
'transfers' => [
|
||||
'$collection' => Database::METADATA,
|
||||
'$id' => 'transfers',
|
||||
'name' => 'transfers',
|
||||
'attributes' => [
|
||||
[
|
||||
'$id' => ID::custom('status'),
|
||||
'type' => Database::VAR_STRING,
|
||||
'format' => '',
|
||||
'size' => Database::LENGTH_KEY,
|
||||
'signed' => true,
|
||||
'required' => true,
|
||||
'default' => null,
|
||||
'array' => false,
|
||||
'filters' => [],
|
||||
],
|
||||
[
|
||||
'$id' => ID::custom('stage'),
|
||||
'type' => Database::VAR_STRING,
|
||||
'format' => '',
|
||||
'size' => Database::LENGTH_KEY,
|
||||
'signed' => true,
|
||||
'required' => true,
|
||||
'default' => null,
|
||||
'array' => false,
|
||||
'filters' => [],
|
||||
],
|
||||
[
|
||||
'$id' => ID::custom('source'),
|
||||
'type' => Database::VAR_STRING,
|
||||
'format' => '',
|
||||
'size' => Database::LENGTH_KEY,
|
||||
'signed' => true,
|
||||
'required' => true,
|
||||
'default' => null,
|
||||
'array' => false,
|
||||
'filters' => [],
|
||||
],
|
||||
[
|
||||
'$id' => ID::custom('destination'),
|
||||
'type' => Database::VAR_STRING,
|
||||
'format' => '',
|
||||
'size' => Database::LENGTH_KEY,
|
||||
'signed' => true,
|
||||
'required' => true,
|
||||
'default' => null,
|
||||
'array' => false,
|
||||
'filters' => [],
|
||||
],
|
||||
[
|
||||
'$id' => ID::custom('resources'),
|
||||
'type' => Database::VAR_STRING,
|
||||
'format' => '',
|
||||
'size' => Database::LENGTH_KEY,
|
||||
'signed' => true,
|
||||
'required' => true,
|
||||
'default' => [],
|
||||
'array' => true,
|
||||
'filters' => [],
|
||||
],
|
||||
[
|
||||
'$id' => ID::custom('progress'),
|
||||
'type' => Database::VAR_STRING,
|
||||
'format' => '',
|
||||
'size' => 3000,
|
||||
'signed' => true,
|
||||
'required' => true,
|
||||
'default' => null,
|
||||
'array' => false,
|
||||
'filters' => [],
|
||||
],
|
||||
[
|
||||
'$id' => ID::custom('latestUpdate'),
|
||||
'type' => Database::VAR_STRING,
|
||||
'format' => '',
|
||||
'size' => Database::LENGTH_KEY,
|
||||
'signed' => true,
|
||||
'required' => true,
|
||||
'default' => null,
|
||||
'array' => false,
|
||||
'filters' => [],
|
||||
],
|
||||
[
|
||||
'$id' => ID::custom('errorData'),
|
||||
'type' => Database::VAR_STRING,
|
||||
'format' => '',
|
||||
'size' => 8046,
|
||||
'signed' => true,
|
||||
'required' => true,
|
||||
'default' => null,
|
||||
'array' => false,
|
||||
'filters' => [],
|
||||
]
|
||||
],
|
||||
'indexes' => [
|
||||
[
|
||||
'$id' => '_key_status',
|
||||
'type' => Database::INDEX_KEY,
|
||||
'attributes' => ['status'],
|
||||
'lengths' => [Database::LENGTH_KEY],
|
||||
'orders' => [Database::ORDER_ASC],
|
||||
],
|
||||
[
|
||||
'$id' => '_key_stage',
|
||||
'type' => Database::INDEX_KEY,
|
||||
'attributes' => ['stage'],
|
||||
'lengths' => [Database::LENGTH_KEY],
|
||||
'orders' => [Database::ORDER_ASC],
|
||||
],
|
||||
[
|
||||
'$id' => '_key_source',
|
||||
'type' => Database::INDEX_KEY,
|
||||
'attributes' => ['source'],
|
||||
'lengths' => [Database::LENGTH_KEY],
|
||||
'orders' => [Database::ORDER_ASC],
|
||||
],
|
||||
[
|
||||
'$id' => '_key_destination',
|
||||
'type' => Database::INDEX_KEY,
|
||||
'attributes' => ['destination'],
|
||||
'lengths' => [Database::LENGTH_KEY],
|
||||
'orders' => [Database::ORDER_ASC],
|
||||
],
|
||||
[
|
||||
'$id' => '_key_latestUpdate',
|
||||
'type' => Database::INDEX_KEY,
|
||||
'attributes' => ['latestUpdate'],
|
||||
'lengths' => [Database::LENGTH_KEY],
|
||||
'orders' => [Database::ORDER_ASC],
|
||||
],
|
||||
],
|
||||
],
|
||||
|
||||
'sources' => [
|
||||
'$collection' => Database::METADATA,
|
||||
'$id' => 'sources',
|
||||
'name' => 'sources',
|
||||
'attributes' => [
|
||||
[
|
||||
'$id' => ID::custom('type'),
|
||||
'type' => Database::VAR_STRING,
|
||||
'format' => '',
|
||||
'size' => Database::LENGTH_KEY,
|
||||
'signed' => true,
|
||||
'required' => true,
|
||||
'default' => null,
|
||||
'array' => false,
|
||||
'filters' => [],
|
||||
],
|
||||
[
|
||||
'$id' => ID::custom('name'),
|
||||
'type' => Database::VAR_STRING,
|
||||
'format' => '',
|
||||
'size' => Database::LENGTH_KEY,
|
||||
'signed' => true,
|
||||
'required' => true,
|
||||
'default' => null,
|
||||
'array' => false,
|
||||
'filters' => [],
|
||||
],
|
||||
[
|
||||
'$id' => ID::custom('data'),
|
||||
'type' => Database::VAR_STRING,
|
||||
'format' => '',
|
||||
'size' => 3000,
|
||||
'signed' => true,
|
||||
'required' => true,
|
||||
'default' => null,
|
||||
'array' => false,
|
||||
'filters' => [],
|
||||
]
|
||||
],
|
||||
'indexes' => [
|
||||
[
|
||||
'$id' => '_key_type',
|
||||
'type' => Database::INDEX_KEY,
|
||||
'attributes' => ['type'],
|
||||
'lengths' => [Database::LENGTH_KEY],
|
||||
'orders' => [Database::ORDER_ASC],
|
||||
],
|
||||
[
|
||||
'$id' => '_key_name',
|
||||
'type' => Database::INDEX_KEY,
|
||||
'attributes' => ['name'],
|
||||
'lengths' => [Database::LENGTH_KEY],
|
||||
'orders' => [Database::ORDER_ASC],
|
||||
]
|
||||
]
|
||||
],
|
||||
|
||||
'destinations' => [
|
||||
'$collection' => Database::METADATA,
|
||||
'$id' => 'destinations',
|
||||
'name' => 'destinations',
|
||||
'attributes' => [
|
||||
[
|
||||
'$id' => ID::custom('type'),
|
||||
'type' => Database::VAR_STRING,
|
||||
'format' => '',
|
||||
'size' => Database::LENGTH_KEY,
|
||||
'signed' => true,
|
||||
'required' => true,
|
||||
'default' => null,
|
||||
'array' => false,
|
||||
'filters' => [],
|
||||
],
|
||||
[
|
||||
'$id' => ID::custom('name'),
|
||||
'type' => Database::VAR_STRING,
|
||||
'format' => '',
|
||||
'size' => Database::LENGTH_KEY,
|
||||
'signed' => true,
|
||||
'required' => true,
|
||||
'default' => null,
|
||||
'array' => false,
|
||||
'filters' => [],
|
||||
],
|
||||
[
|
||||
'$id' => ID::custom('data'),
|
||||
'type' => Database::VAR_STRING,
|
||||
'format' => '',
|
||||
'size' => 1000,
|
||||
'signed' => true,
|
||||
'required' => false,
|
||||
'default' => null,
|
||||
'array' => false,
|
||||
'filters' => [],
|
||||
]
|
||||
],
|
||||
'indexes' => [
|
||||
[
|
||||
'$id' => '_key_type',
|
||||
'type' => Database::INDEX_KEY,
|
||||
'attributes' => ['type'],
|
||||
'lengths' => [Database::LENGTH_KEY],
|
||||
'orders' => [Database::ORDER_ASC],
|
||||
],
|
||||
[
|
||||
'$id' => '_key_name',
|
||||
'type' => Database::INDEX_KEY,
|
||||
'attributes' => ['name'],
|
||||
'lengths' => [Database::LENGTH_KEY],
|
||||
'orders' => [Database::ORDER_ASC],
|
||||
]
|
||||
]
|
||||
]
|
||||
];
|
||||
|
||||
return $collections;
|
||||
|
||||
@@ -51,6 +51,8 @@ $admins = [
|
||||
'functions.write',
|
||||
'execution.read',
|
||||
'execution.write',
|
||||
'transfers.read',
|
||||
'transfers.write'
|
||||
];
|
||||
|
||||
return [
|
||||
|
||||
@@ -76,4 +76,10 @@ return [ // List of publicly visible scopes
|
||||
'health.read' => [
|
||||
'description' => 'Access to read your project\'s health status',
|
||||
],
|
||||
'transfers.read' => [
|
||||
'description' => 'Access to read your project\'s transfer logs',
|
||||
],
|
||||
'transfers.write' => [
|
||||
'description' => 'Access to create, update, and delete your project\'s sources, destinations, and transfer logs.',
|
||||
]
|
||||
];
|
||||
|
||||
@@ -186,4 +186,17 @@ return [
|
||||
'optional' => true,
|
||||
'icon' => '/images/services/graphql.png',
|
||||
],
|
||||
'transfers' => [
|
||||
'key' => 'transfers',
|
||||
'name' => 'Transfers',
|
||||
'subtitle' => 'The Transfers service allows you to migrate third-party data to your Appwrite server.',
|
||||
'description' => '/docs/services/transfers.md',
|
||||
'controller' => 'api/transfers.php',
|
||||
'sdk' => true,
|
||||
'docs' => true,
|
||||
'docsUrl' => 'https://appwrite.io/docs/transfers',
|
||||
'tests' => true,
|
||||
'optional' => true,
|
||||
'icon' => '/images/services/transfers.png',
|
||||
],
|
||||
];
|
||||
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,893 @@
|
||||
<?php
|
||||
|
||||
use Appwrite\Event\Delete;
|
||||
use Appwrite\Event\Event;
|
||||
use Appwrite\Event\Transfer;
|
||||
use Appwrite\Extend\Exception;
|
||||
use Appwrite\Utopia\Database\Validator\CustomId;
|
||||
use Appwrite\Utopia\Database\Validator\Queries\Destinations;
|
||||
use Appwrite\Utopia\Database\Validator\Queries\Sources;
|
||||
use Appwrite\Utopia\Database\Validator\Queries\Transfers;
|
||||
use Utopia\Validator\URL;
|
||||
use Appwrite\Utopia\Response;
|
||||
use Cron\CronExpression;
|
||||
use Utopia\App;
|
||||
use Utopia\Database\Database;
|
||||
use Utopia\Database\DateTime;
|
||||
use Utopia\Database\Document;
|
||||
use Utopia\Database\Helpers\ID;
|
||||
use Utopia\Database\Query;
|
||||
use Utopia\Database\Validator\UID;
|
||||
use Utopia\Transfer\Destinations\Appwrite;
|
||||
use Utopia\Transfer\Sources\Appwrite as SourcesAppwrite;
|
||||
use Utopia\Transfer\Sources\Firebase;
|
||||
use Utopia\Transfer\Sources\NHost;
|
||||
use Utopia\Transfer\Sources\Supabase;
|
||||
use Utopia\Validator\ArrayList;
|
||||
use Utopia\Validator\Integer;
|
||||
use Utopia\Validator\JSON;
|
||||
use Utopia\Validator\Text;
|
||||
use Utopia\Validator\WhiteList;
|
||||
|
||||
include_once __DIR__ . '/../shared/api.php';
|
||||
|
||||
App::post('/v1/transfers')
|
||||
->groups(['api', 'transfers'])
|
||||
->desc('Create Transfer')
|
||||
->label('scope', 'transfers.write')
|
||||
->label('event', 'transfers.[transferId].create')
|
||||
->label('audits.event', 'transfers.create')
|
||||
->label('audits.resource', 'transfers/{response.$id}')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_KEY])
|
||||
->label('sdk.namespace', 'transfers')
|
||||
->label('sdk.method', 'create')
|
||||
->label('sdk.description', '/docs/references/transfers/create-transfer.md')
|
||||
->label('sdk.response.code', Response::STATUS_CODE_CREATED)
|
||||
->label('sdk.response.type', Response::CONTENT_TYPE_JSON)
|
||||
->label('sdk.response.model', Response::MODEL_TRANSFER)
|
||||
->param('transferId', 'unique()', new CustomId(), 'Transfer unique ID. Use \'unique()\' to auto generate a unique ID for this transfer.')
|
||||
->param('source', '', new UID(), 'Source UID. [Learn more about sources](https://appwrite.io/docs/transfers/sources)', false)
|
||||
->param('destination', '', new UID(), 'Destination UID. [Learn more about destinations](https://appwrite.io/docs/transfers/sources)', false)
|
||||
->param('resources', [], new ArrayList(new WhiteList(['users', 'databases'])), 'List of resources to transfer. [A list of resources can be found here.](https://appwrite.io/docs/transfers#resources)', false)
|
||||
->inject('response')
|
||||
->inject('dbForProject')
|
||||
->inject('project')
|
||||
->inject('user')
|
||||
->inject('events')
|
||||
->action(function (string $transferId, string $source, string $destination, array $resources, Response $response, Database $dbForProject, Document $project, Document $user, Event $eventsInstance) {
|
||||
$cron = !empty($schedule) ? new CronExpression($schedule) : null;
|
||||
$next = !empty($schedule) ? DateTime::format($cron->getNextRunDate()) : null;
|
||||
|
||||
$transferId = ($transferId == 'unique()') ? ID::unique() : $transferId;
|
||||
|
||||
$transfer = $dbForProject->createDocument('transfers', new Document([
|
||||
'$id' => $transferId,
|
||||
'status' => 'pending',
|
||||
'stage' => 'init',
|
||||
'source' => $source,
|
||||
'destination' => $destination,
|
||||
'resources' => $resources,
|
||||
'progress' => json_encode([
|
||||
'source' => [],
|
||||
'destination' => [],
|
||||
]),
|
||||
'latestUpdate' => "{}",
|
||||
'errorData' => ""
|
||||
]));
|
||||
|
||||
$eventsInstance->setParam('transferId', $transfer->getId());
|
||||
|
||||
if ($next) {
|
||||
// Async task reschedule
|
||||
$functionEvent = new Transfer();
|
||||
$functionEvent
|
||||
->setTransfer($transfer)
|
||||
->setType('schedule')
|
||||
->setUser($user)
|
||||
->setProject($project)
|
||||
->schedule(new \DateTime($next));
|
||||
}
|
||||
|
||||
$response
|
||||
->setStatusCode(Response::STATUS_CODE_CREATED)
|
||||
->dynamic($transfer, Response::MODEL_TRANSFER);
|
||||
});
|
||||
|
||||
App::get('/v1/transfers')
|
||||
->groups(['api', 'transfers'])
|
||||
->desc('List Transfers')
|
||||
->label('scope', 'transfers.read')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_KEY])
|
||||
->label('sdk.namespace', 'transfers')
|
||||
->label('sdk.method', 'list')
|
||||
->label('sdk.description', '/docs/references/transfers/list-transfers.md')
|
||||
->label('sdk.response.code', Response::STATUS_CODE_OK)
|
||||
->label('sdk.response.type', Response::CONTENT_TYPE_JSON)
|
||||
->label('sdk.response.model', Response::MODEL_TRANSFER_LIST)
|
||||
->param('queries', [], new Transfers(), 'Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https://appwrite.io/docs/databases#querying-documents). Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' queries are allowed, each ' . APP_LIMIT_ARRAY_ELEMENT_SIZE . ' characters long. You may filter on the following attributes: ' . implode(', ', Transfers::ALLOWED_ATTRIBUTES), true)
|
||||
->param('search', '', new Text(256), 'Search term to filter your list results. Max length: 256 chars.', true)
|
||||
->inject('response')
|
||||
->inject('dbForProject')
|
||||
->action(function (array $queries, string $search, Response $response, Database $dbForProject) {
|
||||
|
||||
$queries = Query::parseQueries($queries);
|
||||
|
||||
if (!empty($search)) {
|
||||
$queries[] = Query::search('search', $search);
|
||||
}
|
||||
|
||||
// Get cursor document if there was a cursor query
|
||||
$cursor = Query::getByType($queries, Query::TYPE_CURSORAFTER, Query::TYPE_CURSORBEFORE);
|
||||
$cursor = reset($cursor);
|
||||
if ($cursor) {
|
||||
/** @var Query $cursor */
|
||||
$transferId = $cursor->getValue();
|
||||
$cursorDocument = $dbForProject->getDocument('transfers', $transferId);
|
||||
|
||||
if ($cursorDocument->isEmpty()) {
|
||||
throw new Exception(Exception::GENERAL_CURSOR_NOT_FOUND, "Transfer '{$transferId}' for the 'cursor' value not found.");
|
||||
}
|
||||
|
||||
$cursor->setValue($cursorDocument);
|
||||
}
|
||||
|
||||
$filterQueries = Query::groupByType($queries)['filters'];
|
||||
|
||||
$response->dynamic(new Document([
|
||||
'transfers' => $dbForProject->find('transfers', $queries),
|
||||
'total' => $dbForProject->count('transfers', $filterQueries, APP_LIMIT_COUNT),
|
||||
]), Response::MODEL_TRANSFER_LIST);
|
||||
});
|
||||
|
||||
App::get('/v1/transfers/:transferId')
|
||||
->groups(['api', 'transfers'])
|
||||
->desc('Get Transfer')
|
||||
->label('scope', 'transfers.read')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_KEY])
|
||||
->label('sdk.namespace', 'transfers')
|
||||
->label('sdk.method', 'get')
|
||||
->label('sdk.description', '/docs/references/transfers/get-transfer.md')
|
||||
->label('sdk.response.code', Response::STATUS_CODE_OK)
|
||||
->label('sdk.response.type', Response::CONTENT_TYPE_JSON)
|
||||
->label('sdk.response.model', Response::MODEL_TRANSFER)
|
||||
->param('transferId', '', new UID(), 'Transfer unique ID.')
|
||||
->inject('response')
|
||||
->inject('dbForProject')
|
||||
->action(function (string $transferId, Response $response, Database $dbForProject) {
|
||||
$transfer = $dbForProject->getDocument('transfers', $transferId);
|
||||
|
||||
if ($transfer->isEmpty()) {
|
||||
throw new Exception(Exception::TRANSFER_NOT_FOUND);
|
||||
}
|
||||
|
||||
$response->dynamic($transfer, Response::MODEL_TRANSFER);
|
||||
});
|
||||
|
||||
App::delete('/v1/transfers/:transferId')
|
||||
->groups(['api', 'transfers'])
|
||||
->desc('Delete Transfer')
|
||||
->label('scope', 'transfers.write')
|
||||
->label('event', 'transfers.[transferId].delete')
|
||||
->label('audits.event', 'transfer.delete')
|
||||
->label('audits.resource', 'transfer/{request.transferId}')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_KEY])
|
||||
->label('sdk.namespace', 'transfers')
|
||||
->label('sdk.method', 'delete')
|
||||
->label('sdk.description', '/docs/references/functions/delete-transfer.md')
|
||||
->label('sdk.response.code', Response::STATUS_CODE_NOCONTENT)
|
||||
->label('sdk.response.model', Response::MODEL_NONE)
|
||||
->param('transferId', '', new UID(), 'Transfer ID.')
|
||||
->inject('response')
|
||||
->inject('dbForProject')
|
||||
->inject('deletes')
|
||||
->inject('events')
|
||||
->action(function (string $transferId, Response $response, Database $dbForProject, Delete $deletes, Event $events) {
|
||||
|
||||
$transfer = $dbForProject->getDocument('transfers', $transferId);
|
||||
|
||||
if ($transfer->isEmpty()) {
|
||||
throw new Exception(Exception::TRANSFER_NOT_FOUND);
|
||||
}
|
||||
|
||||
if (!$dbForProject->deleteDocument('transfers', $transfer->getId())) {
|
||||
throw new Exception(Exception::GENERAL_SERVER_ERROR, 'Failed to remove transfer from DB');
|
||||
}
|
||||
|
||||
$deletes
|
||||
->setType(DELETE_TYPE_DOCUMENT)
|
||||
->setDocument($transfer);
|
||||
|
||||
$events->setParam('transferId', $transfer->getId());
|
||||
|
||||
$response->noContent();
|
||||
});
|
||||
|
||||
App::get('/v1/transfers/sources')
|
||||
->groups(['api', 'transfers'])
|
||||
->desc('List Sources')
|
||||
->label('scope', 'transfers.read')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_KEY])
|
||||
->label('sdk.namespace', 'transfers')
|
||||
->label('sdk.method', 'listSources')
|
||||
->label('sdk.description', '/docs/references/transfers/list-sources.md')
|
||||
->label('sdk.response.code', Response::STATUS_CODE_OK)
|
||||
->label('sdk.response.type', Response::CONTENT_TYPE_JSON)
|
||||
->label('sdk.response.model', Response::MODEL_SOURCE_LIST)
|
||||
->param('queries', [], new Sources(), 'Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https://appwrite.io/docs/databases#querying-documents). Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' queries are allowed, each ' . APP_LIMIT_ARRAY_ELEMENT_SIZE . ' characters long. You may filter on the following attributes: ' . implode(', ', Transfers::ALLOWED_ATTRIBUTES), true)
|
||||
->param('search', '', new Text(256), 'Search term to filter your list results. Max length: 256 chars.', true)
|
||||
->inject('response')
|
||||
->inject('dbForProject')
|
||||
->action(function (array $queries, string $search, Response $response, Database $dbForProject) {
|
||||
|
||||
$queries = Query::parseQueries($queries);
|
||||
|
||||
if (!empty($search)) {
|
||||
$queries[] = Query::search('search', $search);
|
||||
}
|
||||
|
||||
// Get cursor document if there was a cursor query
|
||||
$cursor = Query::getByType($queries, Query::TYPE_CURSORAFTER, Query::TYPE_CURSORBEFORE);
|
||||
$cursor = reset($cursor);
|
||||
if ($cursor) {
|
||||
/** @var Query $cursor */
|
||||
$sourceId = $cursor->getValue();
|
||||
$cursorDocument = $dbForProject->getDocument('sources', $sourceId);
|
||||
|
||||
if ($cursorDocument->isEmpty()) {
|
||||
throw new Exception(Exception::GENERAL_CURSOR_NOT_FOUND, "Source '{$sourceId}' for the 'cursor' value not found.");
|
||||
}
|
||||
|
||||
$cursor->setValue($cursorDocument);
|
||||
}
|
||||
|
||||
$filterQueries = Query::groupByType($queries)['filters'];
|
||||
|
||||
$response->dynamic(new Document([
|
||||
'sources' => $dbForProject->find('sources', $queries),
|
||||
'total' => $dbForProject->count('sources', $filterQueries, APP_LIMIT_COUNT),
|
||||
]), Response::MODEL_SOURCE_LIST);
|
||||
});
|
||||
|
||||
|
||||
|
||||
App::get('/v1/transfers/sources/:sourceId')
|
||||
->groups(['api', 'transfers'])
|
||||
->desc('Get Source')
|
||||
->label('scope', 'transfers.read')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_KEY])
|
||||
->label('sdk.namespace', 'transfers')
|
||||
->label('sdk.method', 'getSource')
|
||||
->label('sdk.description', '/docs/references/transfers/get-source.md')
|
||||
->label('sdk.response.code', Response::STATUS_CODE_OK)
|
||||
->label('sdk.response.type', Response::CONTENT_TYPE_JSON)
|
||||
->label('sdk.response.model', Response::MODEL_SOURCE)
|
||||
->param('sourceId', '', new UID(), 'Source unique ID.')
|
||||
->inject('response')
|
||||
->inject('dbForProject')
|
||||
->action(function (string $sourceId, Response $response, Database $dbForProject) {
|
||||
$source = $dbForProject->getDocument('sources', $sourceId);
|
||||
|
||||
if ($source->isEmpty()) {
|
||||
throw new Exception(Exception::TRANSFER_SOURCE_NOT_FOUND, 'Source not found');
|
||||
}
|
||||
|
||||
$response->dynamic($source, Response::MODEL_SOURCE);
|
||||
});
|
||||
|
||||
App::post('/v1/transfers/sources/:sourceId/validate')
|
||||
->groups(['api', 'transfers'])
|
||||
->desc('Validate Source')
|
||||
->label('scope', 'transfers.write')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_KEY])
|
||||
->label('sdk.namespace', 'transfers')
|
||||
->label('sdk.method', 'validateSource')
|
||||
->label('sdk.description', '/docs/references/transfers/validate-source.md')
|
||||
->label('sdk.response.code', Response::STATUS_CODE_OK)
|
||||
->label('sdk.response.type', Response::CONTENT_TYPE_NULL)
|
||||
->label('sdk.response.model', Response::MODEL_NONE)
|
||||
->param('sourceId', '', new UID(), 'Source unique ID.')
|
||||
->inject('response')
|
||||
->inject('dbForProject')
|
||||
->action(function (string $sourceId, Response $response, Database $dbForProject) {
|
||||
$source = $dbForProject->getDocument('sources', $sourceId);
|
||||
|
||||
if ($source->isEmpty()) {
|
||||
throw new Exception(Exception::TRANSFER_SOURCE_NOT_FOUND, 'Source not found');
|
||||
}
|
||||
|
||||
$authData = json_decode($source->getAttribute('data', "{}"), true);
|
||||
|
||||
try {
|
||||
$testAdapter = null;
|
||||
|
||||
switch ($source['type']) {
|
||||
case 'appwrite': {
|
||||
$testAdapter = new SourcesAppwrite($authData['project'], $authData['endpoint'], $authData['key']);
|
||||
break;
|
||||
}
|
||||
case 'firebase': {
|
||||
$testAdapter = new Firebase($authData['authObject'], Firebase::AUTH_SERVICEACCOUNT);
|
||||
break;
|
||||
}
|
||||
case 'supabase': {
|
||||
$testAdapter = new Supabase($authData['host'], $authData['database'], $authData['password'], $authData['port']);
|
||||
break;
|
||||
}
|
||||
case 'nhost': {
|
||||
$testAdapter = new NHost($authData['host'], $authData['database'], $authData['password'], $authData['port']);
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
throw new Exception(Exception::TRANSFER_SOURCE_NOT_FOUND, 'Source not found');
|
||||
}
|
||||
}
|
||||
|
||||
$testAdapter->check(); // Throws exception on failure
|
||||
$response->noContent();
|
||||
} catch (Exception $e) {
|
||||
throw new Exception($e->getMessage(), 400);
|
||||
}
|
||||
});
|
||||
|
||||
App::delete('/v1/transfers/sources/:sourceId')
|
||||
->groups(['api', 'transfers'])
|
||||
->desc('Delete Source')
|
||||
->label('scope', 'transfers.write')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_KEY])
|
||||
->label('sdk.namespace', 'transfers')
|
||||
->label('sdk.method', 'deleteSource')
|
||||
->label('sdk.description', '/docs/references/transfers/delete-source.md')
|
||||
->label('sdk.response.code', Response::STATUS_CODE_NOCONTENT)
|
||||
->label('sdk.response.type', Response::CONTENT_TYPE_JSON)
|
||||
->param('sourceId', '', new UID(), 'Source unique ID.')
|
||||
->inject('response')
|
||||
->inject('dbForProject')
|
||||
->action(function (string $sourceId, Response $response, Database $dbForProject) {
|
||||
$source = $dbForProject->getDocument('sources', $sourceId);
|
||||
|
||||
if ($source->isEmpty()) {
|
||||
throw new Exception(Exception::TRANSFER_SOURCE_NOT_FOUND, 'Source not found');
|
||||
}
|
||||
|
||||
$dbForProject->deleteDocument('sources', $source->getId());
|
||||
|
||||
$response->noContent();
|
||||
});
|
||||
|
||||
App::get('/v1/transfers/destinations')
|
||||
->groups(['api', 'transfers'])
|
||||
->desc('List Destinations')
|
||||
->label('scope', 'transfers.read')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_KEY])
|
||||
->label('sdk.namespace', 'transfers')
|
||||
->label('sdk.method', 'listDestinations')
|
||||
->label('sdk.description', '/docs/references/transfers/list-destinations.md')
|
||||
->label('sdk.response.code', Response::STATUS_CODE_OK)
|
||||
->label('sdk.response.type', Response::CONTENT_TYPE_JSON)
|
||||
->label('sdk.response.model', Response::MODEL_DESTINATION_LIST)
|
||||
->param('queries', [], new Destinations(), 'Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https://appwrite.io/docs/databases#querying-documents). Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' queries are allowed, each ' . APP_LIMIT_ARRAY_ELEMENT_SIZE . ' characters long. You may filter on the following attributes: ' . implode(', ', Transfers::ALLOWED_ATTRIBUTES), true)
|
||||
->param('search', '', new Text(256), 'Search term to filter your list results. Max length: 256 chars.', true)
|
||||
->inject('response')
|
||||
->inject('dbForProject')
|
||||
->action(function (array $queries, string $search, Response $response, Database $dbForProject) {
|
||||
|
||||
$queries = Query::parseQueries($queries);
|
||||
|
||||
if (!empty($search)) {
|
||||
$queries[] = Query::search('search', $search);
|
||||
}
|
||||
|
||||
// Get cursor document if there was a cursor query
|
||||
$cursor = Query::getByType($queries, Query::TYPE_CURSORAFTER, Query::TYPE_CURSORBEFORE);
|
||||
$cursor = reset($cursor);
|
||||
if ($cursor) {
|
||||
/** @var Query $cursor */
|
||||
$destinationId = $cursor->getValue();
|
||||
$cursorDocument = $dbForProject->getDocument('destinations', $destinationId);
|
||||
|
||||
if ($cursorDocument->isEmpty()) {
|
||||
throw new Exception(Exception::GENERAL_CURSOR_NOT_FOUND, "Source '{$destinationId}' for the 'cursor' value not found.");
|
||||
}
|
||||
|
||||
$cursor->setValue($cursorDocument);
|
||||
}
|
||||
|
||||
$filterQueries = Query::groupByType($queries)['filters'];
|
||||
|
||||
$response->dynamic(new Document([
|
||||
'destinations' => $dbForProject->find('destinations', $queries),
|
||||
'total' => $dbForProject->count('destinations', $filterQueries, APP_LIMIT_COUNT),
|
||||
]), Response::MODEL_DESTINATION_LIST);
|
||||
});
|
||||
|
||||
App::get('/v1/transfers/destinations/:destinationId')
|
||||
->groups(['api', 'transfers'])
|
||||
->desc('Get Destination')
|
||||
->label('scope', 'transfers.read')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_KEY])
|
||||
->label('sdk.namespace', 'transfers')
|
||||
->label('sdk.method', 'getDestination')
|
||||
->label('sdk.description', '/docs/references/transfers/get-destination.md')
|
||||
->label('sdk.response.code', Response::STATUS_CODE_OK)
|
||||
->label('sdk.response.type', Response::CONTENT_TYPE_JSON)
|
||||
->label('sdk.response.model', Response::MODEL_DESTINATION)
|
||||
->param('destinationId', '', new UID(), 'Destination unique ID.')
|
||||
->inject('response')
|
||||
->inject('dbForProject')
|
||||
->action(function (string $desinationId, Response $response, Database $dbForProject) {
|
||||
$destination = $dbForProject->getDocument('destinations', $desinationId);
|
||||
|
||||
if ($destination->isEmpty()) {
|
||||
throw new Exception(Exception::TRANSFER_DESTINATION_NOT_FOUND, 'Destination not found');
|
||||
}
|
||||
|
||||
$response->dynamic($destination, Response::MODEL_DESTINATION);
|
||||
});
|
||||
|
||||
App::post('/v1/transfers/destinations/:destinationId/validate')
|
||||
->groups(['api', 'transfers'])
|
||||
->desc('Validate Destination')
|
||||
->label('scope', 'transfers.write')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_KEY])
|
||||
->label('sdk.namespace', 'transfers')
|
||||
->label('sdk.method', 'validateDestination')
|
||||
->label('sdk.description', '/docs/references/transfers/validate-destination.md')
|
||||
->label('sdk.response.code', Response::STATUS_CODE_OK)
|
||||
->label('sdk.response.type', Response::CONTENT_TYPE_NULL)
|
||||
->label('sdk.response.model', Response::MODEL_NONE)
|
||||
->param('destinationId', '', new UID(), 'Destination unique ID.')
|
||||
->inject('response')
|
||||
->inject('dbForProject')
|
||||
->action(function (string $destinationId, Response $response, Database $dbForProject) {
|
||||
$destination = $dbForProject->getDocument('destinations', $destinationId);
|
||||
|
||||
if ($destination->isEmpty()) {
|
||||
throw new Exception(Exception::TRANSFER_DESTINATION_NOT_FOUND, 'Destination not found');
|
||||
}
|
||||
|
||||
$authData = json_decode($destination->getAttribute('data', "{}"), true);
|
||||
|
||||
try {
|
||||
$testAdapter = null;
|
||||
|
||||
switch ($destination['type']) {
|
||||
case 'appwrite': {
|
||||
$testAdapter = new Appwrite($authData['projectId'], $authData['endpoint'], $authData['key']);
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
throw new Exception(Exception::TRANSFER_DESTINATION_NOT_FOUND, 'Destination not found');
|
||||
}
|
||||
}
|
||||
|
||||
$testAdapter->check(); // Throws exception on failure
|
||||
$response->noContent();
|
||||
} catch (Exception $e) {
|
||||
throw new Exception($e->getMessage(), 400);
|
||||
}
|
||||
});
|
||||
|
||||
App::delete('/v1/transfers/destinations/:destinationId')
|
||||
->groups(['api', 'transfers'])
|
||||
->desc('Delete Destination')
|
||||
->label('scope', 'transfers.write')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_KEY])
|
||||
->label('sdk.namespace', 'transfers')
|
||||
->label('sdk.method', 'deleteDestination')
|
||||
->label('sdk.description', '/docs/references/transfers/delete-destination.md')
|
||||
->label('sdk.response.code', Response::STATUS_CODE_NOCONTENT)
|
||||
->label('sdk.response.type', Response::CONTENT_TYPE_JSON)
|
||||
->param('destinationId', '', new UID(), 'Destination unique ID.')
|
||||
->inject('response')
|
||||
->inject('dbForProject')
|
||||
->action(function (string $destinationId, Response $response, Database $dbForProject) {
|
||||
$destination = $dbForProject->getDocument('destinations', $destinationId);
|
||||
|
||||
if ($destination->isEmpty()) {
|
||||
throw new Exception(Exception::TRANSFER_DESTINATION_NOT_FOUND, 'Destination not found');
|
||||
}
|
||||
|
||||
$dbForProject->deleteDocument('destinations', $destination->getId());
|
||||
|
||||
$response->noContent();
|
||||
});
|
||||
|
||||
App::post('/v1/transfers/sources/appwrite')
|
||||
->groups(['api', 'transfers'])
|
||||
->desc('Create Appwrite Source')
|
||||
->label('scope', 'transfers.write')
|
||||
->label('event', 'transfers.[sourceId].createAppwriteSource')
|
||||
->label('audits.event', 'transfers.createAppwriteSource')
|
||||
->label('audits.resource', 'sources/{response.$id}')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_KEY])
|
||||
->label('sdk.namespace', 'transfers')
|
||||
->label('sdk.method', 'createAppwriteSource')
|
||||
->label('sdk.description', '/docs/references/transfers/create-appwrite-source.md')
|
||||
->label('sdk.response.code', Response::STATUS_CODE_CREATED)
|
||||
->label('sdk.response.type', Response::CONTENT_TYPE_JSON)
|
||||
->label('sdk.response.model', Response::MODEL_SOURCE)
|
||||
->param('sourceId', 'unique()', new CustomId(), 'Source unique ID. Use \'unique()\' to auto generate a unique ID for this source.', true)
|
||||
->param('name', '', new Text(256), 'Source Name. Max length: 256 chars.', true)
|
||||
->param('projectId', '', new UID(), 'Source Project UID. The UID of the project to transfer.', false)
|
||||
->param('endpoint', '', new URL(), 'Source Endpoint. The endpoint of the project to transfer.', false)
|
||||
->param('key', '', new Text(100), 'Source Key. The key of the project to transfer.', false)
|
||||
->inject('response')
|
||||
->inject('dbForProject')
|
||||
->inject('project')
|
||||
->inject('user')
|
||||
->inject('events')
|
||||
->action(function (string $sourceId, string $name, string $projectId, string $endpoint, string $key, Response $response, Database $dbForProject, Document $project, Document $user, Event $eventsInstance) {
|
||||
$sourceId = ($sourceId == 'unique()') ? ID::unique() : $sourceId;
|
||||
|
||||
$testAdapter = new SourcesAppwrite($projectId, $endpoint, $key);
|
||||
$testAdapter->check(); // Throws exception on failure
|
||||
|
||||
$source = $dbForProject->createDocument('sources', new Document([
|
||||
'$id' => $sourceId,
|
||||
'$collection' => ID::custom('sources'),
|
||||
'type' => 'appwrite',
|
||||
'name' => empty($name) ? 'Appwrite Project: ' . $sourceId : $name,
|
||||
'data' => json_encode([
|
||||
'projectId' => $projectId,
|
||||
'endpoint' => $endpoint,
|
||||
'key' => $key,
|
||||
])
|
||||
]));
|
||||
|
||||
$eventsInstance->setParam('sourceId', $source->getId());
|
||||
|
||||
$response
|
||||
->setStatusCode(Response::STATUS_CODE_CREATED)
|
||||
->dynamic($source, Response::MODEL_SOURCE);
|
||||
});
|
||||
|
||||
App::post('/v1/transfers/sources/appwrite/validate')
|
||||
->groups(['api', 'transfers'])
|
||||
->desc('Validate Appwrite Source')
|
||||
->label('scope', 'transfers.write')
|
||||
->label('event', 'transfers.[sourceId].validateAppwriteSource')
|
||||
->label('audits.event', 'transfers.validateAppwriteSource')
|
||||
->label('audits.resource', 'sources/{response.$id}')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_KEY])
|
||||
->label('sdk.namespace', 'transfers')
|
||||
->label('sdk.method', 'validateAppwriteSource')
|
||||
->label('sdk.description', '/docs/references/transfers/validate-appwrite-source.md')
|
||||
->label('sdk.response.code', Response::STATUS_CODE_OK)
|
||||
->label('sdk.response.type', Response::CONTENT_TYPE_JSON)
|
||||
->label('sdk.response.model', Response::MODEL_NONE)
|
||||
->param('projectId', '', new UID(), 'Source Project UID. The UID of the project to transfer.', false)
|
||||
->param('endpoint', '', new URL(), 'Source Endpoint. The endpoint of the project to transfer.', false)
|
||||
->param('key', '', new Text(100), 'Source Key. The key of the project to transfer.', false)
|
||||
->inject('response')
|
||||
->action(function (string $projectId, string $endpoint, string $key, Response $response) {
|
||||
$testAdapter = new SourcesAppwrite($projectId, $endpoint, $key);
|
||||
try {
|
||||
$testAdapter->check(); // Throws exception on failure
|
||||
} catch (Exception $e) {
|
||||
throw new Exception($e->getMessage(), 400);
|
||||
}
|
||||
|
||||
$response->noContent();
|
||||
});
|
||||
|
||||
App::post('/v1/transfers/sources/firebase')
|
||||
->groups(['api', 'transfers'])
|
||||
->desc('Create Firebase Source')
|
||||
->label('scope', 'transfers.write')
|
||||
->label('event', 'transfers.[sourceId].createFirebaseSource')
|
||||
->label('audits.event', 'transfers.createFirebaseSource')
|
||||
->label('audits.resource', 'sources/{response.$id}')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_KEY])
|
||||
->label('sdk.namespace', 'transfers')
|
||||
->label('sdk.method', 'createFirebaseSource')
|
||||
->label('sdk.description', '/docs/references/transfers/create-firebase-source.md')
|
||||
->label('sdk.response.code', Response::STATUS_CODE_CREATED)
|
||||
->label('sdk.response.type', Response::CONTENT_TYPE_JSON)
|
||||
->label('sdk.response.model', Response::MODEL_SOURCE)
|
||||
->param('sourceId', 'unique()', new CustomId(), 'Source unique ID. Use \'unique()\' to auto generate a unique ID for this source.', true)
|
||||
->param('name', '', new Text(256), 'Source Name. Max length: 256 chars.', true)
|
||||
->param('serviceAccount', '', new JSON(), 'Firebase Service account with all required scopes, [Learn more about Firebase Transfer](https://appwrite.io/docs/transfers/sources#firebase)', false)
|
||||
->inject('response')
|
||||
->inject('dbForProject')
|
||||
->inject('project')
|
||||
->inject('user')
|
||||
->inject('events')
|
||||
->action(function (string $sourceId, string $name, array $serviceAccount, Response $response, Database $dbForProject, Document $project, Document $user, Event $eventsInstance) {
|
||||
$sourceId = ($sourceId == 'unique()') ? ID::unique() : $sourceId;
|
||||
|
||||
$testAdapter = new Firebase($serviceAccount, Firebase::AUTH_SERVICEACCOUNT);
|
||||
$testAdapter->check(); // Throws exception on failure
|
||||
|
||||
$source = $dbForProject->createDocument('sources', new Document([
|
||||
'$id' => $sourceId,
|
||||
'$collection' => ID::custom('sources'),
|
||||
'type' => 'firebase',
|
||||
'name' => empty($name) ? 'Firebase Project ' . $serviceAccount['project_id'] : $name,
|
||||
'data' => json_encode([
|
||||
'serviceAccount' => $serviceAccount,
|
||||
])
|
||||
]));
|
||||
|
||||
$eventsInstance->setParam('sourceId', $source->getId());
|
||||
|
||||
$response
|
||||
->setStatusCode(Response::STATUS_CODE_CREATED)
|
||||
->dynamic($source, Response::MODEL_SOURCE);
|
||||
});
|
||||
|
||||
App::post('/v1/transfers/sources/firebase/validate')
|
||||
->groups(['api', 'transfers'])
|
||||
->desc('Validate Firebase Source')
|
||||
->label('scope', 'transfers.write')
|
||||
->label('event', 'transfers.[sourceId].validateFirebaseSource')
|
||||
->label('audits.event', 'transfers.validateFirebaseSource')
|
||||
->label('audits.resource', 'sources/{response.$id}')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_KEY])
|
||||
->label('sdk.namespace', 'transfers')
|
||||
->label('sdk.method', 'validateFirebaseSource')
|
||||
->label('sdk.description', '/docs/references/transfers/validate-firebase-source.md')
|
||||
->label('sdk.response.code', Response::STATUS_CODE_OK)
|
||||
->label('sdk.response.type', Response::CONTENT_TYPE_JSON)
|
||||
->label('sdk.response.model', Response::MODEL_NONE)
|
||||
->param('serviceAccount', '', new JSON(), 'Firebase Service account with all required scopes, [Learn more about Firebase Transfer](https://appwrite.io/docs/transfers/sources#firebase)', false)
|
||||
->inject('response')
|
||||
->action(function (string $serviceAccount, Response $response) {
|
||||
$testAdapter = new Firebase(json_decode($serviceAccount, true), Firebase::AUTH_SERVICEACCOUNT);
|
||||
try {
|
||||
$testAdapter->check(); // Throws exception on failure
|
||||
} catch (Exception $e) {
|
||||
throw new Exception($e->getMessage(), 400);
|
||||
}
|
||||
|
||||
$response->noContent();
|
||||
});
|
||||
|
||||
App::post('/v1/transfers/sources/supabase')
|
||||
->groups(['api', 'transfers'])
|
||||
->desc('Create Supabase Source')
|
||||
->label('scope', 'transfers.write')
|
||||
->label('event', 'transfers.[sourceId].createSupabaseSource')
|
||||
->label('audits.event', 'transfers.createSupabaseSource')
|
||||
->label('audits.resource', 'sources/{response.$id}')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_KEY])
|
||||
->label('sdk.namespace', 'transfers')
|
||||
->label('sdk.method', 'createSupabaseSource')
|
||||
->label('sdk.description', '/docs/references/transfers/create-supabase-source.md')
|
||||
->label('sdk.response.code', Response::STATUS_CODE_CREATED)
|
||||
->label('sdk.response.type', Response::CONTENT_TYPE_JSON)
|
||||
->label('sdk.response.model', Response::MODEL_SOURCE)
|
||||
->param('sourceId', 'unique()', new CustomId(), 'Source unique ID. Use \'unique()\' to auto generate a unique ID for this source.', true)
|
||||
->param('name', '', new Text(256), 'Source Name. Max length: 256 chars.', true)
|
||||
->param('host', '', new Text(100), 'Supabase Database Host. The host of the project to transfer.', false)
|
||||
->param('database', 'postgres', new Text(100), 'Supabase Database Name. The name of the database to transfer.', true)
|
||||
->param('username', 'postgres', new Text(100), 'Supabase Database Username. The username of the database to transfer.', true)
|
||||
->param('password', '', new Text(100), 'Supabase Database Password. The password of the database to transfer.', false)
|
||||
->param('port', '5432', new Integer(true), 'Supabase Database Port. The port of the database to transfer.', true)
|
||||
->inject('response')
|
||||
->inject('dbForProject')
|
||||
->inject('project')
|
||||
->inject('user')
|
||||
->inject('events')
|
||||
->action(function (string $sourceId, string $name, string $url, string $database, string $username, string $password, string $port, Response $response, Database $dbForProject, Document $project, Document $user, Event $eventsInstance) {
|
||||
$sourceId = ($sourceId == 'unique()') ? ID::unique() : $sourceId;
|
||||
|
||||
$testAdapter = new Supabase($url, $database, $username, $password, intval($port));
|
||||
$testAdapter->check(); // Throws exception on failure
|
||||
|
||||
$source = $dbForProject->createDocument('sources', new Document([
|
||||
'$id' => $sourceId,
|
||||
'$collection' => ID::custom('sources'),
|
||||
'type' => 'supabase',
|
||||
'name' => empty($name) ? 'Supabase Project ' . $sourceId : $name,
|
||||
'data' => json_encode([
|
||||
'url' => $url,
|
||||
'database' => $database,
|
||||
'username' => $username,
|
||||
'password' => $password,
|
||||
'port' => intval($port),
|
||||
])
|
||||
]));
|
||||
|
||||
$eventsInstance->setParam('sourceId', $source->getId());
|
||||
|
||||
$response
|
||||
->setStatusCode(Response::STATUS_CODE_CREATED)
|
||||
->dynamic($source, Response::MODEL_SOURCE);
|
||||
});
|
||||
|
||||
App::post('/v1/transfers/sources/supabase/validate')
|
||||
->groups(['api', 'transfers'])
|
||||
->desc('Validate Supabase Source')
|
||||
->label('scope', 'transfers.write')
|
||||
->label('event', 'transfers.[sourceId].validateSupabaseSource')
|
||||
->label('audits.event', 'transfers.validateSupabaseSource')
|
||||
->label('audits.resource', 'sources/{response.$id}')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_KEY])
|
||||
->label('sdk.namespace', 'transfers')
|
||||
->label('sdk.method', 'validateSupabaseSource')
|
||||
->label('sdk.description', '/docs/references/transfers/validate-supabase-source.md')
|
||||
->label('sdk.response.code', Response::STATUS_CODE_OK)
|
||||
->label('sdk.response.type', Response::CONTENT_TYPE_JSON)
|
||||
->label('sdk.response.model', Response::MODEL_NONE)
|
||||
->param('host', '', new Text(100), 'Supabase Database Host. The host of the project to transfer.', false)
|
||||
->param('database', 'postgres', new Text(100), 'Supabase Database Name. The name of the database to transfer.', true)
|
||||
->param('username', 'postgres', new Text(100), 'Supabase Database Username. The username of the database to transfer.', true)
|
||||
->param('password', '', new Text(100), 'Supabase Database Password. The password of the database to transfer.', false)
|
||||
->param('port', '5432', new Integer(true), 'Supabase Database Port. The port of the database to transfer.', true)
|
||||
->inject('response')
|
||||
->action(function (string $host, string $database, string $username, string $password, string $port, Response $response) {
|
||||
$testAdapter = new Supabase($host, $database, $username, $password, $port);
|
||||
try {
|
||||
$testAdapter->check(); // Throws exception on failure
|
||||
} catch (Exception $e) {
|
||||
throw new Exception($e->getMessage(), 400);
|
||||
}
|
||||
|
||||
$response->noContent();
|
||||
});
|
||||
|
||||
App::post('/v1/transfers/sources/nhost')
|
||||
->groups(['api', 'transfers'])
|
||||
->desc('Create Nhost Source')
|
||||
->label('scope', 'transfers.write')
|
||||
->label('event', 'transfers.[sourceId].createNhostSource')
|
||||
->label('audits.event', 'transfers.createNhostSource')
|
||||
->label('audits.resource', 'sources/{response.$id}')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_KEY])
|
||||
->label('sdk.namespace', 'transfers')
|
||||
->label('sdk.method', 'createNhostSource')
|
||||
->label('sdk.description', '/docs/references/transfers/create-nhost-source.md')
|
||||
->label('sdk.response.code', Response::STATUS_CODE_CREATED)
|
||||
->label('sdk.response.type', Response::CONTENT_TYPE_JSON)
|
||||
->label('sdk.response.model', Response::MODEL_SOURCE)
|
||||
->param('sourceId', 'unique()', new CustomId(), 'Source unique ID. Use \'unique()\' to auto generate a unique ID for this source.', true)
|
||||
->param('name', '', new Text(256), 'Source Name. Max length: 256 chars.', true)
|
||||
->param('host', '', new Text(100), 'Nhost Database Host. The host of the project to transfer.', false)
|
||||
->param('database', 'postgres', new Text(100), 'Nhost Database Name. The name of the database to transfer.', true)
|
||||
->param('username', 'postgres', new Text(100), 'Nhost Database Username. The username of the database to transfer.', true)
|
||||
->param('password', '', new Text(100), 'Nhost Database Password. The password of the database to transfer.', false)
|
||||
->param('port', '5432', new Integer(true), 'Nhost Database Port. The port of the database to transfer.', true)
|
||||
->inject('response')
|
||||
->inject('dbForProject')
|
||||
->inject('project')
|
||||
->inject('user')
|
||||
->inject('events')
|
||||
->action(function (string $sourceId, string $name, string $url, string $database, string $username, string $password, int $port, Response $response, Database $dbForProject, Document $project, Document $user, Event $eventsInstance) {
|
||||
$sourceId = ($sourceId == 'unique()') ? ID::unique() : $sourceId;
|
||||
|
||||
$testAdapter = new NHost($url, $database, $username, $password, $port);
|
||||
$testAdapter->check(); // Throws exception on failure
|
||||
|
||||
$source = $dbForProject->createDocument('sources', new Document([
|
||||
'$id' => $sourceId,
|
||||
'$collection' => ID::custom('sources'),
|
||||
'type' => 'nhost',
|
||||
'name' => empty($name) ? 'Nhost Project ' . $sourceId : $name,
|
||||
'data' => json_encode([
|
||||
'url' => $url,
|
||||
'database' => $database,
|
||||
'username' => $username,
|
||||
'password' => $password,
|
||||
'port' => $port,
|
||||
])
|
||||
]));
|
||||
|
||||
$eventsInstance->setParam('sourceId', $source->getId());
|
||||
|
||||
$response
|
||||
->setStatusCode(Response::STATUS_CODE_CREATED)
|
||||
->dynamic($source, Response::MODEL_SOURCE);
|
||||
});
|
||||
|
||||
App::post('/v1/transfers/sources/nhost/validate')
|
||||
->groups(['api', 'transfers'])
|
||||
->desc('Validate Nhost Source')
|
||||
->label('scope', 'transfers.write')
|
||||
->label('event', 'transfers.[sourceId].validateNhostSource')
|
||||
->label('audits.event', 'transfers.validateNhostSource')
|
||||
->label('audits.resource', 'sources/{response.$id}')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_KEY])
|
||||
->label('sdk.namespace', 'transfers')
|
||||
->label('sdk.method', 'validateNhostSource')
|
||||
->label('sdk.description', '/docs/references/transfers/validate-nhost-source.md')
|
||||
->label('sdk.response.code', Response::STATUS_CODE_OK)
|
||||
->label('sdk.response.type', Response::CONTENT_TYPE_JSON)
|
||||
->label('sdk.response.model', Response::MODEL_NONE)
|
||||
->param('host', '', new Text(100), 'Nhost Database Host. The host of the project to validate.', false)
|
||||
->param('database', 'postgres', new Text(100), 'Nhost Database Name. The name of the database to validate.', true)
|
||||
->param('username', 'postgres', new Text(100), 'Nhost Database Username. The username of the database to validate.', true)
|
||||
->param('password', '', new Text(100), 'Nhost Database Password. The password of the database to validate.', false)
|
||||
->param('port', '5432', new Integer(true), 'Nhost Database Port. The port of the database to validate.', true)
|
||||
->inject('response')
|
||||
->action(function (string $url, string $database, string $username, string $password, string $port, Response $response) {
|
||||
$testAdapter = new NHost($url, $database, $username, $password, $port);
|
||||
try {
|
||||
$testAdapter->check(); // Throws exception on failure
|
||||
} catch (Exception $e) {
|
||||
throw new Exception($e->getMessage(), 400);
|
||||
}
|
||||
|
||||
$response->noContent();
|
||||
});
|
||||
|
||||
App::post('/v1/transfers/destinations/appwrite')
|
||||
->groups(['api', 'transfers'])
|
||||
->desc('Create Appwrite Transfer Destination')
|
||||
->label('scope', 'transfers.write')
|
||||
->label('event', 'transfers.[sourceId].createAppwriteDestination')
|
||||
->label('audits.event', 'transfers.createAppwriteDestination')
|
||||
->label('audits.resource', 'sources/{response.$id}')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_KEY])
|
||||
->label('sdk.namespace', 'transfers')
|
||||
->label('sdk.method', 'createAppwriteDestination')
|
||||
->label('sdk.description', '/docs/references/transfers/create-appwrite-source.md')
|
||||
->label('sdk.response.code', Response::STATUS_CODE_CREATED)
|
||||
->label('sdk.response.type', Response::CONTENT_TYPE_JSON)
|
||||
->label('sdk.response.model', Response::MODEL_DESTINATION)
|
||||
->param('destinationId', 'unique()', new CustomId(), 'Destination unique ID. Use \'unique()\' to auto generate a unique ID for this source.', true)
|
||||
->param('name', '', new Text(256), 'Destination Name. Max length: 256 chars.', true)
|
||||
->param('projectId', '', new UID(), 'Destination Project UID. The UID of the project to transfer.', false)
|
||||
->param('endpoint', '', new URL(), 'Destination Endpoint. The endpoint of the project to transfer.', false)
|
||||
->param('key', '', new Text(1024), 'Destination Key. The key of the project to transfer.', false)
|
||||
->inject('response')
|
||||
->inject('dbForProject')
|
||||
->inject('project')
|
||||
->inject('user')
|
||||
->inject('events')
|
||||
->action(function (string $destinationId, string $name, string $projectId, string $endpoint, string $key, Response $response, Database $dbForProject, Document $project, Document $user, Event $eventsInstance) {
|
||||
$destinationId = ($destinationId == 'unique()') ? ID::unique() : $destinationId;
|
||||
|
||||
try {
|
||||
$testAdapter = new Appwrite($projectId, $endpoint, $key);
|
||||
$testAdapter->check(); // Throws exception on failure
|
||||
} catch (Exception $e) {
|
||||
throw new Exception('Failed to connect to Appwrite project');
|
||||
}
|
||||
|
||||
$destination = $dbForProject->createDocument('destinations', new Document([
|
||||
'$id' => $destinationId,
|
||||
'$collection' => ID::custom('destinations'),
|
||||
'type' => 'appwrite',
|
||||
'name' => empty($name) ? 'Appwrite Project ' . $destinationId : $name,
|
||||
'data' => json_encode([
|
||||
'projectId' => $projectId,
|
||||
'endpoint' => $endpoint,
|
||||
'key' => $key,
|
||||
])
|
||||
]));
|
||||
|
||||
$eventsInstance->setParam('desinationId', $destination->getId());
|
||||
|
||||
$response
|
||||
->setStatusCode(Response::STATUS_CODE_CREATED)
|
||||
->dynamic($destination, Response::MODEL_DESTINATION);
|
||||
});
|
||||
|
||||
App::post('/v1/transfers/destinations/appwrite/validate')
|
||||
->groups(['api', 'transfers'])
|
||||
->desc('Validate Appwrite Destination')
|
||||
->label('scope', 'transfers.write')
|
||||
->label('event', 'transfers.[sourceId].validateAppwriteDestination')
|
||||
->label('audits.event', 'transfers.validateAppwriteDestination')
|
||||
->label('audits.resource', 'sources/{response.$id}')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_KEY])
|
||||
->label('sdk.namespace', 'transfers')
|
||||
->label('sdk.method', 'validateAppwriteDestination')
|
||||
->label('sdk.description', '/docs/references/transfers/validate-appwrite-destination.md')
|
||||
->label('sdk.response.code', Response::STATUS_CODE_OK)
|
||||
->label('sdk.response.type', Response::CONTENT_TYPE_JSON)
|
||||
->label('sdk.response.model', Response::MODEL_NONE)
|
||||
->param('projectId', '', new UID(), 'Destination Project UID. The UID of the project to transfer.', false)
|
||||
->param('endpoint', '', new URL(), 'Destination Endpoint. The endpoint of the project to transfer.', false)
|
||||
->param('key', '', new Text(1024), 'Destination Key. The key of the project to transfer.', false)
|
||||
->inject('response')
|
||||
->action(function (string $projectId, string $endpoint, string $key, Response $response) {
|
||||
$testAdapter = new Appwrite($projectId, $endpoint, $key);
|
||||
try {
|
||||
$testAdapter->check(); // Throws exception on failure
|
||||
} catch (Exception $e) {
|
||||
throw new Exception($e->getMessage(), 400);
|
||||
}
|
||||
|
||||
$response->noContent();
|
||||
});
|
||||
@@ -0,0 +1,181 @@
|
||||
<?php
|
||||
|
||||
use Appwrite\Event\Event;
|
||||
use Appwrite\Event\Mail;
|
||||
use Appwrite\Network\Validator\CNAME;
|
||||
use Appwrite\Resque\Worker;
|
||||
use Appwrite\Template\Template;
|
||||
use MongoDB\Operation\Update;
|
||||
use Utopia\App;
|
||||
use Utopia\CLI\Console;
|
||||
use Utopia\Database\Database;
|
||||
use Utopia\Database\Document;
|
||||
use Utopia\Database\DateTime;
|
||||
use Utopia\Database\Query;
|
||||
use Utopia\Domains\Domain;
|
||||
use Utopia\Locale\Locale;
|
||||
use Utopia\Transfer\Destinations\Appwrite as DestinationsAppwrite;
|
||||
use Utopia\Transfer\Source;
|
||||
use Utopia\Transfer\Sources\Appwrite;
|
||||
use Utopia\Transfer\Sources\Firebase;
|
||||
use Utopia\Transfer\Sources\NHost;
|
||||
use Utopia\Transfer\Sources\Supabase;
|
||||
|
||||
require_once __DIR__ . '/../init.php';
|
||||
|
||||
Console::title('Transfers V1 Worker');
|
||||
Console::success(APP_NAME . ' Transfers worker v1 has started');
|
||||
|
||||
class TransfersV1 extends Worker
|
||||
{
|
||||
/**
|
||||
* Database connection shared across all methods of this file
|
||||
*
|
||||
* @var Database
|
||||
*/
|
||||
private Database $dbForConsole;
|
||||
|
||||
public function getName(): string
|
||||
{
|
||||
return "Transfers";
|
||||
}
|
||||
|
||||
public function init(): void
|
||||
{
|
||||
}
|
||||
|
||||
public function run(): void
|
||||
{
|
||||
switch ($this->args['type']) {
|
||||
case 'processTransfer':
|
||||
$this->processTransfer();
|
||||
break;
|
||||
case 'processVerification':
|
||||
$this->processVerification();
|
||||
break;
|
||||
default:
|
||||
throw new \Exception('Invalid transfer type');
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Process Source
|
||||
*
|
||||
* @return Source
|
||||
* @throws \Exception
|
||||
*/
|
||||
function processSource(): Source
|
||||
{
|
||||
$source = $this->args['source'];
|
||||
|
||||
switch ($source['type']) {
|
||||
case 'firebase':
|
||||
return new Firebase(
|
||||
$source['authObject'] ?? '',
|
||||
Firebase::AUTH_SERVICEACCOUNT
|
||||
);
|
||||
break;
|
||||
case 'supabase':
|
||||
return new Supabase(
|
||||
$source['host'] ?? '',
|
||||
$source['databaseName'] ?? '',
|
||||
$source['username'] ?? '',
|
||||
$source['password'] ?? '',
|
||||
$source['port'] ?? 5432,
|
||||
);
|
||||
break;
|
||||
case 'nhost':
|
||||
return new NHost(
|
||||
$source['host'] ?? '',
|
||||
$source['databaseName'] ?? '',
|
||||
$source['username'] ?? '',
|
||||
$source['password'] ?? '',
|
||||
$source['port'] ?? 5432,
|
||||
);
|
||||
break;
|
||||
case 'appwrite':
|
||||
return new Appwrite($source['projectId'], $source['endpoint'], $source['key']);
|
||||
break;
|
||||
default:
|
||||
throw new \Exception('Invalid source type');
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
protected function updateAttribute(string $attribute, mixed $value, Document $document): void
|
||||
{
|
||||
$document->setAttribute($attribute, $value);
|
||||
$this->dbForConsole->updateDocument($document->getCollection(), $document->getId(), $document);
|
||||
}
|
||||
|
||||
/**
|
||||
* Process Transfer
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function processTransfer(): void
|
||||
{
|
||||
$transferDocument = null;
|
||||
|
||||
try {
|
||||
$transferDocument = $this->dbForConsole->getDocument('transfers', $this->args['transferId']);
|
||||
$this->updateAttribute('status', 'processing', $transferDocument);
|
||||
|
||||
$source = $this->processSource();
|
||||
$destination = new DestinationsAppwrite($this->args['projectId'], $this->args['endpoint'], $this->args['key']);
|
||||
|
||||
$transfer = new \Utopia\Transfer\Transfer(
|
||||
$source,
|
||||
$destination
|
||||
);
|
||||
|
||||
$this->updateAttribute('stage', 'source-check', $transferDocument);
|
||||
if (!$source->check()) {
|
||||
$transferDocument->setAttribute('status', 'failed');
|
||||
$transferDocument->setAttribute('errorData', $transfer->getLogs('error'));
|
||||
}
|
||||
|
||||
$this->updateAttribute('stage', 'destination-check', $transferDocument);
|
||||
if (!$destination->check()) {
|
||||
$transferDocument->setAttribute('status', 'failed');
|
||||
$transferDocument->setAttribute('stage', 'destination-check');
|
||||
$transferDocument->setAttribute('errorData', $transfer->getLogs('error'));
|
||||
}
|
||||
|
||||
/** Start Transfer */
|
||||
$transfer->run($this->args['resoruces'], function (Update $update) use ($transferDocument, $transfer, $source, $destination) {
|
||||
$transferDocument->setAttribute('stage', 'transfer');
|
||||
$transferDocument->setAttribute('latestUpdate', json_encode($update));
|
||||
$transferDocument->setAttribute('progress', json_encode([
|
||||
'source' => $source->getCounter(''),
|
||||
'destination' => $destination->getCounter(''),
|
||||
]));
|
||||
$this->dbForConsole->updateDocument($transferDocument->getCollection(), $transferDocument->getId(), $transferDocument);
|
||||
});
|
||||
|
||||
if (!empty($transfer->getLogs('error'))) {
|
||||
$transferDocument->setAttribute('status', 'failed');
|
||||
$transferDocument->setAttribute('errorData', $transfer->getLogs('error'));
|
||||
}
|
||||
|
||||
$transferDocument->setAttribute('status', 'completed');
|
||||
} catch (\Throwable $th) {
|
||||
Console::error($th->getMessage());
|
||||
if ($transferDocument) {
|
||||
$transferDocument->setAttribute('status', 'failed');
|
||||
$transferDocument->setAttribute('errorData', $transfer->getLogs('error'));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Process Verification
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function processVerification(): void
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
#!/bin/sh
|
||||
|
||||
if [ -z "$_APP_REDIS_USER" ] && [ -z "$_APP_REDIS_PASS" ]
|
||||
then
|
||||
REDIS_BACKEND="${_APP_REDIS_HOST}:${_APP_REDIS_PORT}"
|
||||
else
|
||||
REDIS_BACKEND="redis://${_APP_REDIS_USER}:${_APP_REDIS_PASS}@${_APP_REDIS_HOST}:${_APP_REDIS_PORT}"
|
||||
fi
|
||||
|
||||
INTERVAL=0.1 QUEUE='v1-transfers' APP_INCLUDE='/usr/src/code/app/workers/transfers.php' php /usr/src/code/vendor/bin/resque -dopcache.preload=opcache.preload=/usr/src/code/app/preload.php
|
||||
+8
-2
@@ -62,6 +62,7 @@
|
||||
"utopia-php/storage": "0.13.*",
|
||||
"utopia-php/swoole": "0.5.*",
|
||||
"utopia-php/websocket": "0.1.*",
|
||||
"utopia-php/transfer": "dev-feat-database-and-documents",
|
||||
"resque/php-resque": "1.3.6",
|
||||
"matomo/device-detector": "6.0.0",
|
||||
"dragonmantank/cron-expression": "3.3.1",
|
||||
@@ -70,12 +71,17 @@
|
||||
"chillerlan/php-qrcode": "4.3.3",
|
||||
"adhocore/jwt": "1.1.2",
|
||||
"slickdeals/statsd": "3.1.0",
|
||||
"webonyx/graphql-php": "14.11.*"
|
||||
"webonyx/graphql-php": "14.11.*",
|
||||
"psr/cache": "^1.0||^2.0"
|
||||
},
|
||||
"repositories": [
|
||||
{
|
||||
"url": "https://github.com/appwrite/runtimes.git",
|
||||
"type": "git"
|
||||
},
|
||||
{
|
||||
"url": "https://github.com/utopia-php/transfer.git",
|
||||
"type": "vcs"
|
||||
}
|
||||
],
|
||||
"require-dev": {
|
||||
@@ -94,4 +100,4 @@
|
||||
"php": "8.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Generated
+153
-3
@@ -4,7 +4,7 @@
|
||||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
||||
"This file is @generated automatically"
|
||||
],
|
||||
"content-hash": "ac80cafdd8c2c6deaec3dfe628084655",
|
||||
"content-hash": "f21d616c3ccd0256ce537cba5711749c",
|
||||
"packages": [
|
||||
{
|
||||
"name": "adhocore/jwt",
|
||||
@@ -63,6 +63,47 @@
|
||||
],
|
||||
"time": "2021-02-20T09:56:44+00:00"
|
||||
},
|
||||
{
|
||||
"name": "appwrite/appwrite",
|
||||
"version": "7.2.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/appwrite/sdk-for-php.git",
|
||||
"reference": "8940689d040153f397371a367926e4e97e257f41"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/appwrite/sdk-for-php/zipball/8940689d040153f397371a367926e4e97e257f41",
|
||||
"reference": "8940689d040153f397371a367926e4e97e257f41",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"ext-curl": "*",
|
||||
"ext-json": "*",
|
||||
"php": ">=7.1.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "3.7.35"
|
||||
},
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Appwrite\\": "src/Appwrite"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"BSD-3-Clause"
|
||||
],
|
||||
"description": "Appwrite is an open-source self-hosted backend server that abstract and simplify complex and repetitive development tasks behind a very simple REST API",
|
||||
"support": {
|
||||
"email": "team@appwrite.io",
|
||||
"issues": "https://github.com/appwrite/sdk-for-php/issues",
|
||||
"source": "https://github.com/appwrite/sdk-for-php/tree/7.2.0",
|
||||
"url": "https://appwrite.io/support"
|
||||
},
|
||||
"time": "2022-12-27T22:34:08+00:00"
|
||||
},
|
||||
{
|
||||
"name": "appwrite/php-clamav",
|
||||
"version": "1.1.0",
|
||||
@@ -1263,6 +1304,55 @@
|
||||
],
|
||||
"time": "2022-02-28T15:31:21+00:00"
|
||||
},
|
||||
{
|
||||
"name": "psr/cache",
|
||||
"version": "2.0.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/php-fig/cache.git",
|
||||
"reference": "213f9dbc5b9bfbc4f8db86d2838dc968752ce13b"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/php-fig/cache/zipball/213f9dbc5b9bfbc4f8db86d2838dc968752ce13b",
|
||||
"reference": "213f9dbc5b9bfbc4f8db86d2838dc968752ce13b",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=8.0.0"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "1.0.x-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Psr\\Cache\\": "src/"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "PHP-FIG",
|
||||
"homepage": "https://www.php-fig.org/"
|
||||
}
|
||||
],
|
||||
"description": "Common interface for caching libraries",
|
||||
"keywords": [
|
||||
"cache",
|
||||
"psr",
|
||||
"psr-6"
|
||||
],
|
||||
"support": {
|
||||
"source": "https://github.com/php-fig/cache/tree/2.0.0"
|
||||
},
|
||||
"time": "2021-02-03T23:23:37+00:00"
|
||||
},
|
||||
{
|
||||
"name": "psr/http-client",
|
||||
"version": "1.0.1",
|
||||
@@ -2852,6 +2942,64 @@
|
||||
},
|
||||
"time": "2022-11-07T13:51:59+00:00"
|
||||
},
|
||||
{
|
||||
"name": "utopia-php/transfer",
|
||||
"version": "dev-feat-database-and-documents",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/utopia-php/transfer.git",
|
||||
"reference": "a33d9e16e561885e884d1ed21982e41942b33fee"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/utopia-php/transfer/zipball/a33d9e16e561885e884d1ed21982e41942b33fee",
|
||||
"reference": "a33d9e16e561885e884d1ed21982e41942b33fee",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"appwrite/appwrite": "^7.2",
|
||||
"php": ">=8.0",
|
||||
"utopia-php/cli": "^0.13.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "^9.3",
|
||||
"squizlabs/php_codesniffer": "^3.6",
|
||||
"vimeo/psalm": "^5.6",
|
||||
"vlucas/phpdotenv": "^5.5"
|
||||
},
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Utopia\\Transfer\\": "src/Transfer"
|
||||
}
|
||||
},
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Eldad Fux",
|
||||
"email": "eldad@appwrite.io"
|
||||
},
|
||||
{
|
||||
"name": "Bradley Schofield",
|
||||
"email": "bradley@appwrite.io"
|
||||
}
|
||||
],
|
||||
"description": "A simple library to transfer resources between services.",
|
||||
"keywords": [
|
||||
"framework",
|
||||
"php",
|
||||
"transfer",
|
||||
"upf",
|
||||
"utopia"
|
||||
],
|
||||
"support": {
|
||||
"source": "https://github.com/utopia-php/transfer/tree/feat-database-and-documents",
|
||||
"issues": "https://github.com/utopia-php/transfer/issues"
|
||||
},
|
||||
"time": "2023-02-17T13:39:23+00:00"
|
||||
},
|
||||
{
|
||||
"name": "utopia-php/websocket",
|
||||
"version": "0.1.0",
|
||||
@@ -5566,7 +5714,9 @@
|
||||
],
|
||||
"aliases": [],
|
||||
"minimum-stability": "stable",
|
||||
"stability-flags": [],
|
||||
"stability-flags": {
|
||||
"utopia-php/transfer": 20
|
||||
},
|
||||
"prefer-stable": false,
|
||||
"prefer-lowest": false,
|
||||
"platform": {
|
||||
@@ -5590,5 +5740,5 @@
|
||||
"platform-overrides": {
|
||||
"php": "8.0"
|
||||
},
|
||||
"plugin-api-version": "2.3.0"
|
||||
"plugin-api-version": "2.1.0"
|
||||
}
|
||||
|
||||
@@ -574,6 +574,31 @@ services:
|
||||
- _APP_LOGGING_PROVIDER
|
||||
- _APP_LOGGING_CONFIG
|
||||
|
||||
appwrite-worker-transfers:
|
||||
entrypoint: worker-transfers
|
||||
<<: *x-logging
|
||||
container_name: appwrite-worker-transfers
|
||||
restart: unless-stopped
|
||||
image: appwrite-dev
|
||||
networks:
|
||||
- appwrite
|
||||
volumes:
|
||||
- ./app:/usr/src/code/app
|
||||
- ./src:/usr/src/code/src
|
||||
- ./vendor:/usr/src/code/vendor
|
||||
depends_on:
|
||||
- redis
|
||||
environment:
|
||||
- _APP_ENV
|
||||
- _APP_REDIS_HOST
|
||||
- _APP_REDIS_PORT
|
||||
- _APP_REDIS_USER
|
||||
- _APP_REDIS_PASS
|
||||
- _APP_SMS_PROVIDER
|
||||
- _APP_SMS_FROM
|
||||
- _APP_LOGGING_PROVIDER
|
||||
- _APP_LOGGING_CONFIG
|
||||
|
||||
appwrite-maintenance:
|
||||
entrypoint: maintenance
|
||||
<<: *x-logging
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
appwrite transfers createAppwriteDestination \
|
||||
--projectId [PROJECT_ID] \
|
||||
--endpoint https://example.com \
|
||||
--key [KEY] \
|
||||
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
appwrite transfers createAppwriteSource \
|
||||
--projectId [PROJECT_ID] \
|
||||
--endpoint https://example.com \
|
||||
--key [KEY] \
|
||||
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
appwrite transfers createFirebaseSource \
|
||||
--serviceAccount '{ "key": "value" }' \
|
||||
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
appwrite transfers createNhostSource \
|
||||
--host [HOST] \
|
||||
--password [PASSWORD] \
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
appwrite transfers createSupabaseSource \
|
||||
--host [HOST] \
|
||||
--password [PASSWORD] \
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
appwrite transfers create \
|
||||
--transferId [TRANSFER_ID] \
|
||||
--source [SOURCE] \
|
||||
--destination [DESTINATION] \
|
||||
--resources one two three
|
||||
@@ -0,0 +1,2 @@
|
||||
appwrite transfers getDestination \
|
||||
--destinationId [DESTINATION_ID]
|
||||
@@ -0,0 +1,2 @@
|
||||
appwrite transfers getSource \
|
||||
--sourceId [SOURCE_ID]
|
||||
@@ -0,0 +1,3 @@
|
||||
appwrite transfers listDestinations \
|
||||
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
appwrite transfers listSources \
|
||||
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
appwrite transfers list \
|
||||
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
import { Client, Transfers } from "appwrite";
|
||||
|
||||
const client = new Client();
|
||||
|
||||
const transfers = new Transfers(client);
|
||||
|
||||
client
|
||||
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
|
||||
.setProject('5df5acd0d48c2') // Your project ID
|
||||
;
|
||||
|
||||
const promise = transfers.createAppwriteDestination('[PROJECT_ID]', 'https://example.com', '[KEY]');
|
||||
|
||||
promise.then(function (response) {
|
||||
console.log(response); // Success
|
||||
}, function (error) {
|
||||
console.log(error); // Failure
|
||||
});
|
||||
@@ -0,0 +1,18 @@
|
||||
import { Client, Transfers } from "appwrite";
|
||||
|
||||
const client = new Client();
|
||||
|
||||
const transfers = new Transfers(client);
|
||||
|
||||
client
|
||||
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
|
||||
.setProject('5df5acd0d48c2') // Your project ID
|
||||
;
|
||||
|
||||
const promise = transfers.createAppwriteSource('[PROJECT_ID]', 'https://example.com', '[KEY]');
|
||||
|
||||
promise.then(function (response) {
|
||||
console.log(response); // Success
|
||||
}, function (error) {
|
||||
console.log(error); // Failure
|
||||
});
|
||||
@@ -0,0 +1,18 @@
|
||||
import { Client, Transfers } from "appwrite";
|
||||
|
||||
const client = new Client();
|
||||
|
||||
const transfers = new Transfers(client);
|
||||
|
||||
client
|
||||
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
|
||||
.setProject('5df5acd0d48c2') // Your project ID
|
||||
;
|
||||
|
||||
const promise = transfers.createFirebaseSource({});
|
||||
|
||||
promise.then(function (response) {
|
||||
console.log(response); // Success
|
||||
}, function (error) {
|
||||
console.log(error); // Failure
|
||||
});
|
||||
@@ -0,0 +1,18 @@
|
||||
import { Client, Transfers } from "appwrite";
|
||||
|
||||
const client = new Client();
|
||||
|
||||
const transfers = new Transfers(client);
|
||||
|
||||
client
|
||||
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
|
||||
.setProject('5df5acd0d48c2') // Your project ID
|
||||
;
|
||||
|
||||
const promise = transfers.createNhostSource('[HOST]', '[PASSWORD]');
|
||||
|
||||
promise.then(function (response) {
|
||||
console.log(response); // Success
|
||||
}, function (error) {
|
||||
console.log(error); // Failure
|
||||
});
|
||||
@@ -0,0 +1,18 @@
|
||||
import { Client, Transfers } from "appwrite";
|
||||
|
||||
const client = new Client();
|
||||
|
||||
const transfers = new Transfers(client);
|
||||
|
||||
client
|
||||
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
|
||||
.setProject('5df5acd0d48c2') // Your project ID
|
||||
;
|
||||
|
||||
const promise = transfers.createSupabaseSource('[HOST]', '[PASSWORD]');
|
||||
|
||||
promise.then(function (response) {
|
||||
console.log(response); // Success
|
||||
}, function (error) {
|
||||
console.log(error); // Failure
|
||||
});
|
||||
@@ -0,0 +1,18 @@
|
||||
import { Client, Transfers } from "appwrite";
|
||||
|
||||
const client = new Client();
|
||||
|
||||
const transfers = new Transfers(client);
|
||||
|
||||
client
|
||||
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
|
||||
.setProject('5df5acd0d48c2') // Your project ID
|
||||
;
|
||||
|
||||
const promise = transfers.create('[TRANSFER_ID]', '[SOURCE]', '[DESTINATION]', []);
|
||||
|
||||
promise.then(function (response) {
|
||||
console.log(response); // Success
|
||||
}, function (error) {
|
||||
console.log(error); // Failure
|
||||
});
|
||||
@@ -0,0 +1,18 @@
|
||||
import { Client, Transfers } from "appwrite";
|
||||
|
||||
const client = new Client();
|
||||
|
||||
const transfers = new Transfers(client);
|
||||
|
||||
client
|
||||
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
|
||||
.setProject('5df5acd0d48c2') // Your project ID
|
||||
;
|
||||
|
||||
const promise = transfers.getDestination('[DESTINATION_ID]');
|
||||
|
||||
promise.then(function (response) {
|
||||
console.log(response); // Success
|
||||
}, function (error) {
|
||||
console.log(error); // Failure
|
||||
});
|
||||
@@ -0,0 +1,18 @@
|
||||
import { Client, Transfers } from "appwrite";
|
||||
|
||||
const client = new Client();
|
||||
|
||||
const transfers = new Transfers(client);
|
||||
|
||||
client
|
||||
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
|
||||
.setProject('5df5acd0d48c2') // Your project ID
|
||||
;
|
||||
|
||||
const promise = transfers.getSource('[SOURCE_ID]');
|
||||
|
||||
promise.then(function (response) {
|
||||
console.log(response); // Success
|
||||
}, function (error) {
|
||||
console.log(error); // Failure
|
||||
});
|
||||
@@ -0,0 +1,18 @@
|
||||
import { Client, Transfers } from "appwrite";
|
||||
|
||||
const client = new Client();
|
||||
|
||||
const transfers = new Transfers(client);
|
||||
|
||||
client
|
||||
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
|
||||
.setProject('5df5acd0d48c2') // Your project ID
|
||||
;
|
||||
|
||||
const promise = transfers.listDestinations();
|
||||
|
||||
promise.then(function (response) {
|
||||
console.log(response); // Success
|
||||
}, function (error) {
|
||||
console.log(error); // Failure
|
||||
});
|
||||
@@ -0,0 +1,18 @@
|
||||
import { Client, Transfers } from "appwrite";
|
||||
|
||||
const client = new Client();
|
||||
|
||||
const transfers = new Transfers(client);
|
||||
|
||||
client
|
||||
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
|
||||
.setProject('5df5acd0d48c2') // Your project ID
|
||||
;
|
||||
|
||||
const promise = transfers.listSources();
|
||||
|
||||
promise.then(function (response) {
|
||||
console.log(response); // Success
|
||||
}, function (error) {
|
||||
console.log(error); // Failure
|
||||
});
|
||||
@@ -0,0 +1,18 @@
|
||||
import { Client, Transfers } from "appwrite";
|
||||
|
||||
const client = new Client();
|
||||
|
||||
const transfers = new Transfers(client);
|
||||
|
||||
client
|
||||
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
|
||||
.setProject('5df5acd0d48c2') // Your project ID
|
||||
;
|
||||
|
||||
const promise = transfers.list();
|
||||
|
||||
promise.then(function (response) {
|
||||
console.log(response); // Success
|
||||
}, function (error) {
|
||||
console.log(error); // Failure
|
||||
});
|
||||
@@ -0,0 +1,25 @@
|
||||
import 'package:dart_appwrite/dart_appwrite.dart';
|
||||
|
||||
void main() { // Init SDK
|
||||
Client client = Client();
|
||||
Transfers transfers = Transfers(client);
|
||||
|
||||
client
|
||||
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
|
||||
.setProject('5df5acd0d48c2') // Your project ID
|
||||
.setKey('919c2d18fb5d4...a2ae413da83346ad2') // Your secret API key
|
||||
;
|
||||
|
||||
Future result = transfers.createAppwriteDestination(
|
||||
projectId: '[PROJECT_ID]',
|
||||
endpoint: 'https://example.com',
|
||||
key: '[KEY]',
|
||||
);
|
||||
|
||||
result
|
||||
.then((response) {
|
||||
print(response);
|
||||
}).catchError((error) {
|
||||
print(error.response);
|
||||
});
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
import 'package:dart_appwrite/dart_appwrite.dart';
|
||||
|
||||
void main() { // Init SDK
|
||||
Client client = Client();
|
||||
Transfers transfers = Transfers(client);
|
||||
|
||||
client
|
||||
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
|
||||
.setProject('5df5acd0d48c2') // Your project ID
|
||||
.setKey('919c2d18fb5d4...a2ae413da83346ad2') // Your secret API key
|
||||
;
|
||||
|
||||
Future result = transfers.createAppwriteSource(
|
||||
projectId: '[PROJECT_ID]',
|
||||
endpoint: 'https://example.com',
|
||||
key: '[KEY]',
|
||||
);
|
||||
|
||||
result
|
||||
.then((response) {
|
||||
print(response);
|
||||
}).catchError((error) {
|
||||
print(error.response);
|
||||
});
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
import 'package:dart_appwrite/dart_appwrite.dart';
|
||||
|
||||
void main() { // Init SDK
|
||||
Client client = Client();
|
||||
Transfers transfers = Transfers(client);
|
||||
|
||||
client
|
||||
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
|
||||
.setProject('5df5acd0d48c2') // Your project ID
|
||||
.setKey('919c2d18fb5d4...a2ae413da83346ad2') // Your secret API key
|
||||
;
|
||||
|
||||
Future result = transfers.createFirebaseSource(
|
||||
serviceAccount: {},
|
||||
);
|
||||
|
||||
result
|
||||
.then((response) {
|
||||
print(response);
|
||||
}).catchError((error) {
|
||||
print(error.response);
|
||||
});
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
import 'package:dart_appwrite/dart_appwrite.dart';
|
||||
|
||||
void main() { // Init SDK
|
||||
Client client = Client();
|
||||
Transfers transfers = Transfers(client);
|
||||
|
||||
client
|
||||
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
|
||||
.setProject('5df5acd0d48c2') // Your project ID
|
||||
.setKey('919c2d18fb5d4...a2ae413da83346ad2') // Your secret API key
|
||||
;
|
||||
|
||||
Future result = transfers.createNhostSource(
|
||||
host: '[HOST]',
|
||||
password: '[PASSWORD]',
|
||||
);
|
||||
|
||||
result
|
||||
.then((response) {
|
||||
print(response);
|
||||
}).catchError((error) {
|
||||
print(error.response);
|
||||
});
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
import 'package:dart_appwrite/dart_appwrite.dart';
|
||||
|
||||
void main() { // Init SDK
|
||||
Client client = Client();
|
||||
Transfers transfers = Transfers(client);
|
||||
|
||||
client
|
||||
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
|
||||
.setProject('5df5acd0d48c2') // Your project ID
|
||||
.setKey('919c2d18fb5d4...a2ae413da83346ad2') // Your secret API key
|
||||
;
|
||||
|
||||
Future result = transfers.createSupabaseSource(
|
||||
host: '[HOST]',
|
||||
password: '[PASSWORD]',
|
||||
);
|
||||
|
||||
result
|
||||
.then((response) {
|
||||
print(response);
|
||||
}).catchError((error) {
|
||||
print(error.response);
|
||||
});
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
import 'package:dart_appwrite/dart_appwrite.dart';
|
||||
|
||||
void main() { // Init SDK
|
||||
Client client = Client();
|
||||
Transfers transfers = Transfers(client);
|
||||
|
||||
client
|
||||
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
|
||||
.setProject('5df5acd0d48c2') // Your project ID
|
||||
.setKey('919c2d18fb5d4...a2ae413da83346ad2') // Your secret API key
|
||||
;
|
||||
|
||||
Future result = transfers.create(
|
||||
source: '[SOURCE]',
|
||||
destination: '[DESTINATION]',
|
||||
resources: [],
|
||||
);
|
||||
|
||||
result
|
||||
.then((response) {
|
||||
print(response);
|
||||
}).catchError((error) {
|
||||
print(error.response);
|
||||
});
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
import 'package:dart_appwrite/dart_appwrite.dart';
|
||||
|
||||
void main() { // Init SDK
|
||||
Client client = Client();
|
||||
Transfers transfers = Transfers(client);
|
||||
|
||||
client
|
||||
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
|
||||
.setProject('5df5acd0d48c2') // Your project ID
|
||||
.setKey('919c2d18fb5d4...a2ae413da83346ad2') // Your secret API key
|
||||
;
|
||||
|
||||
Future result = transfers.getDestination(
|
||||
destinationId: '[DESTINATION_ID]',
|
||||
);
|
||||
|
||||
result
|
||||
.then((response) {
|
||||
print(response);
|
||||
}).catchError((error) {
|
||||
print(error.response);
|
||||
});
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
import 'package:dart_appwrite/dart_appwrite.dart';
|
||||
|
||||
void main() { // Init SDK
|
||||
Client client = Client();
|
||||
Transfers transfers = Transfers(client);
|
||||
|
||||
client
|
||||
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
|
||||
.setProject('5df5acd0d48c2') // Your project ID
|
||||
.setKey('919c2d18fb5d4...a2ae413da83346ad2') // Your secret API key
|
||||
;
|
||||
|
||||
Future result = transfers.getSource(
|
||||
sourceId: '[SOURCE_ID]',
|
||||
);
|
||||
|
||||
result
|
||||
.then((response) {
|
||||
print(response);
|
||||
}).catchError((error) {
|
||||
print(error.response);
|
||||
});
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
import 'package:dart_appwrite/dart_appwrite.dart';
|
||||
|
||||
void main() { // Init SDK
|
||||
Client client = Client();
|
||||
Transfers transfers = Transfers(client);
|
||||
|
||||
client
|
||||
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
|
||||
.setProject('5df5acd0d48c2') // Your project ID
|
||||
.setKey('919c2d18fb5d4...a2ae413da83346ad2') // Your secret API key
|
||||
;
|
||||
|
||||
Future result = transfers.listDestinations(
|
||||
);
|
||||
|
||||
result
|
||||
.then((response) {
|
||||
print(response);
|
||||
}).catchError((error) {
|
||||
print(error.response);
|
||||
});
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
import 'package:dart_appwrite/dart_appwrite.dart';
|
||||
|
||||
void main() { // Init SDK
|
||||
Client client = Client();
|
||||
Transfers transfers = Transfers(client);
|
||||
|
||||
client
|
||||
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
|
||||
.setProject('5df5acd0d48c2') // Your project ID
|
||||
.setKey('919c2d18fb5d4...a2ae413da83346ad2') // Your secret API key
|
||||
;
|
||||
|
||||
Future result = transfers.listSources(
|
||||
);
|
||||
|
||||
result
|
||||
.then((response) {
|
||||
print(response);
|
||||
}).catchError((error) {
|
||||
print(error.response);
|
||||
});
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
import 'package:dart_appwrite/dart_appwrite.dart';
|
||||
|
||||
void main() { // Init SDK
|
||||
Client client = Client();
|
||||
Transfers transfers = Transfers(client);
|
||||
|
||||
client
|
||||
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
|
||||
.setProject('5df5acd0d48c2') // Your project ID
|
||||
.setKey('919c2d18fb5d4...a2ae413da83346ad2') // Your secret API key
|
||||
;
|
||||
|
||||
Future result = transfers.list(
|
||||
);
|
||||
|
||||
result
|
||||
.then((response) {
|
||||
print(response);
|
||||
}).catchError((error) {
|
||||
print(error.response);
|
||||
});
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
import * as sdk from "https://deno.land/x/appwrite/mod.ts";
|
||||
|
||||
// Init SDK
|
||||
let client = new sdk.Client();
|
||||
|
||||
let transfers = new sdk.Transfers(client);
|
||||
|
||||
client
|
||||
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
|
||||
.setProject('5df5acd0d48c2') // Your project ID
|
||||
.setKey('919c2d18fb5d4...a2ae413da83346ad2') // Your secret API key
|
||||
;
|
||||
|
||||
|
||||
let promise = transfers.createAppwriteDestination('[PROJECT_ID]', 'https://example.com', '[KEY]');
|
||||
|
||||
promise.then(function (response) {
|
||||
console.log(response);
|
||||
}, function (error) {
|
||||
console.log(error);
|
||||
});
|
||||
@@ -0,0 +1,21 @@
|
||||
import * as sdk from "https://deno.land/x/appwrite/mod.ts";
|
||||
|
||||
// Init SDK
|
||||
let client = new sdk.Client();
|
||||
|
||||
let transfers = new sdk.Transfers(client);
|
||||
|
||||
client
|
||||
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
|
||||
.setProject('5df5acd0d48c2') // Your project ID
|
||||
.setKey('919c2d18fb5d4...a2ae413da83346ad2') // Your secret API key
|
||||
;
|
||||
|
||||
|
||||
let promise = transfers.createAppwriteSource('[PROJECT_ID]', 'https://example.com', '[KEY]');
|
||||
|
||||
promise.then(function (response) {
|
||||
console.log(response);
|
||||
}, function (error) {
|
||||
console.log(error);
|
||||
});
|
||||
@@ -0,0 +1,21 @@
|
||||
import * as sdk from "https://deno.land/x/appwrite/mod.ts";
|
||||
|
||||
// Init SDK
|
||||
let client = new sdk.Client();
|
||||
|
||||
let transfers = new sdk.Transfers(client);
|
||||
|
||||
client
|
||||
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
|
||||
.setProject('5df5acd0d48c2') // Your project ID
|
||||
.setKey('919c2d18fb5d4...a2ae413da83346ad2') // Your secret API key
|
||||
;
|
||||
|
||||
|
||||
let promise = transfers.createFirebaseSource({});
|
||||
|
||||
promise.then(function (response) {
|
||||
console.log(response);
|
||||
}, function (error) {
|
||||
console.log(error);
|
||||
});
|
||||
@@ -0,0 +1,21 @@
|
||||
import * as sdk from "https://deno.land/x/appwrite/mod.ts";
|
||||
|
||||
// Init SDK
|
||||
let client = new sdk.Client();
|
||||
|
||||
let transfers = new sdk.Transfers(client);
|
||||
|
||||
client
|
||||
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
|
||||
.setProject('5df5acd0d48c2') // Your project ID
|
||||
.setKey('919c2d18fb5d4...a2ae413da83346ad2') // Your secret API key
|
||||
;
|
||||
|
||||
|
||||
let promise = transfers.createNhostSource('[HOST]', '[PASSWORD]');
|
||||
|
||||
promise.then(function (response) {
|
||||
console.log(response);
|
||||
}, function (error) {
|
||||
console.log(error);
|
||||
});
|
||||
@@ -0,0 +1,21 @@
|
||||
import * as sdk from "https://deno.land/x/appwrite/mod.ts";
|
||||
|
||||
// Init SDK
|
||||
let client = new sdk.Client();
|
||||
|
||||
let transfers = new sdk.Transfers(client);
|
||||
|
||||
client
|
||||
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
|
||||
.setProject('5df5acd0d48c2') // Your project ID
|
||||
.setKey('919c2d18fb5d4...a2ae413da83346ad2') // Your secret API key
|
||||
;
|
||||
|
||||
|
||||
let promise = transfers.createSupabaseSource('[HOST]', '[PASSWORD]');
|
||||
|
||||
promise.then(function (response) {
|
||||
console.log(response);
|
||||
}, function (error) {
|
||||
console.log(error);
|
||||
});
|
||||
@@ -0,0 +1,21 @@
|
||||
import * as sdk from "https://deno.land/x/appwrite/mod.ts";
|
||||
|
||||
// Init SDK
|
||||
let client = new sdk.Client();
|
||||
|
||||
let transfers = new sdk.Transfers(client);
|
||||
|
||||
client
|
||||
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
|
||||
.setProject('5df5acd0d48c2') // Your project ID
|
||||
.setKey('919c2d18fb5d4...a2ae413da83346ad2') // Your secret API key
|
||||
;
|
||||
|
||||
|
||||
let promise = transfers.create('[SOURCE]', '[DESTINATION]', []);
|
||||
|
||||
promise.then(function (response) {
|
||||
console.log(response);
|
||||
}, function (error) {
|
||||
console.log(error);
|
||||
});
|
||||
@@ -0,0 +1,21 @@
|
||||
import * as sdk from "https://deno.land/x/appwrite/mod.ts";
|
||||
|
||||
// Init SDK
|
||||
let client = new sdk.Client();
|
||||
|
||||
let transfers = new sdk.Transfers(client);
|
||||
|
||||
client
|
||||
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
|
||||
.setProject('5df5acd0d48c2') // Your project ID
|
||||
.setKey('919c2d18fb5d4...a2ae413da83346ad2') // Your secret API key
|
||||
;
|
||||
|
||||
|
||||
let promise = transfers.getDestination('[DESTINATION_ID]');
|
||||
|
||||
promise.then(function (response) {
|
||||
console.log(response);
|
||||
}, function (error) {
|
||||
console.log(error);
|
||||
});
|
||||
@@ -0,0 +1,21 @@
|
||||
import * as sdk from "https://deno.land/x/appwrite/mod.ts";
|
||||
|
||||
// Init SDK
|
||||
let client = new sdk.Client();
|
||||
|
||||
let transfers = new sdk.Transfers(client);
|
||||
|
||||
client
|
||||
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
|
||||
.setProject('5df5acd0d48c2') // Your project ID
|
||||
.setKey('919c2d18fb5d4...a2ae413da83346ad2') // Your secret API key
|
||||
;
|
||||
|
||||
|
||||
let promise = transfers.getSource('[SOURCE_ID]');
|
||||
|
||||
promise.then(function (response) {
|
||||
console.log(response);
|
||||
}, function (error) {
|
||||
console.log(error);
|
||||
});
|
||||
@@ -0,0 +1,21 @@
|
||||
import * as sdk from "https://deno.land/x/appwrite/mod.ts";
|
||||
|
||||
// Init SDK
|
||||
let client = new sdk.Client();
|
||||
|
||||
let transfers = new sdk.Transfers(client);
|
||||
|
||||
client
|
||||
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
|
||||
.setProject('5df5acd0d48c2') // Your project ID
|
||||
.setKey('919c2d18fb5d4...a2ae413da83346ad2') // Your secret API key
|
||||
;
|
||||
|
||||
|
||||
let promise = transfers.listDestinations();
|
||||
|
||||
promise.then(function (response) {
|
||||
console.log(response);
|
||||
}, function (error) {
|
||||
console.log(error);
|
||||
});
|
||||
@@ -0,0 +1,21 @@
|
||||
import * as sdk from "https://deno.land/x/appwrite/mod.ts";
|
||||
|
||||
// Init SDK
|
||||
let client = new sdk.Client();
|
||||
|
||||
let transfers = new sdk.Transfers(client);
|
||||
|
||||
client
|
||||
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
|
||||
.setProject('5df5acd0d48c2') // Your project ID
|
||||
.setKey('919c2d18fb5d4...a2ae413da83346ad2') // Your secret API key
|
||||
;
|
||||
|
||||
|
||||
let promise = transfers.listSources();
|
||||
|
||||
promise.then(function (response) {
|
||||
console.log(response);
|
||||
}, function (error) {
|
||||
console.log(error);
|
||||
});
|
||||
@@ -0,0 +1,21 @@
|
||||
import * as sdk from "https://deno.land/x/appwrite/mod.ts";
|
||||
|
||||
// Init SDK
|
||||
let client = new sdk.Client();
|
||||
|
||||
let transfers = new sdk.Transfers(client);
|
||||
|
||||
client
|
||||
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
|
||||
.setProject('5df5acd0d48c2') // Your project ID
|
||||
.setKey('919c2d18fb5d4...a2ae413da83346ad2') // Your secret API key
|
||||
;
|
||||
|
||||
|
||||
let promise = transfers.list();
|
||||
|
||||
promise.then(function (response) {
|
||||
console.log(response);
|
||||
}, function (error) {
|
||||
console.log(error);
|
||||
});
|
||||
@@ -0,0 +1,13 @@
|
||||
mutation {
|
||||
transfersCreateAppwriteDestination(
|
||||
projectId: "[PROJECT_ID]",
|
||||
endpoint: "https://example.com",
|
||||
key: "[KEY]"
|
||||
) {
|
||||
_id
|
||||
_createdAt
|
||||
_updatedAt
|
||||
type
|
||||
name
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
mutation {
|
||||
transfersCreateAppwriteSource(
|
||||
projectId: "[PROJECT_ID]",
|
||||
endpoint: "https://example.com",
|
||||
key: "[KEY]"
|
||||
) {
|
||||
_id
|
||||
_createdAt
|
||||
_updatedAt
|
||||
type
|
||||
name
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
mutation {
|
||||
transfersCreateFirebaseSource(
|
||||
serviceAccount: "{}"
|
||||
) {
|
||||
_id
|
||||
_createdAt
|
||||
_updatedAt
|
||||
type
|
||||
name
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
mutation {
|
||||
transfersCreateNhostSource(
|
||||
host: "[HOST]",
|
||||
password: "[PASSWORD]"
|
||||
) {
|
||||
_id
|
||||
_createdAt
|
||||
_updatedAt
|
||||
type
|
||||
name
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
mutation {
|
||||
transfersCreateSupabaseSource(
|
||||
host: "[HOST]",
|
||||
password: "[PASSWORD]"
|
||||
) {
|
||||
_id
|
||||
_createdAt
|
||||
_updatedAt
|
||||
type
|
||||
name
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
mutation {
|
||||
transfersCreate(
|
||||
source: "[SOURCE]",
|
||||
destination: "[DESTINATION]",
|
||||
resources: []
|
||||
) {
|
||||
_id
|
||||
_createdAt
|
||||
_updatedAt
|
||||
status
|
||||
stage
|
||||
source
|
||||
destination
|
||||
resources
|
||||
progress
|
||||
latestUpdate
|
||||
errorData
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
query {
|
||||
transfersGetDestination(
|
||||
destinationId: "[DESTINATION_ID]"
|
||||
) {
|
||||
_id
|
||||
_createdAt
|
||||
_updatedAt
|
||||
type
|
||||
name
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
query {
|
||||
transfersGetSource(
|
||||
sourceId: "[SOURCE_ID]"
|
||||
) {
|
||||
_id
|
||||
_createdAt
|
||||
_updatedAt
|
||||
type
|
||||
name
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
query {
|
||||
transfersListDestinations {
|
||||
total
|
||||
locations {
|
||||
_id
|
||||
_createdAt
|
||||
_updatedAt
|
||||
type
|
||||
name
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
query {
|
||||
transfersListSources {
|
||||
total
|
||||
locations {
|
||||
_id
|
||||
_createdAt
|
||||
_updatedAt
|
||||
type
|
||||
name
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
query {
|
||||
transfersList {
|
||||
total
|
||||
transfers {
|
||||
_id
|
||||
_createdAt
|
||||
_updatedAt
|
||||
status
|
||||
stage
|
||||
source
|
||||
destination
|
||||
resources
|
||||
progress
|
||||
latestUpdate
|
||||
errorData
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
import io.appwrite.Client;
|
||||
import io.appwrite.coroutines.CoroutineCallback;
|
||||
import io.appwrite.services.Transfers;
|
||||
|
||||
Client client = new Client()
|
||||
.setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint
|
||||
.setProject("5df5acd0d48c2") // Your project ID
|
||||
.setKey("919c2d18fb5d4...a2ae413da83346ad2"); // Your secret API key
|
||||
|
||||
Transfers transfers = new Transfers(client);
|
||||
|
||||
transfers.createAppwriteDestination(
|
||||
"[PROJECT_ID]",
|
||||
"https://example.com",
|
||||
"[KEY]",
|
||||
new CoroutineCallback<>((result, error) -> {
|
||||
if (error != null) {
|
||||
error.printStackTrace();
|
||||
return;
|
||||
}
|
||||
|
||||
System.out.println(result);
|
||||
})
|
||||
);
|
||||
@@ -0,0 +1,24 @@
|
||||
import io.appwrite.Client;
|
||||
import io.appwrite.coroutines.CoroutineCallback;
|
||||
import io.appwrite.services.Transfers;
|
||||
|
||||
Client client = new Client()
|
||||
.setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint
|
||||
.setProject("5df5acd0d48c2") // Your project ID
|
||||
.setKey("919c2d18fb5d4...a2ae413da83346ad2"); // Your secret API key
|
||||
|
||||
Transfers transfers = new Transfers(client);
|
||||
|
||||
transfers.createAppwriteSource(
|
||||
"[PROJECT_ID]",
|
||||
"https://example.com",
|
||||
"[KEY]",
|
||||
new CoroutineCallback<>((result, error) -> {
|
||||
if (error != null) {
|
||||
error.printStackTrace();
|
||||
return;
|
||||
}
|
||||
|
||||
System.out.println(result);
|
||||
})
|
||||
);
|
||||
@@ -0,0 +1,22 @@
|
||||
import io.appwrite.Client;
|
||||
import io.appwrite.coroutines.CoroutineCallback;
|
||||
import io.appwrite.services.Transfers;
|
||||
|
||||
Client client = new Client()
|
||||
.setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint
|
||||
.setProject("5df5acd0d48c2") // Your project ID
|
||||
.setKey("919c2d18fb5d4...a2ae413da83346ad2"); // Your secret API key
|
||||
|
||||
Transfers transfers = new Transfers(client);
|
||||
|
||||
transfers.createFirebaseSource(
|
||||
mapOf( "a" to "b" ),
|
||||
new CoroutineCallback<>((result, error) -> {
|
||||
if (error != null) {
|
||||
error.printStackTrace();
|
||||
return;
|
||||
}
|
||||
|
||||
System.out.println(result);
|
||||
})
|
||||
);
|
||||
@@ -0,0 +1,23 @@
|
||||
import io.appwrite.Client;
|
||||
import io.appwrite.coroutines.CoroutineCallback;
|
||||
import io.appwrite.services.Transfers;
|
||||
|
||||
Client client = new Client()
|
||||
.setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint
|
||||
.setProject("5df5acd0d48c2") // Your project ID
|
||||
.setKey("919c2d18fb5d4...a2ae413da83346ad2"); // Your secret API key
|
||||
|
||||
Transfers transfers = new Transfers(client);
|
||||
|
||||
transfers.createNhostSource(
|
||||
"[HOST]",
|
||||
"[PASSWORD]",
|
||||
new CoroutineCallback<>((result, error) -> {
|
||||
if (error != null) {
|
||||
error.printStackTrace();
|
||||
return;
|
||||
}
|
||||
|
||||
System.out.println(result);
|
||||
})
|
||||
);
|
||||
@@ -0,0 +1,23 @@
|
||||
import io.appwrite.Client;
|
||||
import io.appwrite.coroutines.CoroutineCallback;
|
||||
import io.appwrite.services.Transfers;
|
||||
|
||||
Client client = new Client()
|
||||
.setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint
|
||||
.setProject("5df5acd0d48c2") // Your project ID
|
||||
.setKey("919c2d18fb5d4...a2ae413da83346ad2"); // Your secret API key
|
||||
|
||||
Transfers transfers = new Transfers(client);
|
||||
|
||||
transfers.createSupabaseSource(
|
||||
"[HOST]",
|
||||
"[PASSWORD]",
|
||||
new CoroutineCallback<>((result, error) -> {
|
||||
if (error != null) {
|
||||
error.printStackTrace();
|
||||
return;
|
||||
}
|
||||
|
||||
System.out.println(result);
|
||||
})
|
||||
);
|
||||
@@ -0,0 +1,24 @@
|
||||
import io.appwrite.Client;
|
||||
import io.appwrite.coroutines.CoroutineCallback;
|
||||
import io.appwrite.services.Transfers;
|
||||
|
||||
Client client = new Client()
|
||||
.setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint
|
||||
.setProject("5df5acd0d48c2") // Your project ID
|
||||
.setKey("919c2d18fb5d4...a2ae413da83346ad2"); // Your secret API key
|
||||
|
||||
Transfers transfers = new Transfers(client);
|
||||
|
||||
transfers.create(
|
||||
"[SOURCE]",
|
||||
"[DESTINATION]",
|
||||
listOf(),
|
||||
new CoroutineCallback<>((result, error) -> {
|
||||
if (error != null) {
|
||||
error.printStackTrace();
|
||||
return;
|
||||
}
|
||||
|
||||
System.out.println(result);
|
||||
})
|
||||
);
|
||||
@@ -0,0 +1,22 @@
|
||||
import io.appwrite.Client;
|
||||
import io.appwrite.coroutines.CoroutineCallback;
|
||||
import io.appwrite.services.Transfers;
|
||||
|
||||
Client client = new Client()
|
||||
.setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint
|
||||
.setProject("5df5acd0d48c2") // Your project ID
|
||||
.setKey("919c2d18fb5d4...a2ae413da83346ad2"); // Your secret API key
|
||||
|
||||
Transfers transfers = new Transfers(client);
|
||||
|
||||
transfers.getDestination(
|
||||
"[DESTINATION_ID]"
|
||||
new CoroutineCallback<>((result, error) -> {
|
||||
if (error != null) {
|
||||
error.printStackTrace();
|
||||
return;
|
||||
}
|
||||
|
||||
System.out.println(result);
|
||||
})
|
||||
);
|
||||
@@ -0,0 +1,22 @@
|
||||
import io.appwrite.Client;
|
||||
import io.appwrite.coroutines.CoroutineCallback;
|
||||
import io.appwrite.services.Transfers;
|
||||
|
||||
Client client = new Client()
|
||||
.setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint
|
||||
.setProject("5df5acd0d48c2") // Your project ID
|
||||
.setKey("919c2d18fb5d4...a2ae413da83346ad2"); // Your secret API key
|
||||
|
||||
Transfers transfers = new Transfers(client);
|
||||
|
||||
transfers.getSource(
|
||||
"[SOURCE_ID]"
|
||||
new CoroutineCallback<>((result, error) -> {
|
||||
if (error != null) {
|
||||
error.printStackTrace();
|
||||
return;
|
||||
}
|
||||
|
||||
System.out.println(result);
|
||||
})
|
||||
);
|
||||
@@ -0,0 +1,21 @@
|
||||
import io.appwrite.Client;
|
||||
import io.appwrite.coroutines.CoroutineCallback;
|
||||
import io.appwrite.services.Transfers;
|
||||
|
||||
Client client = new Client()
|
||||
.setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint
|
||||
.setProject("5df5acd0d48c2") // Your project ID
|
||||
.setKey("919c2d18fb5d4...a2ae413da83346ad2"); // Your secret API key
|
||||
|
||||
Transfers transfers = new Transfers(client);
|
||||
|
||||
transfers.listDestinations(
|
||||
new CoroutineCallback<>((result, error) -> {
|
||||
if (error != null) {
|
||||
error.printStackTrace();
|
||||
return;
|
||||
}
|
||||
|
||||
System.out.println(result);
|
||||
})
|
||||
);
|
||||
@@ -0,0 +1,21 @@
|
||||
import io.appwrite.Client;
|
||||
import io.appwrite.coroutines.CoroutineCallback;
|
||||
import io.appwrite.services.Transfers;
|
||||
|
||||
Client client = new Client()
|
||||
.setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint
|
||||
.setProject("5df5acd0d48c2") // Your project ID
|
||||
.setKey("919c2d18fb5d4...a2ae413da83346ad2"); // Your secret API key
|
||||
|
||||
Transfers transfers = new Transfers(client);
|
||||
|
||||
transfers.listSources(
|
||||
new CoroutineCallback<>((result, error) -> {
|
||||
if (error != null) {
|
||||
error.printStackTrace();
|
||||
return;
|
||||
}
|
||||
|
||||
System.out.println(result);
|
||||
})
|
||||
);
|
||||
@@ -0,0 +1,21 @@
|
||||
import io.appwrite.Client;
|
||||
import io.appwrite.coroutines.CoroutineCallback;
|
||||
import io.appwrite.services.Transfers;
|
||||
|
||||
Client client = new Client()
|
||||
.setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint
|
||||
.setProject("5df5acd0d48c2") // Your project ID
|
||||
.setKey("919c2d18fb5d4...a2ae413da83346ad2"); // Your secret API key
|
||||
|
||||
Transfers transfers = new Transfers(client);
|
||||
|
||||
transfers.list(
|
||||
new CoroutineCallback<>((result, error) -> {
|
||||
if (error != null) {
|
||||
error.printStackTrace();
|
||||
return;
|
||||
}
|
||||
|
||||
System.out.println(result);
|
||||
})
|
||||
);
|
||||
@@ -0,0 +1,15 @@
|
||||
import io.appwrite.Client
|
||||
import io.appwrite.services.Transfers
|
||||
|
||||
val client = Client(context)
|
||||
.setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint
|
||||
.setProject("5df5acd0d48c2") // Your project ID
|
||||
.setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key
|
||||
|
||||
val transfers = Transfers(client)
|
||||
|
||||
val response = transfers.createAppwriteDestination(
|
||||
projectId = "[PROJECT_ID]",
|
||||
endpoint = "https://example.com",
|
||||
key = "[KEY]",
|
||||
)
|
||||
@@ -0,0 +1,15 @@
|
||||
import io.appwrite.Client
|
||||
import io.appwrite.services.Transfers
|
||||
|
||||
val client = Client(context)
|
||||
.setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint
|
||||
.setProject("5df5acd0d48c2") // Your project ID
|
||||
.setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key
|
||||
|
||||
val transfers = Transfers(client)
|
||||
|
||||
val response = transfers.createAppwriteSource(
|
||||
projectId = "[PROJECT_ID]",
|
||||
endpoint = "https://example.com",
|
||||
key = "[KEY]",
|
||||
)
|
||||
@@ -0,0 +1,13 @@
|
||||
import io.appwrite.Client
|
||||
import io.appwrite.services.Transfers
|
||||
|
||||
val client = Client(context)
|
||||
.setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint
|
||||
.setProject("5df5acd0d48c2") // Your project ID
|
||||
.setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key
|
||||
|
||||
val transfers = Transfers(client)
|
||||
|
||||
val response = transfers.createFirebaseSource(
|
||||
serviceAccount = mapOf( "a" to "b" ),
|
||||
)
|
||||
@@ -0,0 +1,14 @@
|
||||
import io.appwrite.Client
|
||||
import io.appwrite.services.Transfers
|
||||
|
||||
val client = Client(context)
|
||||
.setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint
|
||||
.setProject("5df5acd0d48c2") // Your project ID
|
||||
.setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key
|
||||
|
||||
val transfers = Transfers(client)
|
||||
|
||||
val response = transfers.createNhostSource(
|
||||
host = "[HOST]",
|
||||
password = "[PASSWORD]",
|
||||
)
|
||||
@@ -0,0 +1,14 @@
|
||||
import io.appwrite.Client
|
||||
import io.appwrite.services.Transfers
|
||||
|
||||
val client = Client(context)
|
||||
.setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint
|
||||
.setProject("5df5acd0d48c2") // Your project ID
|
||||
.setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key
|
||||
|
||||
val transfers = Transfers(client)
|
||||
|
||||
val response = transfers.createSupabaseSource(
|
||||
host = "[HOST]",
|
||||
password = "[PASSWORD]",
|
||||
)
|
||||
@@ -0,0 +1,15 @@
|
||||
import io.appwrite.Client
|
||||
import io.appwrite.services.Transfers
|
||||
|
||||
val client = Client(context)
|
||||
.setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint
|
||||
.setProject("5df5acd0d48c2") // Your project ID
|
||||
.setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key
|
||||
|
||||
val transfers = Transfers(client)
|
||||
|
||||
val response = transfers.create(
|
||||
source = "[SOURCE]",
|
||||
destination = "[DESTINATION]",
|
||||
resources = listOf(),
|
||||
)
|
||||
@@ -0,0 +1,13 @@
|
||||
import io.appwrite.Client
|
||||
import io.appwrite.services.Transfers
|
||||
|
||||
val client = Client(context)
|
||||
.setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint
|
||||
.setProject("5df5acd0d48c2") // Your project ID
|
||||
.setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key
|
||||
|
||||
val transfers = Transfers(client)
|
||||
|
||||
val response = transfers.getDestination(
|
||||
destinationId = "[DESTINATION_ID]"
|
||||
)
|
||||
@@ -0,0 +1,13 @@
|
||||
import io.appwrite.Client
|
||||
import io.appwrite.services.Transfers
|
||||
|
||||
val client = Client(context)
|
||||
.setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint
|
||||
.setProject("5df5acd0d48c2") // Your project ID
|
||||
.setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key
|
||||
|
||||
val transfers = Transfers(client)
|
||||
|
||||
val response = transfers.getSource(
|
||||
sourceId = "[SOURCE_ID]"
|
||||
)
|
||||
@@ -0,0 +1,12 @@
|
||||
import io.appwrite.Client
|
||||
import io.appwrite.services.Transfers
|
||||
|
||||
val client = Client(context)
|
||||
.setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint
|
||||
.setProject("5df5acd0d48c2") // Your project ID
|
||||
.setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key
|
||||
|
||||
val transfers = Transfers(client)
|
||||
|
||||
val response = transfers.listDestinations(
|
||||
)
|
||||
@@ -0,0 +1,12 @@
|
||||
import io.appwrite.Client
|
||||
import io.appwrite.services.Transfers
|
||||
|
||||
val client = Client(context)
|
||||
.setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint
|
||||
.setProject("5df5acd0d48c2") // Your project ID
|
||||
.setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key
|
||||
|
||||
val transfers = Transfers(client)
|
||||
|
||||
val response = transfers.listSources(
|
||||
)
|
||||
@@ -0,0 +1,12 @@
|
||||
import io.appwrite.Client
|
||||
import io.appwrite.services.Transfers
|
||||
|
||||
val client = Client(context)
|
||||
.setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint
|
||||
.setProject("5df5acd0d48c2") // Your project ID
|
||||
.setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key
|
||||
|
||||
val transfers = Transfers(client)
|
||||
|
||||
val response = transfers.list(
|
||||
)
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user