Merge pull request #5845 from appwrite/feat-1.4.x-with-1.3.x-master

Sync with Master and 1.3.x
This commit is contained in:
Eldad A. Fux 2023-07-19 12:30:57 +03:00 committed by GitHub
commit 122d6fd803
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
184 changed files with 407 additions and 99 deletions

View file

@ -116,6 +116,7 @@
## Changes
- Released `appwrite/console` [2.0.2](https://github.com/appwrite/console/releases/tag/2.0.2)
- Make `region` parameter optional with default for project create [#4763](https://github.com/appwrite/appwrite/pull/4763)
- Add security headers to the console endpoint [#4758](https://github.com/appwrite/appwrite/pull/4758)
## Bugs
- Fix default oauth paths [#4725](https://github.com/appwrite/appwrite/pull/4725)

View file

@ -227,6 +227,11 @@ return [
'description' => 'The invite does not belong to the current user.',
'code' => 401,
],
Exception::TEAM_ALREADY_EXISTS => [
'name' => Exception::TEAM_ALREADY_EXISTS,
'description' => 'Team with requested ID already exists.',
'code' => 409,
],
/** Membership */
Exception::MEMBERSHIP_NOT_FOUND => [
@ -403,9 +408,14 @@ return [
'description' => 'The document structure is invalid. Please ensure the attributes match the collection definition.',
'code' => 400,
],
Exception::DOCUMENT_MISSING_DATA => [
'name' => Exception::DOCUMENT_MISSING_DATA,
'description' => 'The document data is missing. You must provide the document data.',
'code' => 400,
],
Exception::DOCUMENT_MISSING_PAYLOAD => [
'name' => Exception::DOCUMENT_MISSING_PAYLOAD,
'description' => 'The document payload is missing.',
'description' => 'The document data and permissions are missing. You must provide either the document data or permissions to be updated.',
'code' => 400,
],
Exception::DOCUMENT_ALREADY_EXISTS => [

View file

@ -285,7 +285,7 @@ return [
[
'key' => 'python',
'name' => 'Python',
'version' => '2.0.0',
'version' => '2.0.2',
'url' => 'https://github.com/appwrite/sdk-for-python',
'package' => 'https://pypi.org/project/appwrite/',
'enabled' => true,
@ -357,7 +357,7 @@ return [
[
'key' => 'dotnet',
'name' => '.NET',
'version' => '0.4.0',
'version' => '0.4.2',
'url' => 'https://github.com/appwrite/sdk-for-dotnet',
'package' => 'https://www.nuget.org/packages/Appwrite',
'enabled' => true,

View file

@ -549,7 +549,7 @@ App::get('/v1/account/sessions/oauth2/:provider/redirect')
$detector = new Detector($request->getUserAgent('UNKNOWN'));
$record = $geodb->get($request->getIP());
$secret = Auth::tokenGenerator();
$expire = DateTime::addSeconds(new \DateTime(), $duration);
$expire = DateTime::formatTz(DateTime::addSeconds(new \DateTime(), $duration));
$session = new Document(array_merge([
'$id' => ID::unique(),
@ -700,7 +700,7 @@ App::post('/v1/account/sessions/magic-url')
}
$loginSecret = Auth::tokenGenerator();
$expire = DateTime::addSeconds(new \DateTime(), Auth::TOKEN_EXPIRATION_CONFIRM);
$expire = DateTime::formatTz(DateTime::addSeconds(new \DateTime(), Auth::TOKEN_EXPIRATION_CONFIRM));
$token = new Document([
'$id' => ID::unique(),
@ -826,7 +826,7 @@ App::put('/v1/account/sessions/magic-url')
$detector = new Detector($request->getUserAgent('UNKNOWN'));
$record = $geodb->get($request->getIP());
$secret = Auth::tokenGenerator();
$expire = DateTime::addSeconds(new \DateTime(), $duration);
$expire = DateTime::formatTz(DateTime::addSeconds(new \DateTime(), $duration));
$session = new Document(array_merge(
[
@ -975,7 +975,7 @@ App::post('/v1/account/sessions/phone')
}
$secret = Auth::codeGenerator();
$expire = DateTime::addSeconds(new \DateTime(), Auth::TOKEN_EXPIRATION_PHONE);
$expire = DateTime::formatTz(DateTime::addSeconds(new \DateTime(), Auth::TOKEN_EXPIRATION_PHONE));
$token = new Document([
'$id' => ID::unique(),
@ -1063,7 +1063,7 @@ App::put('/v1/account/sessions/phone')
$detector = new Detector($request->getUserAgent('UNKNOWN'));
$record = $geodb->get($request->getIP());
$secret = Auth::tokenGenerator();
$expire = DateTime::addSeconds(new \DateTime(), $duration);
$expire = DateTime::formatTz(DateTime::addSeconds(new \DateTime(), $duration));
$session = new Document(array_merge(
[
@ -1215,7 +1215,7 @@ App::post('/v1/account/sessions/anonymous')
$detector = new Detector($request->getUserAgent('UNKNOWN'));
$record = $geodb->get($request->getIP());
$secret = Auth::tokenGenerator();
$expire = DateTime::addSeconds(new \DateTime(), $duration);
$expire = DateTime::formatTz(DateTime::addSeconds(new \DateTime(), $duration));
$session = new Document(array_merge(
[
@ -1388,6 +1388,7 @@ App::get('/v1/account/sessions')
$session->setAttribute('countryName', $countryName);
$session->setAttribute('current', ($current == $session->getId()) ? true : false);
$session->setAttribute('expire', DateTime::formatTz(DateTime::addSeconds(new \DateTime($session->getCreatedAt()), $authDuration)));
$sessions[$key] = $session;
}
@ -1494,7 +1495,7 @@ App::get('/v1/account/sessions/:sessionId')
$session
->setAttribute('current', ($session->getAttribute('secret') == Auth::hash(Auth::$secret)))
->setAttribute('countryName', $countryName)
->setAttribute('expire', DateTime::addSeconds(new \DateTime($session->getCreatedAt()), $authDuration))
->setAttribute('expire', DateTime::formatTz(DateTime::addSeconds(new \DateTime($session->getCreatedAt()), $authDuration)))
;
return $response->dynamic($session, Response::MODEL_SESSION);
@ -1950,7 +1951,7 @@ App::patch('/v1/account/sessions/:sessionId')
$authDuration = $project->getAttribute('auths', [])['duration'] ?? Auth::TOKEN_EXPIRATION_LOGIN_LONG;
$session->setAttribute('expire', DateTime::addSeconds(new \DateTime($session->getCreatedAt()), $authDuration));
$session->setAttribute('expire', DateTime::formatTz(DateTime::addSeconds(new \DateTime($session->getCreatedAt()), $authDuration)));
$events
->setParam('userId', $user->getId())
@ -2317,7 +2318,7 @@ App::post('/v1/account/verification')
->setBody($body)
->setFrom($from)
->setRecipient($user->getAttribute('email'))
->setName($user->getAttribute('name'))
->setName($user->getAttribute('name') ?? '')
->trigger()
;
@ -2391,7 +2392,7 @@ App::put('/v1/account/verification')
$dbForProject->deleteCachedDocument('users', $profile->getId());
$events
->setParam('userId', $user->getId())
->setParam('userId', $userId)
->setParam('tokenId', $verificationDocument->getId())
;

View file

@ -328,22 +328,22 @@ function updateAttribute(
}
if ($type === Database::VAR_RELATIONSHIP) {
$options = \array_merge($attribute->getAttribute('options', []), $options);
$attribute->setAttribute('options', $options);
$primaryDocumentOptions = \array_merge($attribute->getAttribute('options', []), $options);
$attribute->setAttribute('options', $primaryDocumentOptions);
$dbForProject->updateRelationship(
collection: $collectionId,
id: $key,
onDelete: $options['onDelete'],
onDelete: $primaryDocumentOptions['onDelete'],
);
if ($options['twoWay']) {
$relatedCollection = $dbForProject->getDocument('database_' . $db->getInternalId(), $options['relatedCollection']);
$relatedAttribute = $dbForProject->getDocument('attributes', $db->getInternalId() . '_' . $relatedCollection->getInternalId() . '_' . $options['twoWayKey']);
if ($primaryDocumentOptions['twoWay']) {
$relatedCollection = $dbForProject->getDocument('database_' . $db->getInternalId(), $primaryDocumentOptions['relatedCollection']);
$relatedAttribute = $dbForProject->getDocument('attributes', $db->getInternalId() . '_' . $relatedCollection->getInternalId() . '_' . $primaryDocumentOptions['twoWayKey']);
$relatedOptions = \array_merge($relatedAttribute->getAttribute('options'), $options);
$relatedAttribute->setAttribute('options', $relatedOptions);
$dbForProject->updateDocument('attributes', $db->getInternalId() . '_' . $relatedCollection->getInternalId() . '_' . $options['twoWayKey'], $relatedAttribute);
$dbForProject->updateDocument('attributes', $db->getInternalId() . '_' . $relatedCollection->getInternalId() . '_' . $primaryDocumentOptions['twoWayKey'], $relatedAttribute);
$dbForProject->deleteCachedDocument('database_' . $db->getInternalId(), $relatedCollection->getId());
}
} else {
@ -2631,7 +2631,7 @@ App::post('/v1/databases/:databaseId/collections/:collectionId/documents')
->label('event', 'databases.[databaseId].collections.[collectionId].documents.[documentId].create')
->label('scope', 'documents.write')
->label('audits.event', 'document.create')
->label('audits.resource', 'database/{request.databaseId}/collection/{request.collectionId}')
->label('audits.resource', 'database/{request.databaseId}/collection/{request.collectionId}/document/{response.$id}')
->label('usage.metric', 'documents.{scope}.requests.create')
->label('usage.params', ['databaseId:{request.databaseId}', 'collectionId:{request.collectionId}'])
->label('abuse-key', 'ip:{ip},method:{method},url:{url},userId:{userId}')
@ -2661,7 +2661,7 @@ App::post('/v1/databases/:databaseId/collections/:collectionId/documents')
$data = (\is_string($data)) ? \json_decode($data, true) : $data; // Cast to JSON array
if (empty($data)) {
throw new Exception(Exception::DOCUMENT_MISSING_PAYLOAD);
throw new Exception(Exception::DOCUMENT_MISSING_DATA);
}
if (isset($data['$id'])) {

View file

@ -650,11 +650,13 @@ App::post('/v1/functions/:functionId/deployments')
$end = $request->getContentRangeEnd();
$fileSize = $request->getContentRangeSize();
$deploymentId = $request->getHeader('x-appwrite-id', $deploymentId);
if (is_null($start) || is_null($end) || is_null($fileSize)) {
// TODO make `end >= $fileSize` in next breaking version
if (is_null($start) || is_null($end) || is_null($fileSize) || $end > $fileSize) {
throw new Exception(Exception::STORAGE_INVALID_CONTENT_RANGE);
}
if ($end === $fileSize) {
// TODO remove the condition that checks `$end === $fileSize` in next breaking version
if ($end === $fileSize - 1 || $end === $fileSize) {
//if it's a last chunks the chunk size might differ, so we set the $chunks and $chunk to notify it's last chunk
$chunks = $chunk = -1;
} else {

View file

@ -758,17 +758,11 @@ App::delete('/v1/projects/:projectId')
->label('sdk.response.code', Response::STATUS_CODE_NOCONTENT)
->label('sdk.response.model', Response::MODEL_NONE)
->param('projectId', '', new UID(), 'Project unique ID.')
->param('password', '', new Password(), 'Your user password for confirmation. Must be at least 8 chars.')
->inject('response')
->inject('user')
->inject('dbForConsole')
->inject('deletes')
->action(function (string $projectId, string $password, Response $response, Document $user, Database $dbForConsole, Delete $deletes) {
if (!Auth::passwordVerify($password, $user->getAttribute('password'), $user->getAttribute('hash'), $user->getAttribute('hashOptions'))) { // Double check user password
throw new Exception(Exception::USER_INVALID_CREDENTIALS);
}
->action(function (string $projectId, Response $response, Document $user, Database $dbForConsole, Delete $deletes) {
$project = $dbForConsole->getDocument('projects', $projectId);
if ($project->isEmpty()) {

View file

@ -445,11 +445,13 @@ App::post('/v1/storage/buckets/:bucketId/files')
$end = $request->getContentRangeEnd();
$fileSize = $request->getContentRangeSize();
$fileId = $request->getHeader('x-appwrite-id', $fileId);
if (is_null($start) || is_null($end) || is_null($fileSize)) {
// TODO make `end >= $fileSize` in next breaking version
if (is_null($start) || is_null($end) || is_null($fileSize) || $end > $fileSize) {
throw new Exception(Exception::STORAGE_INVALID_CONTENT_RANGE);
}
if ($end === $fileSize) {
// TODO remove the condition that checks `$end === $fileSize` in next breaking version
if ($end === $fileSize - 1 || $end === $fileSize) {
//if it's a last chunks the chunk size might differ, so we set the $chunks and $chunk to -1 notify it's last chunk
$chunks = $chunk = -1;
} else {

View file

@ -67,18 +67,23 @@ App::post('/v1/teams')
$isAppUser = Auth::isAppUser(Authorization::getRoles());
$teamId = $teamId == 'unique()' ? ID::unique() : $teamId;
$team = Authorization::skip(fn() => $dbForProject->createDocument('teams', new Document([
'$id' => $teamId,
'$permissions' => [
Permission::read(Role::team($teamId)),
Permission::update(Role::team($teamId, 'owner')),
Permission::delete(Role::team($teamId, 'owner')),
],
'name' => $name,
'total' => ($isPrivilegedUser || $isAppUser) ? 0 : 1,
'prefs' => new \stdClass(),
'search' => implode(' ', [$teamId, $name]),
])));
try {
$team = Authorization::skip(fn() => $dbForProject->createDocument('teams', new Document([
'$id' => $teamId,
'$permissions' => [
Permission::read(Role::team($teamId)),
Permission::update(Role::team($teamId, 'owner')),
Permission::delete(Role::team($teamId, 'owner')),
],
'name' => $name,
'total' => ($isPrivilegedUser || $isAppUser) ? 0 : 1,
'prefs' => new \stdClass(),
'search' => implode(' ', [$teamId, $name]),
])));
} catch (Duplicate $th) {
throw new Exception(Exception::TEAM_ALREADY_EXISTS);
}
if (!$isPrivilegedUser && !$isAppUser) { // Don't add user on server mode
if (!\in_array('owner', $roles)) {

View file

@ -41,6 +41,7 @@ Config::setParam('cookieDomain', 'localhost');
Config::setParam('cookieSamesite', Response::COOKIE_SAMESITE_NONE);
App::init()
->groups(['api'])
->inject('utopia')
->inject('request')
->inject('response')

View file

@ -286,7 +286,7 @@ App::post('/v1/mock/tests/general/upload')
$id = $request->getHeader('x-appwrite-id', '');
$file['size'] = (\is_array($file['size'])) ? $file['size'][0] : $file['size'];
if (is_null($start) || is_null($end) || is_null($size)) {
if (is_null($start) || is_null($end) || is_null($size) || $end >= $size) {
throw new Exception(Exception::GENERAL_MOCK, 'Invalid content-range header');
}
@ -302,11 +302,11 @@ App::post('/v1/mock/tests/general/upload')
throw new Exception(Exception::GENERAL_MOCK, 'All chunked request must have id header (except first)');
}
if ($end !== $size && $end - $start + 1 !== $chunkSize) {
if ($end !== $size - 1 && $end - $start + 1 !== $chunkSize) {
throw new Exception(Exception::GENERAL_MOCK, 'Chunk size must be 5MB (except last chunk)');
}
if ($end !== $size && $file['size'] !== $chunkSize) {
if ($end !== $size - 1 && $file['size'] !== $chunkSize) {
throw new Exception(Exception::GENERAL_MOCK, 'Wrong chunk size');
}
@ -314,11 +314,11 @@ App::post('/v1/mock/tests/general/upload')
throw new Exception(Exception::GENERAL_MOCK, 'Chunk size must be 5MB or less');
}
if ($end !== $size) {
if ($end !== $size - 1) {
$response->json([
'$id' => ID::custom('newfileid'),
'chunksTotal' => $file['size'] / $chunkSize,
'chunksUploaded' => $start / $chunkSize
'chunksTotal' => (int) ceil($size / ($end + 1 - $start)),
'chunksUploaded' => ceil($start / $chunkSize) + 1
]);
}
} else {

View file

@ -1,8 +1,21 @@
<?php
use Appwrite\Utopia\Request;
use Appwrite\Utopia\Response;
use Utopia\App;
App::init()
->groups(['web'])
->inject('request')
->inject('response')
->action(function (Request $request, Response $response) {
$response
->addHeader('X-Frame-Options', 'SAMEORIGIN') // Avoid console and homepage from showing in iframes
->addHeader('X-XSS-Protection', '1; mode=block; report=/v1/xss?url=' . \urlencode($request->getURI()))
->addHeader('X-UA-Compatible', 'IE=Edge') // Deny IE browsers from going into quirks mode
;
});
App::get('/console/*')
->alias('/')
->alias('auth/*')

View file

@ -6,7 +6,7 @@ use Utopia\Config\Config;
App::get('/versions')
->desc('Get Version')
->groups(['web', 'home'])
->groups(['home'])
->label('scope', 'public')
->inject('response')
->action(function (Response $response) {

View file

@ -926,7 +926,7 @@ App::setResource('project', function ($dbForConsole, $request, $console) {
/** @var Utopia\Database\Database $dbForConsole */
/** @var Utopia\Database\Document $console */
$projectId = $request->getParam('project', $request->getHeader('x-appwrite-project', 'console'));
$projectId = $request->getParam('project', $request->getHeader('x-appwrite-project', ''));
if ($projectId === 'console') {
return $console;

51
composer.lock generated
View file

@ -2962,16 +2962,16 @@
},
{
"name": "webonyx/graphql-php",
"version": "v14.11.9",
"version": "v14.11.10",
"source": {
"type": "git",
"url": "https://github.com/webonyx/graphql-php.git",
"reference": "ff91c9f3cf241db702e30b2c42bcc0920e70ac70"
"reference": "d9c2fdebc6aa01d831bc2969da00e8588cffef19"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/webonyx/graphql-php/zipball/ff91c9f3cf241db702e30b2c42bcc0920e70ac70",
"reference": "ff91c9f3cf241db702e30b2c42bcc0920e70ac70",
"url": "https://api.github.com/repos/webonyx/graphql-php/zipball/d9c2fdebc6aa01d831bc2969da00e8588cffef19",
"reference": "d9c2fdebc6aa01d831bc2969da00e8588cffef19",
"shasum": ""
},
"require": {
@ -2991,8 +2991,7 @@
"phpunit/phpunit": "^7.2 || ^8.5",
"psr/http-message": "^1.0",
"react/promise": "2.*",
"simpod/php-coveralls-mirror": "^3.0",
"squizlabs/php_codesniffer": "3.5.4"
"simpod/php-coveralls-mirror": "^3.0"
},
"suggest": {
"psr/http-message": "To use standard GraphQL server",
@ -3016,7 +3015,7 @@
],
"support": {
"issues": "https://github.com/webonyx/graphql-php/issues",
"source": "https://github.com/webonyx/graphql-php/tree/v14.11.9"
"source": "https://github.com/webonyx/graphql-php/tree/v14.11.10"
},
"funding": [
{
@ -3024,22 +3023,22 @@
"type": "open_collective"
}
],
"time": "2023-01-06T12:12:50+00:00"
"time": "2023-07-05T14:23:37+00:00"
}
],
"packages-dev": [
{
"name": "appwrite/sdk-generator",
"version": "0.33.1",
"version": "0.33.6",
"source": {
"type": "git",
"url": "https://github.com/appwrite/sdk-generator.git",
"reference": "551cdae31a68b19874f10ca321b1d08cfa06a13f"
"reference": "237fe97b68090a244382c36f96482c352880a38c"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/appwrite/sdk-generator/zipball/551cdae31a68b19874f10ca321b1d08cfa06a13f",
"reference": "551cdae31a68b19874f10ca321b1d08cfa06a13f",
"url": "https://api.github.com/repos/appwrite/sdk-generator/zipball/237fe97b68090a244382c36f96482c352880a38c",
"reference": "237fe97b68090a244382c36f96482c352880a38c",
"shasum": ""
},
"require": {
@ -3075,9 +3074,9 @@
"description": "Appwrite PHP library for generating API SDKs for multiple programming languages and platforms",
"support": {
"issues": "https://github.com/appwrite/sdk-generator/issues",
"source": "https://github.com/appwrite/sdk-generator/tree/0.33.1"
"source": "https://github.com/appwrite/sdk-generator/tree/0.33.6"
},
"time": "2023-05-16T04:37:34+00:00"
"time": "2023-07-10T16:27:53+00:00"
},
{
"name": "doctrine/deprecations",
@ -3381,16 +3380,16 @@
},
{
"name": "nikic/php-parser",
"version": "v4.15.5",
"version": "v4.16.0",
"source": {
"type": "git",
"url": "https://github.com/nikic/PHP-Parser.git",
"reference": "11e2663a5bc9db5d714eedb4277ee300403b4a9e"
"reference": "19526a33fb561ef417e822e85f08a00db4059c17"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/11e2663a5bc9db5d714eedb4277ee300403b4a9e",
"reference": "11e2663a5bc9db5d714eedb4277ee300403b4a9e",
"url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/19526a33fb561ef417e822e85f08a00db4059c17",
"reference": "19526a33fb561ef417e822e85f08a00db4059c17",
"shasum": ""
},
"require": {
@ -3431,9 +3430,9 @@
],
"support": {
"issues": "https://github.com/nikic/PHP-Parser/issues",
"source": "https://github.com/nikic/PHP-Parser/tree/v4.15.5"
"source": "https://github.com/nikic/PHP-Parser/tree/v4.16.0"
},
"time": "2023-05-19T20:20:00+00:00"
"time": "2023-06-25T14:52:30+00:00"
},
{
"name": "phar-io/manifest",
@ -3784,16 +3783,16 @@
},
{
"name": "phpstan/phpdoc-parser",
"version": "1.22.0",
"version": "1.22.1",
"source": {
"type": "git",
"url": "https://github.com/phpstan/phpdoc-parser.git",
"reference": "ec58baf7b3c7f1c81b3b00617c953249fb8cf30c"
"reference": "65c39594fbd8c67abfc68bb323f86447bab79cc0"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/ec58baf7b3c7f1c81b3b00617c953249fb8cf30c",
"reference": "ec58baf7b3c7f1c81b3b00617c953249fb8cf30c",
"url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/65c39594fbd8c67abfc68bb323f86447bab79cc0",
"reference": "65c39594fbd8c67abfc68bb323f86447bab79cc0",
"shasum": ""
},
"require": {
@ -3825,9 +3824,9 @@
"description": "PHPDoc parser with support for nullable, intersection and generic types",
"support": {
"issues": "https://github.com/phpstan/phpdoc-parser/issues",
"source": "https://github.com/phpstan/phpdoc-parser/tree/1.22.0"
"source": "https://github.com/phpstan/phpdoc-parser/tree/1.22.1"
},
"time": "2023-06-01T12:35:21+00:00"
"time": "2023-06-29T20:46:06+00:00"
},
{
"name": "phpunit/php-code-coverage",

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()
@ -11,5 +12,5 @@ var functions = new Functions(client);
Deployment result = await functions.CreateDeployment(
functionId: "[FUNCTION_ID]",
entrypoint: "[ENTRYPOINT]",
code: new File("./path-to-files/image.jpg"),
code: InputFile.FromPath("./path-to-files/image.jpg"),
activate: false);

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

View file

@ -1,4 +1,5 @@
using Appwrite;
using Appwrite.Services;
using Appwrite.Models;
var client = new Client()

Some files were not shown because too many files have changed in this diff Show more