1
0
Fork 0
mirror of synced 2024-06-26 18:20:43 +12:00

Merge branch 'dev' into feat-265-realtime

This commit is contained in:
Torsten Dittmann 2021-03-16 15:53:09 +01:00
commit 7be9f2e33e
86 changed files with 430 additions and 265 deletions

View file

@ -2,11 +2,11 @@
- Anonymous login
# Version 0.7.1 (Not Released Yet)
# Version 0.7.1
## Features
- Better error logs on appwrite cretificates worker
- Better error logs on appwrite certificates worker
- Added option for Redis authentication
- Force adding a security email on setup
- SMTP is now disabled by default, no dummy SMTP is included in setup
@ -22,10 +22,15 @@
- Upgraded influxdb/influxdb-php lib to version 1.15.2
- Upgraded phpmailer/phpmailer lib to version 6.3.0
- Upgraded adhocore/jwt lib to version 1.1.2
- Upgraded domnikl/statsd to slickdeals/statsd version 3.0
## Bug Fixes
- Updated missing storage env vars
- Fixed a bug, that added a wrong timzone offset to user log timestamps
- Fixed a bug, that Response format header was not added in the access-control-allow-header list.
- Fixed a bug where countryName is unknown on sessions (#933)
- Added missing event users.update.prefs (#952)
## Security

View file

@ -53,7 +53,7 @@ docker run -it --rm \
--volume /var/run/docker.sock:/var/run/docker.sock \
--volume "$(pwd)"/appwrite:/usr/src/code/appwrite:rw \
--entrypoint="install" \
appwrite/appwrite:0.7.0
appwrite/appwrite:0.7.1
```
### Windows
@ -65,7 +65,7 @@ docker run -it --rm ^
--volume //var/run/docker.sock:/var/run/docker.sock ^
--volume "%cd%"/appwrite:/usr/src/code/appwrite:rw ^
--entrypoint="install" ^
appwrite/appwrite:0.7.0
appwrite/appwrite:0.7.1
```
#### PowerShell
@ -75,7 +75,7 @@ docker run -it --rm ,
--volume /var/run/docker.sock:/var/run/docker.sock ,
--volume ${pwd}/appwrite:/usr/src/code/appwrite:rw ,
--entrypoint="install" ,
appwrite/appwrite:0.7.0
appwrite/appwrite:0.7.1
```
Once the Docker installation completes, go to http://localhost to access the Appwrite console from your browser. Please note that on non-linux native hosts, the server might take a few minutes to start after installation completes.

View file

@ -117,6 +117,11 @@ return [
'model' => Response::MODEL_USER,
'note' => 'version >= 0.7',
],
'users.update.prefs' => [
'description' => 'This event triggers when a user preference is updated from the users API.',
'model' => Response::MODEL_ANY,
'note' => 'version >= 0.7',
],
'users.update.status' => [
'description' => 'This event triggers when a user status is updated from the users API.',
'model' => Response::MODEL_USER,

View file

@ -32,7 +32,7 @@ return [
[
'key' => 'flutter',
'name' => 'Flutter',
'version' => '0.3.0',
'version' => '0.4.0-dev.2',
'url' => 'https://github.com/appwrite/sdk-for-flutter',
'package' => 'https://pub.dev/packages/appwrite',
'enabled' => true,
@ -165,7 +165,7 @@ return [
[
'key' => 'deno',
'name' => 'Deno',
'version' => '0.1.0',
'version' => '0.1.1',
'url' => 'https://github.com/appwrite/sdk-for-deno',
'package' => 'https://deno.land/x/appwrite',
'enabled' => true,
@ -199,7 +199,7 @@ return [
[
'key' => 'python',
'name' => 'Python',
'version' => '0.1.0',
'version' => '0.1.1',
'url' => 'https://github.com/appwrite/sdk-for-python',
'package' => 'https://pypi.org/project/appwrite/',
'enabled' => true,
@ -216,7 +216,7 @@ return [
[
'key' => 'ruby',
'name' => 'Ruby',
'version' => '2.0.0',
'version' => '2.0.2',
'url' => 'https://github.com/appwrite/sdk-for-ruby',
'package' => 'https://rubygems.org/gems/appwrite',
'enabled' => true,
@ -284,7 +284,7 @@ return [
[
'key' => 'dart',
'name' => 'Dart',
'version' => '0.2.0',
'version' => '0.3.1',
'url' => 'https://github.com/appwrite/sdk-for-dart',
'package' => 'https://pub.dev/packages/dart_appwrite',
'enabled' => true,
@ -301,7 +301,7 @@ return [
[
'key' => 'cli',
'name' => 'Command Line',
'version' => '0.5.0',
'version' => '0.6.0',
'url' => 'https://github.com/appwrite/sdk-for-cli',
'package' => 'https://github.com/appwrite/sdk-for-cli',
'enabled' => true,

View file

@ -107,8 +107,8 @@ return [
'name' => '_APP_SYSTEM_SECURITY_EMAIL_ADDRESS',
'description' => 'This is the email address used to issue SSL certificates for custom domains or the user agent in your webhooks payload.',
'introduction' => '0.7.0',
'default' => '',
'required' => true,
'default' => 'certs@appwrite.io',
'required' => false,
'question' => '',
],
[

View file

@ -236,9 +236,11 @@ App::post('/v1/account/sessions')
->setStatusCode(Response::STATUS_CODE_CREATED)
;
$countries = $locale->getText('countries');
$session
->setAttribute('current', true)
->setAttribute('countryName', (isset($countries[$session->getAttribute('countryCode')])) ? $countries[$session->getAttribute('countryCode')] : $locale->getText('locale.country.unknown'))
->setAttribute('countryName', (isset($countries[strtoupper($session->getAttribute('countryCode'))])) ? $countries[strtoupper($session->getAttribute('countryCode'))] : $locale->getText('locale.country.unknown'))
;
$response->dynamic($session, Response::MODEL_SESSION);
@ -679,8 +681,8 @@ App::get('/v1/account/sessions')
continue;
}
$token->setAttribute('countryName', (isset($countries[$token->getAttribute('contryCode')]))
? $countries[$token->getAttribute('contryCode')]
$token->setAttribute('countryName', (isset($countries[strtoupper($token->getAttribute('countryCode'))]))
? $countries[strtoupper($token->getAttribute('countryCode'))]
: $locale->getText('locale.country.unknown'));
$token->setAttribute('current', ($current == $token->getId()) ? true : false);

View file

@ -205,8 +205,8 @@ App::get('/v1/users/:userId/sessions')
continue;
}
$token->setAttribute('countryName', (isset($countries[$token->getAttribute('contryCode')]))
? $countries[$token->getAttribute('contryCode')]
$token->setAttribute('countryName', (isset($countries[strtoupper($token->getAttribute('contryCode'))]))
? $countries[strtoupper($token->getAttribute('contryCode'))]
: $locale->getText('locale.country.unknown'));
$token->setAttribute('current', false);
@ -373,6 +373,7 @@ App::patch('/v1/users/:userId/status')
App::patch('/v1/users/:userId/prefs')
->desc('Update User Preferences')
->groups(['api', 'users'])
->label('event', 'users.update.prefs')
->label('scope', 'users.write')
->label('sdk.platform', [APP_PLATFORM_SERVER])
->label('sdk.namespace', 'users')

View file

@ -117,7 +117,7 @@ App::init(function ($utopia, $request, $response, $console, $project, $user, $lo
->addHeader('Server', 'Appwrite')
->addHeader('X-Content-Type-Options', 'nosniff')
->addHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, PATCH, DELETE')
->addHeader('Access-Control-Allow-Headers', 'Origin, Cookie, Set-Cookie, X-Requested-With, Content-Type, Access-Control-Allow-Origin, Access-Control-Request-Headers, Accept, X-Appwrite-Project, X-Appwrite-Key, X-Appwrite-Locale, X-Appwrite-Mode, X-Appwrite-JWT, X-SDK-Version, Cache-Control, Expires, Pragma')
->addHeader('Access-Control-Allow-Headers', 'Origin, Cookie, Set-Cookie, X-Requested-With, Content-Type, Access-Control-Allow-Origin, Access-Control-Request-Headers, Accept, X-Appwrite-Project, X-Appwrite-Key, X-Appwrite-Locale, X-Appwrite-Mode, X-Appwrite-JWT, X-Appwrite-Response-Format, X-SDK-Version, Cache-Control, Expires, Pragma')
->addHeader('Access-Control-Expose-Headers', 'X-Fallback-Cookies')
->addHeader('Access-Control-Allow-Origin', $refDomain)
->addHeader('Access-Control-Allow-Credentials', 'true')
@ -237,7 +237,7 @@ App::options(function ($request, $response) {
$response
->addHeader('Server', 'Appwrite')
->addHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, PATCH, DELETE')
->addHeader('Access-Control-Allow-Headers', 'Origin, Cookie, Set-Cookie, X-Requested-With, Content-Type, Access-Control-Allow-Origin, Access-Control-Request-Headers, Accept, X-Appwrite-Project, X-Appwrite-Key, X-Appwrite-Locale, X-Appwrite-Mode, X-Appwrite-JWT, X-SDK-Version, Cache-Control, Expires, Pragma, X-Fallback-Cookies')
->addHeader('Access-Control-Allow-Headers', 'Origin, Cookie, Set-Cookie, X-Requested-With, Content-Type, Access-Control-Allow-Origin, Access-Control-Request-Headers, Accept, X-Appwrite-Project, X-Appwrite-Key, X-Appwrite-Locale, X-Appwrite-Mode, X-Appwrite-JWT, X-Appwrite-Response-Format, X-SDK-Version, Cache-Control, Expires, Pragma, X-Fallback-Cookies')
->addHeader('Access-Control-Expose-Headers', 'X-Fallback-Cookies')
->addHeader('Access-Control-Allow-Origin', $origin)
->addHeader('Access-Control-Allow-Credentials', 'true')

View file

@ -88,7 +88,7 @@ $http->on('request', function (SwooleRequest $swooleRequest, SwooleResponse $swo
return;
}
$app = new App('America/New_York');
$app = new App('UTC');
try {
Authorization::cleanRoles();

View file

@ -50,7 +50,7 @@ const APP_MODE_DEFAULT = 'default';
const APP_MODE_ADMIN = 'admin';
const APP_PAGING_LIMIT = 12;
const APP_CACHE_BUSTER = 144;
const APP_VERSION_STABLE = '0.7.0';
const APP_VERSION_STABLE = '0.7.1';
const APP_STORAGE_UPLOADS = '/storage/uploads';
const APP_STORAGE_FUNCTIONS = '/storage/functions';
const APP_STORAGE_CACHE = '/storage/cache';

View file

@ -28,10 +28,9 @@ foreach ([
realpath(__DIR__ . '/../vendor/felixfbecker'),
realpath(__DIR__ . '/../vendor/twig/twig'),
realpath(__DIR__ . '/../vendor/guzzlehttp/guzzle'),
realpath(__DIR__ . '/../vendor/domnikl'),
realpath(__DIR__ . '/../vendor/domnikl'),
realpath(__DIR__ . '/../vendor/slickdeals'),
realpath(__DIR__ . '/../vendor/psr/log'),
realpath(__DIR__ . '/../vendor/piwik'),
realpath(__DIR__ . '/../vendor/matomo'),
realpath(__DIR__ . '/../vendor/symfony'),
] as $key => $value) {
if($value !== false) {

View file

@ -96,6 +96,16 @@ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
$config = new CLI();
$config->setComposerVendor('appwrite');
$config->setComposerPackage('cli');
$config->setExecutableName('appwrite');
$config->setExecutableName('appwrite');
$config->setLogo("
_ _ _ ___ __ _____
/_\ _ __ _ ____ ___ __(_) |_ ___ / __\ / / \_ \
//_\\| '_ \| '_ \ \ /\ / / '__| | __/ _ \ / / / / / /\/
/ _ \ |_) | |_) \ V V /| | | | || __/ / /___/ /___/\/ /_
\_/ \_/ .__/| .__/ \_/\_/ |_| |_|\__\___| \____/\____/\____/
|_| |_|
");
break;
case 'php':
$config = new PHP();

View file

@ -53,14 +53,14 @@
"resque/php-resque": "1.3.6",
"matomo/device-detector": "4.1.0",
"dragonmantank/cron-expression": "3.1.0",
"domnikl/statsd": "3.0.2",
"influxdb/influxdb-php": "1.15.2",
"phpmailer/phpmailer": "6.3.0",
"chillerlan/php-qrcode": "4.3.0",
"adhocore/jwt": "1.1.2"
"adhocore/jwt": "1.1.2",
"slickdeals/statsd": "~3.0"
},
"require-dev": {
"appwrite/sdk-generator": "0.5.5",
"appwrite/sdk-generator": "0.6.2",
"phpunit/phpunit": "9.4.2",
"swoole/ide-helper": "4.5.5",
"textalk/websocket": "1.5.2",

132
composer.lock generated
View file

@ -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": "b579d6ac34eb119446727d63b21acca2",
"content-hash": "442d6d8b6c76ef7ae5ea26e500af6479",
"packages": [
{
"name": "adhocore/jwt",
@ -297,61 +297,6 @@
},
"time": "2020-11-06T16:09:14+00:00"
},
{
"name": "domnikl/statsd",
"version": "3.0.2",
"source": {
"type": "git",
"url": "https://github.com/domnikl/statsd-php.git",
"reference": "393c6565efbfb23c8296ae3099a62fb6366c6ce3"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/domnikl/statsd-php/zipball/393c6565efbfb23c8296ae3099a62fb6366c6ce3",
"reference": "393c6565efbfb23c8296ae3099a62fb6366c6ce3",
"shasum": ""
},
"require": {
"php": ">= 7.2"
},
"require-dev": {
"flyeralarm/php-code-validator": "^2.2",
"phpunit/phpunit": "~8.0",
"vimeo/psalm": "^3.4"
},
"type": "library",
"autoload": {
"psr-4": {
"Domnikl\\Statsd\\": "src/",
"Domnikl\\Test\\Statsd\\": "tests/unit"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Dominik Liebler",
"email": "liebler.dominik@gmail.com"
}
],
"description": "a PHP client for statsd",
"homepage": "https://domnikl.github.com/statsd-php",
"keywords": [
"Metrics",
"monitoring",
"statistics",
"statsd",
"udp"
],
"support": {
"issues": "https://github.com/domnikl/statsd-php/issues",
"source": "https://github.com/domnikl/statsd-php/tree/master"
},
"abandoned": "slickdeals/statsd",
"time": "2020-01-03T14:24:58+00:00"
},
{
"name": "dragonmantank/cron-expression",
"version": "v3.1.0",
@ -577,12 +522,12 @@
"source": {
"type": "git",
"url": "https://github.com/guzzle/psr7.git",
"reference": "d7fe0a0eabc266c3dcf2f20aa12121044ff196a4"
"reference": "2f3e4f6cf8fd4aad7624c90a94f0ab38fde25976"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/guzzle/psr7/zipball/d7fe0a0eabc266c3dcf2f20aa12121044ff196a4",
"reference": "d7fe0a0eabc266c3dcf2f20aa12121044ff196a4",
"url": "https://api.github.com/repos/guzzle/psr7/zipball/2f3e4f6cf8fd4aad7624c90a94f0ab38fde25976",
"reference": "2f3e4f6cf8fd4aad7624c90a94f0ab38fde25976",
"shasum": ""
},
"require": {
@ -644,7 +589,7 @@
"issues": "https://github.com/guzzle/psr7/issues",
"source": "https://github.com/guzzle/psr7/tree/1.x"
},
"time": "2021-03-09T14:42:40+00:00"
"time": "2021-03-02T18:57:24+00:00"
},
{
"name": "influxdb/influxdb-php",
@ -1192,6 +1137,59 @@
},
"time": "2020-04-16T16:39:50+00:00"
},
{
"name": "slickdeals/statsd",
"version": "3.0.2",
"source": {
"type": "git",
"url": "https://github.com/Slickdeals/statsd-php.git",
"reference": "393c6565efbfb23c8296ae3099a62fb6366c6ce3"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/Slickdeals/statsd-php/zipball/393c6565efbfb23c8296ae3099a62fb6366c6ce3",
"reference": "393c6565efbfb23c8296ae3099a62fb6366c6ce3",
"shasum": ""
},
"require": {
"php": ">= 7.2"
},
"require-dev": {
"flyeralarm/php-code-validator": "^2.2",
"phpunit/phpunit": "~8.0",
"vimeo/psalm": "^3.4"
},
"type": "library",
"autoload": {
"psr-4": {
"Domnikl\\Statsd\\": "src/",
"Domnikl\\Test\\Statsd\\": "tests/unit"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Dominik Liebler",
"email": "liebler.dominik@gmail.com"
}
],
"description": "a PHP client for statsd",
"homepage": "https://domnikl.github.com/statsd-php",
"keywords": [
"Metrics",
"monitoring",
"statistics",
"statsd",
"udp"
],
"support": {
"source": "https://github.com/Slickdeals/statsd-php/tree/3.0.2"
},
"time": "2020-01-03T14:24:58+00:00"
},
{
"name": "symfony/polyfill-ctype",
"version": "dev-main",
@ -2070,12 +2068,12 @@
"source": {
"type": "git",
"url": "https://github.com/webmozarts/assert.git",
"reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389"
"reference": "4631e2c7d2d7132adac9fd84d4c1a98c10a6e049"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/webmozarts/assert/zipball/bafc69caeb4d49c39fd0779086c03a3738cbb389",
"reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389",
"url": "https://api.github.com/repos/webmozarts/assert/zipball/4631e2c7d2d7132adac9fd84d4c1a98c10a6e049",
"reference": "4631e2c7d2d7132adac9fd84d4c1a98c10a6e049",
"shasum": ""
},
"require": {
@ -2115,7 +2113,7 @@
"issues": "https://github.com/webmozarts/assert/issues",
"source": "https://github.com/webmozarts/assert/tree/1.9.1"
},
"time": "2020-07-08T17:02:28+00:00"
"time": "2021-02-28T20:01:57+00:00"
}
],
"packages-dev": [
@ -2289,11 +2287,11 @@
},
{
"name": "appwrite/sdk-generator",
"version": "0.5.5",
"version": "0.6.2",
"source": {
"type": "git",
"url": "https://github.com/appwrite/sdk-generator",
"reference": "08d6dc72f83ec99cfc0f7a50cb7fc0be0c029ac1"
"reference": "d96376295c9265a054634d21dcdbfc02b832c677"
},
"require": {
"ext-curl": "*",
@ -2323,7 +2321,7 @@
}
],
"description": "Appwrite PHP library for generating API SDKs for multiple programming languages and platforms",
"time": "2021-02-18T16:37:32+00:00"
"time": "2021-03-03T12:53:32+00:00"
},
{
"name": "composer/package-versions-deprecated",

View file

@ -8,7 +8,6 @@ void main() { // Init SDK
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
.setProject('5df5acd0d48c2') // Your project ID
;
Future result = account.createOAuth2Session(
provider: 'amazon',
);
@ -19,4 +18,4 @@ void main() { // Init SDK
}).catchError((error) {
print(error.response);
});
}
}

View file

@ -8,7 +8,6 @@ void main() { // Init SDK
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
.setProject('5df5acd0d48c2') // Your project ID
;
Future result = account.createRecovery(
email: 'email@example.com',
url: 'https://example.com',
@ -20,4 +19,4 @@ void main() { // Init SDK
}).catchError((error) {
print(error.response);
});
}
}

View file

@ -8,7 +8,6 @@ void main() { // Init SDK
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
.setProject('5df5acd0d48c2') // Your project ID
;
Future result = account.createSession(
email: 'email@example.com',
password: 'password',
@ -20,4 +19,4 @@ void main() { // Init SDK
}).catchError((error) {
print(error.response);
});
}
}

View file

@ -8,7 +8,6 @@ void main() { // Init SDK
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
.setProject('5df5acd0d48c2') // Your project ID
;
Future result = account.createVerification(
url: 'https://example.com',
);
@ -19,4 +18,4 @@ void main() { // Init SDK
}).catchError((error) {
print(error.response);
});
}
}

View file

@ -8,7 +8,6 @@ void main() { // Init SDK
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
.setProject('5df5acd0d48c2') // Your project ID
;
Future result = account.create(
email: 'email@example.com',
password: 'password',
@ -20,4 +19,4 @@ void main() { // Init SDK
}).catchError((error) {
print(error.response);
});
}
}

View file

@ -8,7 +8,6 @@ void main() { // Init SDK
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
.setProject('5df5acd0d48c2') // Your project ID
;
Future result = account.deleteSession(
sessionId: '[SESSION_ID]',
);
@ -19,4 +18,4 @@ void main() { // Init SDK
}).catchError((error) {
print(error.response);
});
}
}

View file

@ -8,7 +8,6 @@ void main() { // Init SDK
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
.setProject('5df5acd0d48c2') // Your project ID
;
Future result = account.deleteSessions();
result
@ -17,4 +16,4 @@ void main() { // Init SDK
}).catchError((error) {
print(error.response);
});
}
}

View file

@ -8,7 +8,6 @@ void main() { // Init SDK
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
.setProject('5df5acd0d48c2') // Your project ID
;
Future result = account.delete();
result
@ -17,4 +16,4 @@ void main() { // Init SDK
}).catchError((error) {
print(error.response);
});
}
}

View file

@ -8,7 +8,6 @@ void main() { // Init SDK
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
.setProject('5df5acd0d48c2') // Your project ID
;
Future result = account.getLogs();
result
@ -17,4 +16,4 @@ void main() { // Init SDK
}).catchError((error) {
print(error.response);
});
}
}

View file

@ -8,7 +8,6 @@ void main() { // Init SDK
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
.setProject('5df5acd0d48c2') // Your project ID
;
Future result = account.getPrefs();
result
@ -17,4 +16,4 @@ void main() { // Init SDK
}).catchError((error) {
print(error.response);
});
}
}

View file

@ -8,7 +8,6 @@ void main() { // Init SDK
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
.setProject('5df5acd0d48c2') // Your project ID
;
Future result = account.getSessions();
result
@ -17,4 +16,4 @@ void main() { // Init SDK
}).catchError((error) {
print(error.response);
});
}
}

View file

@ -8,7 +8,6 @@ void main() { // Init SDK
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
.setProject('5df5acd0d48c2') // Your project ID
;
Future result = account.get();
result
@ -17,4 +16,4 @@ void main() { // Init SDK
}).catchError((error) {
print(error.response);
});
}
}

View file

@ -8,7 +8,6 @@ void main() { // Init SDK
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
.setProject('5df5acd0d48c2') // Your project ID
;
Future result = account.updateEmail(
email: 'email@example.com',
password: 'password',
@ -20,4 +19,4 @@ void main() { // Init SDK
}).catchError((error) {
print(error.response);
});
}
}

View file

@ -8,7 +8,6 @@ void main() { // Init SDK
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
.setProject('5df5acd0d48c2') // Your project ID
;
Future result = account.updateName(
name: '[NAME]',
);
@ -19,4 +18,4 @@ void main() { // Init SDK
}).catchError((error) {
print(error.response);
});
}
}

View file

@ -8,7 +8,6 @@ void main() { // Init SDK
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
.setProject('5df5acd0d48c2') // Your project ID
;
Future result = account.updatePassword(
password: 'password',
oldPassword: 'password',
@ -20,4 +19,4 @@ void main() { // Init SDK
}).catchError((error) {
print(error.response);
});
}
}

View file

@ -8,7 +8,6 @@ void main() { // Init SDK
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
.setProject('5df5acd0d48c2') // Your project ID
;
Future result = account.updatePrefs(
prefs: {},
);
@ -19,4 +18,4 @@ void main() { // Init SDK
}).catchError((error) {
print(error.response);
});
}
}

View file

@ -8,7 +8,6 @@ void main() { // Init SDK
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
.setProject('5df5acd0d48c2') // Your project ID
;
Future result = account.updateRecovery(
userId: '[USER_ID]',
secret: '[SECRET]',
@ -22,4 +21,4 @@ void main() { // Init SDK
}).catchError((error) {
print(error.response);
});
}
}

View file

@ -8,7 +8,6 @@ void main() { // Init SDK
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
.setProject('5df5acd0d48c2') // Your project ID
;
Future result = account.updateVerification(
userId: '[USER_ID]',
secret: '[SECRET]',
@ -20,4 +19,4 @@ void main() { // Init SDK
}).catchError((error) {
print(error.response);
});
}
}

View file

@ -8,10 +8,18 @@ void main() { // Init SDK
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
.setProject('5df5acd0d48c2') // Your project ID
;
}
String result = avatars.getBrowser(
//displaying image
FutureBuilder(
future: avatars.getBrowser(
code: 'aa',
);
print(result); // Resource URL string
}
), //works for both public file and private file, for private files you need to be logged in
builder: (context, snapshot) {
return snapshot.hasData && snapshot.data != null
? Image.memory(
snapshot.data.data,
)
: CircularProgressIndicator();
},
);

View file

@ -8,10 +8,18 @@ void main() { // Init SDK
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
.setProject('5df5acd0d48c2') // Your project ID
;
}
String result = avatars.getCreditCard(
//displaying image
FutureBuilder(
future: avatars.getCreditCard(
code: 'amex',
);
print(result); // Resource URL string
}
), //works for both public file and private file, for private files you need to be logged in
builder: (context, snapshot) {
return snapshot.hasData && snapshot.data != null
? Image.memory(
snapshot.data.data,
)
: CircularProgressIndicator();
},
);

View file

@ -8,10 +8,18 @@ void main() { // Init SDK
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
.setProject('5df5acd0d48c2') // Your project ID
;
}
String result = avatars.getFavicon(
//displaying image
FutureBuilder(
future: avatars.getFavicon(
url: 'https://example.com',
);
print(result); // Resource URL string
}
), //works for both public file and private file, for private files you need to be logged in
builder: (context, snapshot) {
return snapshot.hasData && snapshot.data != null
? Image.memory(
snapshot.data.data,
)
: CircularProgressIndicator();
},
);

View file

@ -8,10 +8,18 @@ void main() { // Init SDK
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
.setProject('5df5acd0d48c2') // Your project ID
;
}
String result = avatars.getFlag(
//displaying image
FutureBuilder(
future: avatars.getFlag(
code: 'af',
);
print(result); // Resource URL string
}
), //works for both public file and private file, for private files you need to be logged in
builder: (context, snapshot) {
return snapshot.hasData && snapshot.data != null
? Image.memory(
snapshot.data.data,
)
: CircularProgressIndicator();
},
);

View file

@ -8,10 +8,18 @@ void main() { // Init SDK
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
.setProject('5df5acd0d48c2') // Your project ID
;
}
String result = avatars.getImage(
//displaying image
FutureBuilder(
future: avatars.getImage(
url: 'https://example.com',
);
print(result); // Resource URL string
}
), //works for both public file and private file, for private files you need to be logged in
builder: (context, snapshot) {
return snapshot.hasData && snapshot.data != null
? Image.memory(
snapshot.data.data,
)
: CircularProgressIndicator();
},
);

View file

@ -8,9 +8,17 @@ void main() { // Init SDK
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
.setProject('5df5acd0d48c2') // Your project ID
;
}
String result = avatars.getInitials(
);
print(result); // Resource URL string
}
//displaying image
FutureBuilder(
future: avatars.getInitials(
), //works for both public file and private file, for private files you need to be logged in
builder: (context, snapshot) {
return snapshot.hasData && snapshot.data != null
? Image.memory(
snapshot.data.data,
)
: CircularProgressIndicator();
},
);

View file

@ -8,10 +8,18 @@ void main() { // Init SDK
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
.setProject('5df5acd0d48c2') // Your project ID
;
}
String result = avatars.getQR(
//displaying image
FutureBuilder(
future: avatars.getQR(
text: '[TEXT]',
);
print(result); // Resource URL string
}
), //works for both public file and private file, for private files you need to be logged in
builder: (context, snapshot) {
return snapshot.hasData && snapshot.data != null
? Image.memory(
snapshot.data.data,
)
: CircularProgressIndicator();
},
);

View file

@ -8,7 +8,6 @@ void main() { // Init SDK
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
.setProject('5df5acd0d48c2') // Your project ID
;
Future result = database.createDocument(
collectionId: '[COLLECTION_ID]',
data: {},
@ -22,4 +21,4 @@ void main() { // Init SDK
}).catchError((error) {
print(error.response);
});
}
}

View file

@ -8,7 +8,6 @@ void main() { // Init SDK
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
.setProject('5df5acd0d48c2') // Your project ID
;
Future result = database.deleteDocument(
collectionId: '[COLLECTION_ID]',
documentId: '[DOCUMENT_ID]',
@ -20,4 +19,4 @@ void main() { // Init SDK
}).catchError((error) {
print(error.response);
});
}
}

View file

@ -8,7 +8,6 @@ void main() { // Init SDK
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
.setProject('5df5acd0d48c2') // Your project ID
;
Future result = database.getDocument(
collectionId: '[COLLECTION_ID]',
documentId: '[DOCUMENT_ID]',
@ -20,4 +19,4 @@ void main() { // Init SDK
}).catchError((error) {
print(error.response);
});
}
}

View file

@ -8,7 +8,6 @@ void main() { // Init SDK
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
.setProject('5df5acd0d48c2') // Your project ID
;
Future result = database.listDocuments(
collectionId: '[COLLECTION_ID]',
);
@ -19,4 +18,4 @@ void main() { // Init SDK
}).catchError((error) {
print(error.response);
});
}
}

View file

@ -8,7 +8,6 @@ void main() { // Init SDK
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
.setProject('5df5acd0d48c2') // Your project ID
;
Future result = database.updateDocument(
collectionId: '[COLLECTION_ID]',
documentId: '[DOCUMENT_ID]',
@ -23,4 +22,4 @@ void main() { // Init SDK
}).catchError((error) {
print(error.response);
});
}
}

View file

@ -8,7 +8,6 @@ void main() { // Init SDK
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
.setProject('5df5acd0d48c2') // Your project ID
;
Future result = functions.createExecution(
functionId: '[FUNCTION_ID]',
);
@ -19,4 +18,4 @@ void main() { // Init SDK
}).catchError((error) {
print(error.response);
});
}
}

View file

@ -8,7 +8,6 @@ void main() { // Init SDK
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
.setProject('5df5acd0d48c2') // Your project ID
;
Future result = functions.getExecution(
functionId: '[FUNCTION_ID]',
executionId: '[EXECUTION_ID]',
@ -20,4 +19,4 @@ void main() { // Init SDK
}).catchError((error) {
print(error.response);
});
}
}

View file

@ -8,7 +8,6 @@ void main() { // Init SDK
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
.setProject('5df5acd0d48c2') // Your project ID
;
Future result = functions.listExecutions(
functionId: '[FUNCTION_ID]',
);
@ -19,4 +18,4 @@ void main() { // Init SDK
}).catchError((error) {
print(error.response);
});
}
}

View file

@ -8,7 +8,6 @@ void main() { // Init SDK
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
.setProject('5df5acd0d48c2') // Your project ID
;
Future result = locale.getContinents();
result
@ -17,4 +16,4 @@ void main() { // Init SDK
}).catchError((error) {
print(error.response);
});
}
}

View file

@ -8,7 +8,6 @@ void main() { // Init SDK
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
.setProject('5df5acd0d48c2') // Your project ID
;
Future result = locale.getCountriesEU();
result
@ -17,4 +16,4 @@ void main() { // Init SDK
}).catchError((error) {
print(error.response);
});
}
}

View file

@ -8,7 +8,6 @@ void main() { // Init SDK
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
.setProject('5df5acd0d48c2') // Your project ID
;
Future result = locale.getCountriesPhones();
result
@ -17,4 +16,4 @@ void main() { // Init SDK
}).catchError((error) {
print(error.response);
});
}
}

View file

@ -8,7 +8,6 @@ void main() { // Init SDK
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
.setProject('5df5acd0d48c2') // Your project ID
;
Future result = locale.getCountries();
result
@ -17,4 +16,4 @@ void main() { // Init SDK
}).catchError((error) {
print(error.response);
});
}
}

View file

@ -8,7 +8,6 @@ void main() { // Init SDK
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
.setProject('5df5acd0d48c2') // Your project ID
;
Future result = locale.getCurrencies();
result
@ -17,4 +16,4 @@ void main() { // Init SDK
}).catchError((error) {
print(error.response);
});
}
}

View file

@ -8,7 +8,6 @@ void main() { // Init SDK
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
.setProject('5df5acd0d48c2') // Your project ID
;
Future result = locale.getLanguages();
result
@ -17,4 +16,4 @@ void main() { // Init SDK
}).catchError((error) {
print(error.response);
});
}
}

View file

@ -8,7 +8,6 @@ void main() { // Init SDK
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
.setProject('5df5acd0d48c2') // Your project ID
;
Future result = locale.get();
result
@ -17,4 +16,4 @@ void main() { // Init SDK
}).catchError((error) {
print(error.response);
});
}
}

View file

@ -9,7 +9,6 @@ void main() { // Init SDK
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
.setProject('5df5acd0d48c2') // Your project ID
;
Future result = storage.createFile(
file: await MultipartFile.fromFile('./path-to-files/image.jpg', 'image.jpg'),
read: [],
@ -22,4 +21,4 @@ void main() { // Init SDK
}).catchError((error) {
print(error.response);
});
}
}

View file

@ -8,7 +8,6 @@ void main() { // Init SDK
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
.setProject('5df5acd0d48c2') // Your project ID
;
Future result = storage.deleteFile(
fileId: '[FILE_ID]',
);
@ -19,4 +18,4 @@ void main() { // Init SDK
}).catchError((error) {
print(error.response);
});
}
}

View file

@ -8,10 +8,18 @@ void main() { // Init SDK
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
.setProject('5df5acd0d48c2') // Your project ID
;
}
String result = storage.getFileDownload(
//displaying image
FutureBuilder(
future: storage.getFileDownload(
fileId: '[FILE_ID]',
);
print(result); // Resource URL string
}
), //works for both public file and private file, for private files you need to be logged in
builder: (context, snapshot) {
return snapshot.hasData && snapshot.data != null
? Image.memory(
snapshot.data.data,
)
: CircularProgressIndicator();
},
);

View file

@ -8,10 +8,18 @@ void main() { // Init SDK
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
.setProject('5df5acd0d48c2') // Your project ID
;
}
String result = storage.getFilePreview(
//displaying image
FutureBuilder(
future: storage.getFilePreview(
fileId: '[FILE_ID]',
);
print(result); // Resource URL string
}
), //works for both public file and private file, for private files you need to be logged in
builder: (context, snapshot) {
return snapshot.hasData && snapshot.data != null
? Image.memory(
snapshot.data.data,
)
: CircularProgressIndicator();
},
);

View file

@ -8,10 +8,18 @@ void main() { // Init SDK
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
.setProject('5df5acd0d48c2') // Your project ID
;
}
String result = storage.getFileView(
//displaying image
FutureBuilder(
future: storage.getFileView(
fileId: '[FILE_ID]',
);
print(result); // Resource URL string
}
), //works for both public file and private file, for private files you need to be logged in
builder: (context, snapshot) {
return snapshot.hasData && snapshot.data != null
? Image.memory(
snapshot.data.data,
)
: CircularProgressIndicator();
},
);

View file

@ -8,7 +8,6 @@ void main() { // Init SDK
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
.setProject('5df5acd0d48c2') // Your project ID
;
Future result = storage.getFile(
fileId: '[FILE_ID]',
);
@ -19,4 +18,4 @@ void main() { // Init SDK
}).catchError((error) {
print(error.response);
});
}
}

View file

@ -8,7 +8,6 @@ void main() { // Init SDK
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
.setProject('5df5acd0d48c2') // Your project ID
;
Future result = storage.listFiles(
);
@ -18,4 +17,4 @@ void main() { // Init SDK
}).catchError((error) {
print(error.response);
});
}
}

View file

@ -8,7 +8,6 @@ void main() { // Init SDK
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
.setProject('5df5acd0d48c2') // Your project ID
;
Future result = storage.updateFile(
fileId: '[FILE_ID]',
read: [],
@ -21,4 +20,4 @@ void main() { // Init SDK
}).catchError((error) {
print(error.response);
});
}
}

View file

@ -8,7 +8,6 @@ void main() { // Init SDK
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
.setProject('5df5acd0d48c2') // Your project ID
;
Future result = teams.createMembership(
teamId: '[TEAM_ID]',
email: 'email@example.com',
@ -22,4 +21,4 @@ void main() { // Init SDK
}).catchError((error) {
print(error.response);
});
}
}

View file

@ -8,7 +8,6 @@ void main() { // Init SDK
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
.setProject('5df5acd0d48c2') // Your project ID
;
Future result = teams.create(
name: '[NAME]',
);
@ -19,4 +18,4 @@ void main() { // Init SDK
}).catchError((error) {
print(error.response);
});
}
}

View file

@ -8,7 +8,6 @@ void main() { // Init SDK
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
.setProject('5df5acd0d48c2') // Your project ID
;
Future result = teams.deleteMembership(
teamId: '[TEAM_ID]',
inviteId: '[INVITE_ID]',
@ -20,4 +19,4 @@ void main() { // Init SDK
}).catchError((error) {
print(error.response);
});
}
}

View file

@ -8,7 +8,6 @@ void main() { // Init SDK
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
.setProject('5df5acd0d48c2') // Your project ID
;
Future result = teams.delete(
teamId: '[TEAM_ID]',
);
@ -19,4 +18,4 @@ void main() { // Init SDK
}).catchError((error) {
print(error.response);
});
}
}

View file

@ -8,7 +8,6 @@ void main() { // Init SDK
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
.setProject('5df5acd0d48c2') // Your project ID
;
Future result = teams.getMemberships(
teamId: '[TEAM_ID]',
);
@ -19,4 +18,4 @@ void main() { // Init SDK
}).catchError((error) {
print(error.response);
});
}
}

View file

@ -8,7 +8,6 @@ void main() { // Init SDK
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
.setProject('5df5acd0d48c2') // Your project ID
;
Future result = teams.get(
teamId: '[TEAM_ID]',
);
@ -19,4 +18,4 @@ void main() { // Init SDK
}).catchError((error) {
print(error.response);
});
}
}

View file

@ -8,7 +8,6 @@ void main() { // Init SDK
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
.setProject('5df5acd0d48c2') // Your project ID
;
Future result = teams.list(
);
@ -18,4 +17,4 @@ void main() { // Init SDK
}).catchError((error) {
print(error.response);
});
}
}

View file

@ -8,7 +8,6 @@ void main() { // Init SDK
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
.setProject('5df5acd0d48c2') // Your project ID
;
Future result = teams.updateMembershipStatus(
teamId: '[TEAM_ID]',
inviteId: '[INVITE_ID]',
@ -22,4 +21,4 @@ void main() { // Init SDK
}).catchError((error) {
print(error.response);
});
}
}

View file

@ -8,7 +8,6 @@ void main() { // Init SDK
.setEndpoint('https://[HOSTNAME_OR_IP]/v1') // Your API Endpoint
.setProject('5df5acd0d48c2') // Your project ID
;
Future result = teams.update(
teamId: '[TEAM_ID]',
name: '[NAME]',
@ -20,4 +19,4 @@ void main() { // Init SDK
}).catchError((error) {
print(error.response);
});
}
}

View file

@ -10,9 +10,14 @@ void main() { // Init SDK
.setKey('919c2d18fb5d4...a2ae413da83346ad2') // Your secret API key
;
String result = avatars.getBrowser(
Future result = avatars.getBrowser(
code: 'aa',
);
print(result); // Resource URL string
result
.then((response) {
print(response);
}).catchError((error) {
print(error.response);
});
}

View file

@ -10,9 +10,14 @@ void main() { // Init SDK
.setKey('919c2d18fb5d4...a2ae413da83346ad2') // Your secret API key
;
String result = avatars.getCreditCard(
Future result = avatars.getCreditCard(
code: 'amex',
);
print(result); // Resource URL string
result
.then((response) {
print(response);
}).catchError((error) {
print(error.response);
});
}

View file

@ -10,9 +10,14 @@ void main() { // Init SDK
.setKey('919c2d18fb5d4...a2ae413da83346ad2') // Your secret API key
;
String result = avatars.getFavicon(
Future result = avatars.getFavicon(
url: 'https://example.com',
);
print(result); // Resource URL string
result
.then((response) {
print(response);
}).catchError((error) {
print(error.response);
});
}

View file

@ -10,9 +10,14 @@ void main() { // Init SDK
.setKey('919c2d18fb5d4...a2ae413da83346ad2') // Your secret API key
;
String result = avatars.getFlag(
Future result = avatars.getFlag(
code: 'af',
);
print(result); // Resource URL string
result
.then((response) {
print(response);
}).catchError((error) {
print(error.response);
});
}

View file

@ -10,9 +10,14 @@ void main() { // Init SDK
.setKey('919c2d18fb5d4...a2ae413da83346ad2') // Your secret API key
;
String result = avatars.getImage(
Future result = avatars.getImage(
url: 'https://example.com',
);
print(result); // Resource URL string
result
.then((response) {
print(response);
}).catchError((error) {
print(error.response);
});
}

View file

@ -10,8 +10,13 @@ void main() { // Init SDK
.setKey('919c2d18fb5d4...a2ae413da83346ad2') // Your secret API key
;
String result = avatars.getInitials(
Future result = avatars.getInitials(
);
print(result); // Resource URL string
result
.then((response) {
print(response);
}).catchError((error) {
print(error.response);
});
}

View file

@ -10,9 +10,14 @@ void main() { // Init SDK
.setKey('919c2d18fb5d4...a2ae413da83346ad2') // Your secret API key
;
String result = avatars.getQR(
Future result = avatars.getQR(
text: '[TEXT]',
);
print(result); // Resource URL string
result
.then((response) {
print(response);
}).catchError((error) {
print(error.response);
});
}

View file

@ -10,9 +10,14 @@ void main() { // Init SDK
.setKey('919c2d18fb5d4...a2ae413da83346ad2') // Your secret API key
;
String result = storage.getFileDownload(
Future result = storage.getFileDownload(
fileId: '[FILE_ID]',
);
print(result); // Resource URL string
result
.then((response) {
print(response);
}).catchError((error) {
print(error.response);
});
}

View file

@ -10,9 +10,14 @@ void main() { // Init SDK
.setKey('919c2d18fb5d4...a2ae413da83346ad2') // Your secret API key
;
String result = storage.getFilePreview(
Future result = storage.getFilePreview(
fileId: '[FILE_ID]',
);
print(result); // Resource URL string
result
.then((response) {
print(response);
}).catchError((error) {
print(error.response);
});
}

View file

@ -10,9 +10,14 @@ void main() { // Init SDK
.setKey('919c2d18fb5d4...a2ae413da83346ad2') // Your secret API key
;
String result = storage.getFileView(
Future result = storage.getFileView(
fileId: '[FILE_ID]',
);
print(result); // Resource URL string
result
.then((response) {
print(response);
}).catchError((error) {
print(error.response);
});
}

View file

@ -1,3 +1,17 @@
## 0.3.1
- Minor fixes for custom exceptions
## 0.3.0
- Improved code quality
- Added a custom Appwrite exception
- Enabled access to private storage file
## 0.2.0
- Upgraded to work with Appwrite 0.7
## 0.1.0
- First release

View file

@ -1,3 +1,17 @@
## 0.4.0-dev.2
- Minor fixes for custom exceptions
## 0.4.0-dev.1
- Improved code quality
- Enabled access to private storage file
- Added easier integration for preview images and the Image widget
## 0.3.0
- Upgraded to work with Appwrite 0.7
## 0.3.0-dev.2
- Fix for an error when using a self-signed certificate for Web

View file

@ -26,7 +26,7 @@ class HTTPTest extends Scope
$this->assertEquals(204, $response['headers']['status-code']);
$this->assertEquals('Appwrite', $response['headers']['server']);
$this->assertEquals('GET, POST, PUT, PATCH, DELETE', $response['headers']['access-control-allow-methods']);
$this->assertEquals('Origin, Cookie, Set-Cookie, X-Requested-With, Content-Type, Access-Control-Allow-Origin, Access-Control-Request-Headers, Accept, X-Appwrite-Project, X-Appwrite-Key, X-Appwrite-Locale, X-Appwrite-Mode, X-Appwrite-JWT, X-SDK-Version, Cache-Control, Expires, Pragma, X-Fallback-Cookies', $response['headers']['access-control-allow-headers']);
$this->assertEquals('Origin, Cookie, Set-Cookie, X-Requested-With, Content-Type, Access-Control-Allow-Origin, Access-Control-Request-Headers, Accept, X-Appwrite-Project, X-Appwrite-Key, X-Appwrite-Locale, X-Appwrite-Mode, X-Appwrite-JWT, X-Appwrite-Response-Format, X-SDK-Version, Cache-Control, Expires, Pragma, X-Fallback-Cookies', $response['headers']['access-control-allow-headers']);
$this->assertEquals('X-Fallback-Cookies', $response['headers']['access-control-expose-headers']);
$this->assertEquals('http://localhost', $response['headers']['access-control-allow-origin']);
$this->assertEquals('true', $response['headers']['access-control-allow-credentials']);

View file

@ -117,6 +117,7 @@ trait ProjectCustom
'storage.files.update',
'storage.files.delete',
'users.create',
'users.update.prefs',
'users.update.status',
'users.delete',
'users.sessions.delete',

View file

@ -186,10 +186,43 @@ class WebhooksCustomServerTest extends Scope
*/
return ['userId' => $user['body']['$id'], 'name' => $user['body']['name'], 'email' => $user['body']['email']];
}
/**
/**
* @depends testCreateUser
*/
public function testUpdateUserPrefs(array $data):array
{
/**
* Test for SUCCESS
*/
$user = $this->client->call(Client::METHOD_PATCH, '/users/' . $data['userId'] . '/prefs', array_merge([
'content-type' => 'application/json',
'x-appwrite-project' => $this->getProject()['$id'],
], $this->getHeaders()), [
'prefs' => ['a' => 'b']
]);
$this->assertEquals($user['headers']['status-code'], 200);
$this->assertEquals($user['body']['a'], 'b');
$webhook = $this->getLastRequest();
$this->assertEquals($webhook['method'], 'POST');
$this->assertEquals($webhook['headers']['Content-Type'], 'application/json');
$this->assertEquals($webhook['headers']['User-Agent'], 'Appwrite-Server vdev. Please report abuse at security@appwrite.io');
$this->assertEquals($webhook['headers']['X-Appwrite-Webhook-Event'], 'users.update.prefs');
$this->assertEquals($webhook['headers']['X-Appwrite-Webhook-Signature'], 'not-yet-implemented');
$this->assertEquals($webhook['headers']['X-Appwrite-Webhook-Id'] ?? '', $this->getProject()['webhookId']);
$this->assertEquals($webhook['headers']['X-Appwrite-Webhook-Project-Id'] ?? '', $this->getProject()['$id']);
$this->assertEquals(empty($webhook['headers']['X-Appwrite-Webhook-User-Id'] ?? ''), ('server' === $this->getSide()));
$this->assertEquals($webhook['data']['a'], 'b');
return $data;
}
/**
* @depends testUpdateUserPrefs
*/
public function testUpdateUserStatus(array $data):array
{
/**
@ -221,7 +254,7 @@ class WebhooksCustomServerTest extends Scope
$this->assertEquals($webhook['data']['status'], 2);
$this->assertEquals($webhook['data']['email'], $data['email']);
$this->assertEquals($webhook['data']['emailVerification'], false);
$this->assertEquals($webhook['data']['prefs'], []);
$this->assertEquals($webhook['data']['prefs']['a'], 'b');
return $data;
}
@ -257,8 +290,8 @@ class WebhooksCustomServerTest extends Scope
$this->assertEquals($webhook['data']['status'], 2);
$this->assertEquals($webhook['data']['email'], $data['email']);
$this->assertEquals($webhook['data']['emailVerification'], false);
$this->assertEquals($webhook['data']['prefs'], []);
$this->assertEquals($webhook['data']['prefs']['a'], 'b');
return $data;
}
}
}