mirror of
https://github.com/appwrite/appwrite.git
synced 2026-05-26 13:51:13 +00:00
Merge branch '0.7.x' of github.com:appwrite/appwrite into swoole-and-functions
This commit is contained in:
@@ -24,6 +24,14 @@
|
||||
- Now using Alpine as base Docker image
|
||||
- Upgraded device detctor to version 3.12.6
|
||||
- Upgraded MariaDB to version 10.5.5
|
||||
- User name max length is now 128 chars and not 100 for better API consistency
|
||||
- Team name max length is now 128 chars and not 100 for better API consistency
|
||||
- Collection name max length is now 128 chars and not 256 for better API consistency
|
||||
- Project name max length is now 128 chars and not 100 for better API consistency
|
||||
- Webhook name max length is now 128 chars and not 256 for better API consistency
|
||||
- API Key name max length is now 128 chars and not 256 for better API consistency
|
||||
- Task name max length is now 128 chars and not 256 for better API consistency
|
||||
- Platform name max length is now 128 chars and not 256 for better API consistency
|
||||
- New and consistent response format for all API object + new response examples in the docs
|
||||
- Removed user roles attribute from user object (can be fetched from /v1/teams/memberships) **
|
||||
- Removed type attribute from session object response (used only internally)
|
||||
|
||||
+1
-1
@@ -84,7 +84,7 @@ We use prettier for our JS coding standards and for auto-formatting our code.
|
||||
|
||||
Appwrite is built to scale. Please keep in mind that the Appwrite stack can run in different environments and different scales.
|
||||
|
||||
We wish Appwrite will be as easy to set up and in a single, localhost, and easy to grow to a large environment with thousands and even hundreds of instances.
|
||||
We wish Appwrite will be as easy to set up and in a single, localhost, and easy to grow to a large environment with dozens and even hundreds of instances.
|
||||
|
||||
When contributing code, please take into account the following considerations:
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
<br />
|
||||
</p>
|
||||
|
||||
[](#contributing)
|
||||
[](CONTRIBUTING.md)
|
||||
[](https://discord.gg/GSeTUeA)
|
||||
[](https://travis-ci.org/appwrite/appwrite)
|
||||
[](https://travis-ci.org/appwrite/appwrite)
|
||||
|
||||
@@ -30,7 +30,7 @@ return [
|
||||
[
|
||||
'key' => 'flutter',
|
||||
'name' => 'Flutter',
|
||||
'version' => '0.2.3',
|
||||
'version' => '0.3.0-dev.1',
|
||||
'url' => 'https://github.com/appwrite/sdk-for-flutter',
|
||||
'enabled' => true,
|
||||
'beta' => true,
|
||||
@@ -45,7 +45,7 @@ return [
|
||||
[
|
||||
'key' => 'flutter-dev',
|
||||
'name' => 'Flutter (Dev Channel)',
|
||||
'version' => '0.2.3',
|
||||
'version' => '0.3.2',
|
||||
'url' => 'https://github.com/appwrite/sdk-for-flutter-dev',
|
||||
'enabled' => true,
|
||||
'beta' => true,
|
||||
|
||||
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
@@ -40,8 +40,8 @@ App::post('/v1/account')
|
||||
->label('abuse-limit', 10)
|
||||
->param('email', '', function () { return new Email(); }, 'User email.')
|
||||
->param('password', '', function () { return new Password(); }, 'User password. Must be between 6 to 32 chars.')
|
||||
->param('name', '', function () { return new Text(100); }, 'User name.', true)
|
||||
->action(function ($email, $password, $name, $request, $response, $project, $projectDB, $webhooks, $audits) {
|
||||
->param('name', '', function () { return new Text(128); }, 'User name. Max length: 128 chars.', true)
|
||||
->action(function ($email, $password, $name, $request, $response, $project, $projectDB, $webhooks, $audits) use ($oauth2Keys) {
|
||||
/** @var Utopia\Swoole\Request $request */
|
||||
/** @var Appwrite\Utopia\Response $response */
|
||||
/** @var Appwrite\Database\Document $project */
|
||||
@@ -793,7 +793,7 @@ App::patch('/v1/account/name')
|
||||
->label('sdk.namespace', 'account')
|
||||
->label('sdk.method', 'updateName')
|
||||
->label('sdk.description', '/docs/references/account/update-name.md')
|
||||
->param('name', '', function () { return new Text(100); }, 'User name.')
|
||||
->param('name', '', function () { return new Text(128); }, 'User name. Max length: 128 chars.')
|
||||
->action(function ($name, $response, $user, $projectDB, $audits) {
|
||||
/** @var Appwrite\Utopia\Response $response */
|
||||
/** @var Appwrite\Database\Document $user */
|
||||
|
||||
@@ -393,7 +393,7 @@ App::get('/v1/avatars/initials')
|
||||
->label('sdk.method', 'getInitials')
|
||||
->label('sdk.methodType', 'location')
|
||||
->label('sdk.description', '/docs/references/avatars/get-initials.md')
|
||||
->param('name', '', function () { return new Text(512); }, 'Full Name. When empty, current user name or email will be used.', true)
|
||||
->param('name', '', function () { return new Text(128); }, 'Full Name. When empty, current user name or email will be used. Max length: 128 chars.', true)
|
||||
->param('width', 500, function () { return new Range(0, 2000); }, 'Image width. Pass an integer between 0 to 2000. Defaults to 100.', true)
|
||||
->param('height', 500, function () { return new Range(0, 2000); }, 'Image height. Pass an integer between 0 to 2000. Defaults to 100.', true)
|
||||
->param('color', '', function () { return new HexColor(); }, 'Changes text color. By default a random color will be picked and stay will persistent to the given name.', true)
|
||||
|
||||
@@ -30,7 +30,7 @@ App::post('/v1/database/collections')
|
||||
->label('sdk.platform', [APP_PLATFORM_SERVER])
|
||||
->label('sdk.method', 'createCollection')
|
||||
->label('sdk.description', '/docs/references/database/create-collection.md')
|
||||
->param('name', '', function () { return new Text(256); }, 'Collection name.')
|
||||
->param('name', '', function () { return new Text(128); }, 'Collection name. Max length: 128 chars.')
|
||||
->param('read', [], function () { return new ArrayList(new Text(64)); }, 'An array of strings with read permissions. By default no user is granted with any read permissions. [learn more about permissions](/docs/permissions) and get a full list of available permissions.')
|
||||
->param('write', [], function () { return new ArrayList(new Text(64)); }, 'An array of strings with write permissions. By default no user is granted with any write permissions. [learn more about permissions](/docs/permissions) and get a full list of available permissions.')
|
||||
->param('rules', [], function ($projectDB) { return new ArrayList(new Collection($projectDB, [Database::SYSTEM_COLLECTION_RULES], ['$collection' => Database::SYSTEM_COLLECTION_RULES, '$permissions' => ['read' => [], 'write' => []]])); }, 'Array of [rule objects](/docs/rules). Each rule define a collection field name, data type and validation.', false, ['projectDB'])
|
||||
@@ -103,7 +103,7 @@ App::get('/v1/database/collections')
|
||||
->label('sdk.platform', [APP_PLATFORM_SERVER])
|
||||
->label('sdk.method', 'listCollections')
|
||||
->label('sdk.description', '/docs/references/database/list-collections.md')
|
||||
->param('search', '', function () { return new Text(256); }, 'Search term to filter your list results.', true)
|
||||
->param('search', '', function () { return new Text(256); }, 'Search term to filter your list results. Max length: 256 chars.', true)
|
||||
->param('limit', 25, function () { return new Range(0, 100); }, 'Results limit value. By default will return maximum 25 results. Maximum of 100 results allowed per request.', true)
|
||||
->param('offset', 0, function () { return new Range(0, 40000); }, 'Results offset. The default value is 0. Use this param to manage pagination.', true)
|
||||
->param('orderType', 'ASC', function () { return new WhiteList(['ASC', 'DESC']); }, 'Order result by ASC or DESC order.', true)
|
||||
@@ -223,7 +223,7 @@ App::put('/v1/database/collections/:collectionId')
|
||||
->label('sdk.method', 'updateCollection')
|
||||
->label('sdk.description', '/docs/references/database/update-collection.md')
|
||||
->param('collectionId', '', function () { return new UID(); }, 'Collection unique ID.')
|
||||
->param('name', null, function () { return new Text(256); }, 'Collection name.')
|
||||
->param('name', null, function () { return new Text(128); }, 'Collection name. Max length: 128 chars.')
|
||||
->param('read', [], function () { return new ArrayList(new Text(64)); }, 'An array of strings with read permissions. By default no user is granted with any read permissions. [learn more about permissions(/docs/permissions) and get a full list of available permissions.')
|
||||
->param('write', [], function () { return new ArrayList(new Text(64)); }, 'An array of strings with write permissions. By default no user is granted with any write permissions. [learn more about permissions](/docs/permissions) and get a full list of available permissions.')
|
||||
->param('rules', [], function ($projectDB) { return new ArrayList(new Collection($projectDB, [Database::SYSTEM_COLLECTION_RULES], ['$collection' => Database::SYSTEM_COLLECTION_RULES, '$permissions' => ['read' => [], 'write' => []]])); }, 'Array of [rule objects](/docs/rules). Each rule define a collection field name, data type and validation.', true, ['projectDB'])
|
||||
@@ -466,7 +466,7 @@ App::get('/v1/database/collections/:collectionId/documents')
|
||||
->param('orderField', '$id', function () { return new Text(128); }, 'Document field that results will be sorted by.', true)
|
||||
->param('orderType', 'ASC', function () { return new WhiteList(array('DESC', 'ASC')); }, 'Order direction. Possible values are DESC for descending order, or ASC for ascending order.', true)
|
||||
->param('orderCast', 'string', function () { return new WhiteList(array('int', 'string', 'date', 'time', 'datetime')); }, 'Order field type casting. Possible values are int, string, date, time or datetime. The database will attempt to cast the order field to the value you pass here. The default value is a string.', true)
|
||||
->param('search', '', function () { return new Text(256); }, 'Search query. Enter any free text search. The database will try to find a match against all document attributes and children.', true)
|
||||
->param('search', '', function () { return new Text(256); }, 'Search query. Enter any free text search. The database will try to find a match against all document attributes and children. Max length: 256 chars.', true)
|
||||
->action(function ($collectionId, $filters, $limit, $offset, $orderField, $orderType, $orderCast, $search, $response, $projectDB) {
|
||||
/** @var Appwrite\Utopia\Response $response */
|
||||
/** @var Appwrite\Database\Database $projectDB */
|
||||
|
||||
@@ -29,7 +29,7 @@ App::post('/v1/functions')
|
||||
->label('sdk.namespace', 'functions')
|
||||
->label('sdk.method', 'create')
|
||||
->label('sdk.description', '/docs/references/functions/create-function.md')
|
||||
->param('name', '', function () { return new Text(128); }, 'Function name.')
|
||||
->param('name', '', function () { return new Text(128); }, 'Function name. Max length: 128 chars.')
|
||||
->param('env', '', function () { return new WhiteList(array_keys(Config::getParam('environments'))); }, 'Execution enviornment.')
|
||||
->param('vars', [], function () { return new Assoc();}, 'Key-value JSON object.', true)
|
||||
->param('events', [], function () { return new ArrayList(new WhiteList(array_keys(Config::getParam('events')), true)); }, 'Events list.', true)
|
||||
@@ -72,7 +72,7 @@ App::get('/v1/functions')
|
||||
->label('sdk.namespace', 'functions')
|
||||
->label('sdk.method', 'list')
|
||||
->label('sdk.description', '/docs/references/functions/list-functions.md')
|
||||
->param('search', '', function () { return new Text(256); }, 'Search term to filter your list results.', true)
|
||||
->param('search', '', function () { return new Text(256); }, 'Search term to filter your list results. Max length: 256 chars.', true)
|
||||
->param('limit', 25, function () { return new Range(0, 100); }, 'Results limit value. By default will return maximum 25 results. Maximum of 100 results allowed per request.', true)
|
||||
->param('offset', 0, function () { return new Range(0, 2000); }, 'Results offset. The default value is 0. Use this param to manage pagination.', true)
|
||||
->param('orderType', 'ASC', function () { return new WhiteList(['ASC', 'DESC']); }, 'Order result by ASC or DESC order.', true)
|
||||
@@ -236,7 +236,7 @@ App::put('/v1/functions/:functionId')
|
||||
->label('sdk.method', 'update')
|
||||
->label('sdk.description', '/docs/references/functions/update-function.md')
|
||||
->param('functionId', '', function () { return new UID(); }, 'Function unique ID.')
|
||||
->param('name', '', function () { return new Text(128); }, 'Function name.')
|
||||
->param('name', '', function () { return new Text(128); }, 'Function name. Max length: 128 chars.')
|
||||
->param('vars', [], function () { return new Assoc();}, 'Key-value JSON object.', true)
|
||||
->param('events', [], function () { return new ArrayList(new WhiteList(array_keys(Config::getParam('events')), true)); }, 'Events list.', true)
|
||||
->param('schedule', '', function () { return new Cron(); }, 'Schedule CRON syntax.', true)
|
||||
@@ -428,7 +428,7 @@ App::get('/v1/functions/:functionId/tags')
|
||||
->label('sdk.method', 'listTags')
|
||||
->label('sdk.description', '/docs/references/functions/list-tags.md')
|
||||
->param('functionId', '', function () { return new UID(); }, 'Function unique ID.')
|
||||
->param('search', '', function () { return new Text(256); }, 'Search term to filter your list results.', true)
|
||||
->param('search', '', function () { return new Text(256); }, 'Search term to filter your list results. Max length: 256 chars.', true)
|
||||
->param('limit', 25, function () { return new Range(0, 100); }, 'Results limit value. By default will return maximum 25 results. Maximum of 100 results allowed per request.', true)
|
||||
->param('offset', 0, function () { return new Range(0, 2000); }, 'Results offset. The default value is 0. Use this param to manage pagination.', true)
|
||||
->param('orderType', 'ASC', function () { return new WhiteList(['ASC', 'DESC']); }, 'Order result by ASC or DESC order.', true)
|
||||
@@ -612,7 +612,7 @@ App::get('/v1/functions/:functionId/executions')
|
||||
->label('sdk.method', 'listExecutions')
|
||||
->label('sdk.description', '/docs/references/functions/list-executions.md')
|
||||
->param('functionId', '', function () { return new UID(); }, 'Function unique ID.')
|
||||
->param('search', '', function () { return new Text(256); }, 'Search term to filter your list results.', true)
|
||||
->param('search', '', function () { return new Text(256); }, 'Search term to filter your list results. Max length: 256 chars.', true)
|
||||
->param('limit', 25, function () { return new Range(0, 100); }, 'Results limit value. By default will return maximum 25 results. Maximum of 100 results allowed per request.', true)
|
||||
->param('offset', 0, function () { return new Range(0, 2000); }, 'Results offset. The default value is 0. Use this param to manage pagination.', true)
|
||||
->param('orderType', 'ASC', function () { return new WhiteList(['ASC', 'DESC']); }, 'Order result by ASC or DESC order.', true)
|
||||
|
||||
@@ -27,17 +27,17 @@ App::post('/v1/projects')
|
||||
->label('scope', 'projects.write')
|
||||
->label('sdk.namespace', 'projects')
|
||||
->label('sdk.method', 'create')
|
||||
->param('name', null, function () { return new Text(100); }, 'Project name.')
|
||||
->param('name', null, function () { return new Text(128); }, 'Project name. Max length: 128 chars.')
|
||||
->param('teamId', '', function () { return new UID(); }, 'Team unique ID.')
|
||||
->param('description', '', function () { return new Text(255); }, 'Project description.', true)
|
||||
->param('description', '', function () { return new Text(256); }, 'Project description. Max length: 256 chars.', true)
|
||||
->param('logo', '', function () { return new Text(1024); }, 'Project logo.', true)
|
||||
->param('url', '', function () { return new URL(); }, 'Project URL.', true)
|
||||
->param('legalName', '', function () { return new Text(256); }, 'Project legal Name.', true)
|
||||
->param('legalCountry', '', function () { return new Text(256); }, 'Project legal Country.', true)
|
||||
->param('legalState', '', function () { return new Text(256); }, 'Project legal State.', true)
|
||||
->param('legalCity', '', function () { return new Text(256); }, 'Project legal City.', true)
|
||||
->param('legalAddress', '', function () { return new Text(256); }, 'Project legal Address.', true)
|
||||
->param('legalTaxId', '', function () { return new Text(256); }, 'Project legal Tax ID.', true)
|
||||
->param('legalName', '', function () { return new Text(256); }, 'Project legal Name. Max length: 256 chars.', true)
|
||||
->param('legalCountry', '', function () { return new Text(256); }, 'Project legal Country. Max length: 256 chars.', true)
|
||||
->param('legalState', '', function () { return new Text(256); }, 'Project legal State. Max length: 256 chars.', true)
|
||||
->param('legalCity', '', function () { return new Text(256); }, 'Project legal City. Max length: 256 chars.', true)
|
||||
->param('legalAddress', '', function () { return new Text(256); }, 'Project legal Address. Max length: 256 chars.', true)
|
||||
->param('legalTaxId', '', function () { return new Text(256); }, 'Project legal Tax ID. Max length: 256 chars.', true)
|
||||
->action(function ($name, $teamId, $description, $logo, $url, $legalName, $legalCountry, $legalState, $legalCity, $legalAddress, $legalTaxId, $response, $consoleDB, $projectDB) {
|
||||
/** @var Appwrite\Utopia\Response $response */
|
||||
/** @var Appwrite\Database\Database $consoleDB */
|
||||
@@ -92,7 +92,7 @@ App::get('/v1/projects')
|
||||
->label('scope', 'projects.read')
|
||||
->label('sdk.namespace', 'projects')
|
||||
->label('sdk.method', 'list')
|
||||
->param('search', '', function () { return new Text(256); }, 'Search term to filter your list results.', true)
|
||||
->param('search', '', function () { return new Text(256); }, 'Search term to filter your list results. Max length: 256 chars.', true)
|
||||
->param('limit', 25, function () { return new Range(0, 100); }, 'Results limit value. By default will return maximum 25 results. Maximum of 100 results allowed per request.', true)
|
||||
->param('offset', 0, function () { return new Range(0, 2000); }, 'Results offset. The default value is 0. Use this param to manage pagination.', true)
|
||||
->param('orderType', 'ASC', function () { return new WhiteList(['ASC', 'DESC']); }, 'Order result by ASC or DESC order.', true)
|
||||
@@ -349,16 +349,16 @@ App::patch('/v1/projects/:projectId')
|
||||
->label('sdk.namespace', 'projects')
|
||||
->label('sdk.method', 'update')
|
||||
->param('projectId', '', function () { return new UID(); }, 'Project unique ID.')
|
||||
->param('name', null, function () { return new Text(100); }, 'Project name.')
|
||||
->param('description', '', function () { return new Text(255); }, 'Project description.', true)
|
||||
->param('name', null, function () { return new Text(128); }, 'Project name. Max length: 128 chars.')
|
||||
->param('description', '', function () { return new Text(256); }, 'Project description. Max length: 256 chars.', true)
|
||||
->param('logo', '', function () { return new Text(1024); }, 'Project logo.', true)
|
||||
->param('url', '', function () { return new URL(); }, 'Project URL.', true)
|
||||
->param('legalName', '', function () { return new Text(256); }, 'Project legal name.', true)
|
||||
->param('legalCountry', '', function () { return new Text(256); }, 'Project legal country..', true)
|
||||
->param('legalState', '', function () { return new Text(256); }, 'Project legal state.', true)
|
||||
->param('legalCity', '', function () { return new Text(256); }, 'Project legal city.', true)
|
||||
->param('legalAddress', '', function () { return new Text(256); }, 'Project legal address.', true)
|
||||
->param('legalTaxId', '', function () { return new Text(256); }, 'Project legal tax ID.', true)
|
||||
->param('legalName', '', function () { return new Text(256); }, 'Project legal name. Max length: 256 chars.', true)
|
||||
->param('legalCountry', '', function () { return new Text(256); }, 'Project legal country. Max length: 256 chars.', true)
|
||||
->param('legalState', '', function () { return new Text(256); }, 'Project legal state. Max length: 256 chars.', true)
|
||||
->param('legalCity', '', function () { return new Text(256); }, 'Project legal city. Max length: 256 chars.', true)
|
||||
->param('legalAddress', '', function () { return new Text(256); }, 'Project legal address. Max length: 256 chars.', true)
|
||||
->param('legalTaxId', '', function () { return new Text(256); }, 'Project legal tax ID. Max length: 256 chars.', true)
|
||||
->action(function ($projectId, $name, $description, $logo, $url, $legalName, $legalCountry, $legalState, $legalCity, $legalAddress, $legalTaxId, $response, $consoleDB) {
|
||||
/** @var Appwrite\Utopia\Response $response */
|
||||
/** @var Appwrite\Database\Database $consoleDB */
|
||||
@@ -397,8 +397,8 @@ App::patch('/v1/projects/:projectId/oauth2')
|
||||
->label('sdk.method', 'updateOAuth2')
|
||||
->param('projectId', '', function () { return new UID(); }, 'Project unique ID.')
|
||||
->param('provider', '', function () { return new WhiteList(\array_keys(Config::getParam('providers'))); }, 'Provider Name', false)
|
||||
->param('appId', '', function () { return new Text(256); }, 'Provider app ID.', true)
|
||||
->param('secret', '', function () { return new text(512); }, 'Provider secret key.', true)
|
||||
->param('appId', '', function () { return new Text(256); }, 'Provider app ID. Max length: 256 chars.', true)
|
||||
->param('secret', '', function () { return new text(512); }, 'Provider secret key. Max length: 512 chars.', true)
|
||||
->action(function ($projectId, $provider, $appId, $secret, $response, $consoleDB) {
|
||||
/** @var Appwrite\Utopia\Response $response */
|
||||
/** @var Appwrite\Database\Database $consoleDB */
|
||||
@@ -488,12 +488,12 @@ App::post('/v1/projects/:projectId/webhooks')
|
||||
->label('sdk.namespace', 'projects')
|
||||
->label('sdk.method', 'createWebhook')
|
||||
->param('projectId', null, function () { return new UID(); }, 'Project unique ID.')
|
||||
->param('name', null, function () { return new Text(256); }, 'Webhook name.')
|
||||
->param('name', null, function () { return new Text(128); }, 'Webhook name. Max length: 128 chars.')
|
||||
->param('events', null, function () { return new ArrayList(new WhiteList(array_keys(Config::getParam('events')), true)); }, 'Events list.')
|
||||
->param('url', null, function () { return new URL(); }, 'Webhook URL.')
|
||||
->param('security', false, function () { return new Boolean(true); }, 'Certificate verification, false for disabled or true for enabled.')
|
||||
->param('httpUser', '', function () { return new Text(256); }, 'Webhook HTTP user.', true)
|
||||
->param('httpPass', '', function () { return new Text(256); }, 'Webhook HTTP password.', true)
|
||||
->param('httpUser', '', function () { return new Text(256); }, 'Webhook HTTP user. Max length: 256 chars.', true)
|
||||
->param('httpPass', '', function () { return new Text(256); }, 'Webhook HTTP password. Max length: 256 chars.', true)
|
||||
->action(function ($projectId, $name, $events, $url, $security, $httpUser, $httpPass, $response, $consoleDB) {
|
||||
/** @var Appwrite\Utopia\Response $response */
|
||||
/** @var Appwrite\Database\Database $consoleDB */
|
||||
@@ -625,11 +625,12 @@ App::put('/v1/projects/:projectId/webhooks/:webhookId')
|
||||
->label('sdk.method', 'updateWebhook')
|
||||
->param('projectId', null, function () { return new UID(); }, 'Project unique ID.')
|
||||
->param('webhookId', null, function () { return new UID(); }, 'Webhook unique ID.')
|
||||
->param('name', null, function () { return new Text(256); }, 'Webhook name.')
|
||||
->param('name', null, function () { return new Text(128); }, 'Webhook name. Max length: 128 chars.')
|
||||
->param('events', null, function () { return new ArrayList(new WhiteList(array_keys(Config::getParam('events')), true)); }, 'Events list.')
|
||||
->param('url', null, function () { return new URL(); }, 'Webhook URL.')
|
||||
->param('security', false, function () { return new Boolean(true); }, 'Certificate verification, false for disabled or true for enabled.') ->param('httpUser', '', function () { return new Text(256); }, 'Webhook HTTP user.', true)
|
||||
->param('httpPass', '', function () { return new Text(256); }, 'Webhook HTTP password.', true)
|
||||
->param('security', false, function () { return new Boolean(true); }, 'Certificate verification, false for disabled or true for enabled.')
|
||||
->param('httpUser', '', function () { return new Text(256); }, 'Webhook HTTP user. Max length: 256 chars.', true)
|
||||
->param('httpPass', '', function () { return new Text(256); }, 'Webhook HTTP password. Max length: 256 chars.', true)
|
||||
->action(function ($projectId, $webhookId, $name, $events, $url, $security, $httpUser, $httpPass, $response, $consoleDB) {
|
||||
/** @var Appwrite\Utopia\Response $response */
|
||||
/** @var Appwrite\Database\Database $consoleDB */
|
||||
@@ -714,7 +715,7 @@ App::post('/v1/projects/:projectId/keys')
|
||||
->label('sdk.namespace', 'projects')
|
||||
->label('sdk.method', 'createKey')
|
||||
->param('projectId', null, function () { return new UID(); }, 'Project unique ID.')
|
||||
->param('name', null, function () { return new Text(256); }, 'Key name.')
|
||||
->param('name', null, function () { return new Text(128); }, 'Key name. Max length: 128 chars.')
|
||||
->param('scopes', null, function () { return new ArrayList(new WhiteList(Config::getParam('scopes'))); }, 'Key scopes list.')
|
||||
->action(function ($projectId, $name, $scopes, $response, $consoleDB) {
|
||||
/** @var Appwrite\Utopia\Response $response */
|
||||
@@ -810,7 +811,7 @@ App::put('/v1/projects/:projectId/keys/:keyId')
|
||||
->label('sdk.method', 'updateKey')
|
||||
->param('projectId', null, function () { return new UID(); }, 'Project unique ID.')
|
||||
->param('keyId', null, function () { return new UID(); }, 'Key unique ID.')
|
||||
->param('name', null, function () { return new Text(256); }, 'Key name.')
|
||||
->param('name', null, function () { return new Text(128); }, 'Key name. Max length: 128 chars.')
|
||||
->param('scopes', null, function () { return new ArrayList(new WhiteList(Config::getParam('scopes'))); }, 'Key scopes list')
|
||||
->action(function ($projectId, $keyId, $name, $scopes, $response, $consoleDB) {
|
||||
/** @var Appwrite\Utopia\Response $response */
|
||||
@@ -880,15 +881,15 @@ App::post('/v1/projects/:projectId/tasks')
|
||||
->label('sdk.namespace', 'projects')
|
||||
->label('sdk.method', 'createTask')
|
||||
->param('projectId', null, function () { return new UID(); }, 'Project unique ID.')
|
||||
->param('name', null, function () { return new Text(256); }, 'Task name.')
|
||||
->param('name', null, function () { return new Text(128); }, 'Task name. Max length: 128 chars.')
|
||||
->param('status', null, function () { return new WhiteList(['play', 'pause']); }, 'Task status.')
|
||||
->param('schedule', null, function () { return new Cron(); }, 'Task schedule CRON syntax.')
|
||||
->param('security', false, function () { return new Boolean(true); }, 'Certificate verification, false for disabled or true for enabled.')
|
||||
->param('httpMethod', '', function () { return new WhiteList(['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS', 'TRACE', 'CONNECT']); }, 'Task HTTP method.')
|
||||
->param('httpUrl', '', function () { return new URL(); }, 'Task HTTP URL')
|
||||
->param('httpHeaders', null, function () { return new ArrayList(new Text(256)); }, 'Task HTTP headers list.', true)
|
||||
->param('httpUser', '', function () { return new Text(256); }, 'Task HTTP user.', true)
|
||||
->param('httpPass', '', function () { return new Text(256); }, 'Task HTTP password.', true)
|
||||
->param('httpUser', '', function () { return new Text(256); }, 'Task HTTP user. Max length: 256 chars.', true)
|
||||
->param('httpPass', '', function () { return new Text(256); }, 'Task HTTP password. Max length: 256 chars.', true)
|
||||
->action(function ($projectId, $name, $status, $schedule, $security, $httpMethod, $httpUrl, $httpHeaders, $httpUser, $httpPass, $response, $consoleDB) {
|
||||
/** @var Appwrite\Utopia\Response $response */
|
||||
/** @var Appwrite\Database\Database $consoleDB */
|
||||
@@ -1035,15 +1036,15 @@ App::put('/v1/projects/:projectId/tasks/:taskId')
|
||||
->label('sdk.method', 'updateTask')
|
||||
->param('projectId', null, function () { return new UID(); }, 'Project unique ID.')
|
||||
->param('taskId', null, function () { return new UID(); }, 'Task unique ID.')
|
||||
->param('name', null, function () { return new Text(256); }, 'Task name.')
|
||||
->param('name', null, function () { return new Text(128); }, 'Task name. Max length: 128 chars.')
|
||||
->param('status', null, function () { return new WhiteList(['play', 'pause']); }, 'Task status.')
|
||||
->param('schedule', null, function () { return new Cron(); }, 'Task schedule CRON syntax.')
|
||||
->param('security', false, function () { return new Boolean(true); }, 'Certificate verification, false for disabled or true for enabled.')
|
||||
->param('httpMethod', '', function () { return new WhiteList(['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS', 'TRACE', 'CONNECT']); }, 'Task HTTP method.')
|
||||
->param('httpUrl', '', function () { return new URL(); }, 'Task HTTP URL.')
|
||||
->param('httpHeaders', null, function () { return new ArrayList(new Text(256)); }, 'Task HTTP headers list.', true)
|
||||
->param('httpUser', '', function () { return new Text(256); }, 'Task HTTP user.', true)
|
||||
->param('httpPass', '', function () { return new Text(256); }, 'Task HTTP password.', true)
|
||||
->param('httpUser', '', function () { return new Text(256); }, 'Task HTTP user. Max length: 256 chars.', true)
|
||||
->param('httpPass', '', function () { return new Text(256); }, 'Task HTTP password. Max length: 256 chars.', true)
|
||||
->action(function ($projectId, $taskId, $name, $status, $schedule, $security, $httpMethod, $httpUrl, $httpHeaders, $httpUser, $httpPass, $response, $consoleDB) {
|
||||
/** @var Appwrite\Utopia\Response $response */
|
||||
/** @var Appwrite\Database\Database $consoleDB */
|
||||
@@ -1141,10 +1142,10 @@ App::post('/v1/projects/:projectId/platforms')
|
||||
->label('sdk.method', 'createPlatform')
|
||||
->param('projectId', null, function () { return new UID(); }, 'Project unique ID.')
|
||||
->param('type', null, function () { return new WhiteList(['web', 'flutter-ios', 'flutter-android', 'ios', 'android', 'unity']); }, 'Platform type.')
|
||||
->param('name', null, function () { return new Text(256); }, 'Platform name.')
|
||||
->param('key', '', function () { return new Text(256); }, 'Package name for android or bundle ID for iOS.', true)
|
||||
->param('store', '', function () { return new Text(256); }, 'App store or Google Play store ID.', true)
|
||||
->param('hostname', '', function () { return new Text(256); }, 'Platform client hostname.', true)
|
||||
->param('name', null, function () { return new Text(128); }, 'Platform name. Max length: 128 chars.')
|
||||
->param('key', '', function () { return new Text(256); }, 'Package name for android or bundle ID for iOS. Max length: 256 chars.', true)
|
||||
->param('store', '', function () { return new Text(256); }, 'App store or Google Play store ID. Max length: 256 chars.', true)
|
||||
->param('hostname', '', function () { return new Text(256); }, 'Platform client hostname. Max length: 256 chars.', true)
|
||||
->action(function ($projectId, $type, $name, $key, $store, $hostname, $response, $consoleDB) {
|
||||
/** @var Appwrite\Utopia\Response $response */
|
||||
/** @var Appwrite\Database\Database $consoleDB */
|
||||
@@ -1246,10 +1247,10 @@ App::put('/v1/projects/:projectId/platforms/:platformId')
|
||||
->label('sdk.method', 'updatePlatform')
|
||||
->param('projectId', null, function () { return new UID(); }, 'Project unique ID.')
|
||||
->param('platformId', null, function () { return new UID(); }, 'Platform unique ID.')
|
||||
->param('name', null, function () { return new Text(256); }, 'Platform name.')
|
||||
->param('key', '', function () { return new Text(256); }, 'Package name for android or bundle ID for iOS.', true)
|
||||
->param('store', '', function () { return new Text(256); }, 'App store or Google Play store ID.', true)
|
||||
->param('hostname', '', function () { return new Text(256); }, 'Platform client URL.', true)
|
||||
->param('name', null, function () { return new Text(128); }, 'Platform name. Max length: 128 chars.')
|
||||
->param('key', '', function () { return new Text(256); }, 'Package name for android or bundle ID for iOS. Max length: 256 chars.', true)
|
||||
->param('store', '', function () { return new Text(256); }, 'App store or Google Play store ID. Max length: 256 chars.', true)
|
||||
->param('hostname', '', function () { return new Text(256); }, 'Platform client URL. Max length: 256 chars.', true)
|
||||
->action(function ($projectId, $platformId, $name, $key, $store, $hostname, $response, $consoleDB) {
|
||||
/** @var Appwrite\Utopia\Response $response */
|
||||
/** @var Appwrite\Database\Database $consoleDB */
|
||||
|
||||
@@ -166,7 +166,7 @@ App::get('/v1/storage/files')
|
||||
->label('sdk.namespace', 'storage')
|
||||
->label('sdk.method', 'listFiles')
|
||||
->label('sdk.description', '/docs/references/storage/list-files.md')
|
||||
->param('search', '', function () { return new Text(256); }, 'Search term to filter your list results.', true)
|
||||
->param('search', '', function () { return new Text(256); }, 'Search term to filter your list results. Max length: 256 chars.', true)
|
||||
->param('limit', 25, function () { return new Range(0, 100); }, 'Results limit value. By default will return maximum 25 results. Maximum of 100 results allowed per request.', true)
|
||||
->param('offset', 0, function () { return new Range(0, 2000); }, 'Results offset. The default value is 0. Use this param to manage pagination.', true)
|
||||
->param('orderType', 'ASC', function () { return new WhiteList(['ASC', 'DESC']); }, 'Order result by ASC or DESC order.', true)
|
||||
|
||||
@@ -27,7 +27,7 @@ App::post('/v1/teams')
|
||||
->label('sdk.namespace', 'teams')
|
||||
->label('sdk.method', 'create')
|
||||
->label('sdk.description', '/docs/references/teams/create-team.md')
|
||||
->param('name', null, function () { return new Text(100); }, 'Team name.')
|
||||
->param('name', null, function () { return new Text(128); }, 'Team name. Max length: 128 chars.')
|
||||
->param('roles', ['owner'], function () { return new ArrayList(new Text(128)); }, 'Array of strings. Use this param to set the roles in the team for the user who created it. The default role is **owner**. A role can be any string. Learn more about [roles and permissions](/docs/permissions).', true)
|
||||
->action(function ($name, $roles, $response, $user, $projectDB, $mode) {
|
||||
/** @var Appwrite\Utopia\Response $response */
|
||||
@@ -92,7 +92,7 @@ App::get('/v1/teams')
|
||||
->label('sdk.namespace', 'teams')
|
||||
->label('sdk.method', 'list')
|
||||
->label('sdk.description', '/docs/references/teams/list-teams.md')
|
||||
->param('search', '', function () { return new Text(256); }, 'Search term to filter your list results.', true)
|
||||
->param('search', '', function () { return new Text(256); }, 'Search term to filter your list results. Max length: 256 chars.', true)
|
||||
->param('limit', 25, function () { return new Range(0, 100); }, 'Results limit value. By default will return maximum 25 results. Maximum of 100 results allowed per request.', true)
|
||||
->param('offset', 0, function () { return new Range(0, 2000); }, 'Results offset. The default value is 0. Use this param to manage pagination.', true)
|
||||
->param('orderType', 'ASC', function () { return new WhiteList(['ASC', 'DESC']); }, 'Order result by ASC or DESC order.', true)
|
||||
@@ -149,7 +149,7 @@ App::put('/v1/teams/:teamId')
|
||||
->label('sdk.method', 'update')
|
||||
->label('sdk.description', '/docs/references/teams/update-team.md')
|
||||
->param('teamId', '', function () { return new UID(); }, 'Team unique ID.')
|
||||
->param('name', null, function () { return new Text(100); }, 'Team name.')
|
||||
->param('name', null, function () { return new Text(128); }, 'Team name. Max length: 128 chars.')
|
||||
->action(function ($teamId, $name, $response, $projectDB) {
|
||||
/** @var Appwrite\Utopia\Response $response */
|
||||
/** @var Appwrite\Database\Database $projectDB */
|
||||
@@ -222,7 +222,7 @@ App::post('/v1/teams/:teamId/memberships')
|
||||
->label('sdk.description', '/docs/references/teams/create-team-membership.md')
|
||||
->param('teamId', '', function () { return new UID(); }, 'Team unique ID.')
|
||||
->param('email', '', function () { return new Email(); }, 'New team member email.')
|
||||
->param('name', '', function () { return new Text(100); }, 'New team member name.', true)
|
||||
->param('name', '', function () { return new Text(128); }, 'New team member name. Max length: 128 chars.', true)
|
||||
->param('roles', [], function () { return new ArrayList(new Text(128)); }, 'Array of strings. Use this param to set the user roles in the team. A role can be any string. Learn more about [roles and permissions](/docs/permissions).')
|
||||
->param('url', '', function ($clients) { return new Host($clients); }, 'URL to redirect the user back to your app from the invitation email. Only URLs from hostnames in your project platform list are allowed. This requirement helps to prevent an [open redirect](https://cheatsheetseries.owasp.org/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.html) attack against your project API.', false, ['clients']) // TODO add our own built-in confirm page
|
||||
->action(function ($teamId, $email, $name, $roles, $url, $response, $project, $user, $projectDB, $locale, $audits, $mails, $mode) {
|
||||
@@ -409,7 +409,7 @@ App::get('/v1/teams/:teamId/memberships')
|
||||
->label('sdk.method', 'getMemberships')
|
||||
->label('sdk.description', '/docs/references/teams/get-team-members.md')
|
||||
->param('teamId', '', function () { return new UID(); }, 'Team unique ID.')
|
||||
->param('search', '', function () { return new Text(256); }, 'Search term to filter your list results.', true)
|
||||
->param('search', '', function () { return new Text(256); }, 'Search term to filter your list results. Max length: 256 chars.', true)
|
||||
->param('limit', 25, function () { return new Range(0, 100); }, 'Results limit value. By default will return maximum 25 results. Maximum of 100 results allowed per request.', true)
|
||||
->param('offset', 0, function () { return new Range(0, 2000); }, 'Results offset. The default value is 0. Use this param to manage pagination.', true)
|
||||
->param('orderType', 'ASC', function () { return new WhiteList(['ASC', 'DESC']); }, 'Order result by ASC or DESC order.', true)
|
||||
|
||||
@@ -28,7 +28,7 @@ App::post('/v1/users')
|
||||
->label('sdk.description', '/docs/references/users/create-user.md')
|
||||
->param('email', '', function () { return new Email(); }, 'User email.')
|
||||
->param('password', '', function () { return new Password(); }, 'User password. Must be between 6 to 32 chars.')
|
||||
->param('name', '', function () { return new Text(100); }, 'User name.', true)
|
||||
->param('name', '', function () { return new Text(128); }, 'User name. Max length: 128 chars.', true)
|
||||
->action(function ($email, $password, $name, $response, $projectDB) {
|
||||
/** @var Appwrite\Utopia\Response $response */
|
||||
/** @var Appwrite\Database\Database $projectDB */
|
||||
@@ -77,7 +77,7 @@ App::get('/v1/users')
|
||||
->label('sdk.namespace', 'users')
|
||||
->label('sdk.method', 'list')
|
||||
->label('sdk.description', '/docs/references/users/list-users.md')
|
||||
->param('search', '', function () { return new Text(256); }, 'Search term to filter your list results.', true)
|
||||
->param('search', '', function () { return new Text(256); }, 'Search term to filter your list results. Max length: 256 chars.', true)
|
||||
->param('limit', 25, function () { return new Range(0, 100); }, 'Results limit value. By default will return maximum 25 results. Maximum of 100 results allowed per request.', true)
|
||||
->param('offset', 0, function () { return new Range(0, 2000); }, 'Results offset. The default value is 0. Use this param to manage pagination.', true)
|
||||
->param('orderType', 'ASC', function () { return new WhiteList(['ASC', 'DESC']); }, 'Order result by ASC or DESC order.', true)
|
||||
|
||||
@@ -1,3 +1,16 @@
|
||||
## 0.3.2
|
||||
|
||||
- Fixed package namespaces
|
||||
|
||||
## 0.3.1
|
||||
|
||||
- Downgraded meta package version to 1.1.8
|
||||
|
||||
## 0.3.0
|
||||
|
||||
- Updated package dependencies (@lohanidamodar)
|
||||
- Added Flutter for Web compatibility (@lohanidamodar)
|
||||
|
||||
## 0.2.3
|
||||
|
||||
- Fixed OAuth2 cookie bug, where a new session cookie couldn't overwrite an old cookie
|
||||
|
||||
@@ -20,13 +20,13 @@ Add this to your package's `pubspec.yaml` file:
|
||||
|
||||
```yml
|
||||
dependencies:
|
||||
appwrite: ^0.2.3
|
||||
appwrite_dev: ^0.3.2
|
||||
```
|
||||
|
||||
You can install packages from the command line:
|
||||
|
||||
```bash
|
||||
pub get appwrite
|
||||
pub get appwrite_dev
|
||||
```
|
||||
|
||||
## Contribution
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import 'package:appwrite/appwrite.dart';
|
||||
import 'package:appwrite_dev/appwrite_dev.dart';
|
||||
|
||||
void main() { // Init SDK
|
||||
Client client = Client();
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import 'package:appwrite/appwrite.dart';
|
||||
import 'package:appwrite_dev/appwrite_dev.dart';
|
||||
|
||||
void main() { // Init SDK
|
||||
Client client = Client();
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import 'package:appwrite/appwrite.dart';
|
||||
import 'package:appwrite_dev/appwrite_dev.dart';
|
||||
|
||||
void main() { // Init SDK
|
||||
Client client = Client();
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import 'package:appwrite/appwrite.dart';
|
||||
import 'package:appwrite_dev/appwrite_dev.dart';
|
||||
|
||||
void main() { // Init SDK
|
||||
Client client = Client();
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import 'package:appwrite/appwrite.dart';
|
||||
import 'package:appwrite_dev/appwrite_dev.dart';
|
||||
|
||||
void main() { // Init SDK
|
||||
Client client = Client();
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import 'package:appwrite/appwrite.dart';
|
||||
import 'package:appwrite_dev/appwrite_dev.dart';
|
||||
|
||||
void main() { // Init SDK
|
||||
Client client = Client();
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import 'package:appwrite/appwrite.dart';
|
||||
import 'package:appwrite_dev/appwrite_dev.dart';
|
||||
|
||||
void main() { // Init SDK
|
||||
Client client = Client();
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import 'package:appwrite/appwrite.dart';
|
||||
import 'package:appwrite_dev/appwrite_dev.dart';
|
||||
|
||||
void main() { // Init SDK
|
||||
Client client = Client();
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import 'package:appwrite/appwrite.dart';
|
||||
import 'package:appwrite_dev/appwrite_dev.dart';
|
||||
|
||||
void main() { // Init SDK
|
||||
Client client = Client();
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import 'package:appwrite/appwrite.dart';
|
||||
import 'package:appwrite_dev/appwrite_dev.dart';
|
||||
|
||||
void main() { // Init SDK
|
||||
Client client = Client();
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import 'package:appwrite/appwrite.dart';
|
||||
import 'package:appwrite_dev/appwrite_dev.dart';
|
||||
|
||||
void main() { // Init SDK
|
||||
Client client = Client();
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import 'package:appwrite/appwrite.dart';
|
||||
import 'package:appwrite_dev/appwrite_dev.dart';
|
||||
|
||||
void main() { // Init SDK
|
||||
Client client = Client();
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import 'package:appwrite/appwrite.dart';
|
||||
import 'package:appwrite_dev/appwrite_dev.dart';
|
||||
|
||||
void main() { // Init SDK
|
||||
Client client = Client();
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import 'package:appwrite/appwrite.dart';
|
||||
import 'package:appwrite_dev/appwrite_dev.dart';
|
||||
|
||||
void main() { // Init SDK
|
||||
Client client = Client();
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import 'package:appwrite/appwrite.dart';
|
||||
import 'package:appwrite_dev/appwrite_dev.dart';
|
||||
|
||||
void main() { // Init SDK
|
||||
Client client = Client();
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import 'package:appwrite/appwrite.dart';
|
||||
import 'package:appwrite_dev/appwrite_dev.dart';
|
||||
|
||||
void main() { // Init SDK
|
||||
Client client = Client();
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import 'package:appwrite/appwrite.dart';
|
||||
import 'package:appwrite_dev/appwrite_dev.dart';
|
||||
|
||||
void main() { // Init SDK
|
||||
Client client = Client();
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import 'package:appwrite/appwrite.dart';
|
||||
import 'package:appwrite_dev/appwrite_dev.dart';
|
||||
|
||||
void main() { // Init SDK
|
||||
Client client = Client();
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import 'package:appwrite/appwrite.dart';
|
||||
import 'package:appwrite_dev/appwrite_dev.dart';
|
||||
|
||||
void main() { // Init SDK
|
||||
Client client = Client();
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import 'package:appwrite/appwrite.dart';
|
||||
import 'package:appwrite_dev/appwrite_dev.dart';
|
||||
|
||||
void main() { // Init SDK
|
||||
Client client = Client();
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import 'package:appwrite/appwrite.dart';
|
||||
import 'package:appwrite_dev/appwrite_dev.dart';
|
||||
|
||||
void main() { // Init SDK
|
||||
Client client = Client();
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import 'package:appwrite/appwrite.dart';
|
||||
import 'package:appwrite_dev/appwrite_dev.dart';
|
||||
|
||||
void main() { // Init SDK
|
||||
Client client = Client();
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import 'package:appwrite/appwrite.dart';
|
||||
import 'package:appwrite_dev/appwrite_dev.dart';
|
||||
|
||||
void main() { // Init SDK
|
||||
Client client = Client();
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import 'package:appwrite/appwrite.dart';
|
||||
import 'package:appwrite_dev/appwrite_dev.dart';
|
||||
|
||||
void main() { // Init SDK
|
||||
Client client = Client();
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import 'package:appwrite/appwrite.dart';
|
||||
import 'package:appwrite_dev/appwrite_dev.dart';
|
||||
|
||||
void main() { // Init SDK
|
||||
Client client = Client();
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import 'package:appwrite/appwrite.dart';
|
||||
import 'package:appwrite_dev/appwrite_dev.dart';
|
||||
|
||||
void main() { // Init SDK
|
||||
Client client = Client();
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import 'package:appwrite/appwrite.dart';
|
||||
import 'package:appwrite_dev/appwrite_dev.dart';
|
||||
|
||||
void main() { // Init SDK
|
||||
Client client = Client();
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import 'package:appwrite/appwrite.dart';
|
||||
import 'package:appwrite_dev/appwrite_dev.dart';
|
||||
|
||||
void main() { // Init SDK
|
||||
Client client = Client();
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import 'package:appwrite/appwrite.dart';
|
||||
import 'package:appwrite_dev/appwrite_dev.dart';
|
||||
|
||||
void main() { // Init SDK
|
||||
Client client = Client();
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import 'package:appwrite/appwrite.dart';
|
||||
import 'package:appwrite_dev/appwrite_dev.dart';
|
||||
|
||||
void main() { // Init SDK
|
||||
Client client = Client();
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import 'package:appwrite/appwrite.dart';
|
||||
import 'package:appwrite_dev/appwrite_dev.dart';
|
||||
|
||||
void main() { // Init SDK
|
||||
Client client = Client();
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import 'package:appwrite/appwrite.dart';
|
||||
import 'package:appwrite_dev/appwrite_dev.dart';
|
||||
|
||||
void main() { // Init SDK
|
||||
Client client = Client();
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import 'package:appwrite/appwrite.dart';
|
||||
import 'package:appwrite_dev/appwrite_dev.dart';
|
||||
|
||||
void main() { // Init SDK
|
||||
Client client = Client();
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import 'package:appwrite/appwrite.dart';
|
||||
import 'package:appwrite_dev/appwrite_dev.dart';
|
||||
|
||||
void main() { // Init SDK
|
||||
Client client = Client();
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import 'package:appwrite/appwrite.dart';
|
||||
import 'package:appwrite_dev/appwrite_dev.dart';
|
||||
|
||||
void main() { // Init SDK
|
||||
Client client = Client();
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import 'dart:io';
|
||||
import 'package:appwrite/appwrite.dart';
|
||||
import 'package:appwrite_dev/appwrite_dev.dart';
|
||||
|
||||
void main() { // Init SDK
|
||||
Client client = Client();
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import 'package:appwrite/appwrite.dart';
|
||||
import 'package:appwrite_dev/appwrite_dev.dart';
|
||||
|
||||
void main() { // Init SDK
|
||||
Client client = Client();
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import 'package:appwrite/appwrite.dart';
|
||||
import 'package:appwrite_dev/appwrite_dev.dart';
|
||||
|
||||
void main() { // Init SDK
|
||||
Client client = Client();
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import 'package:appwrite/appwrite.dart';
|
||||
import 'package:appwrite_dev/appwrite_dev.dart';
|
||||
|
||||
void main() { // Init SDK
|
||||
Client client = Client();
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import 'package:appwrite/appwrite.dart';
|
||||
import 'package:appwrite_dev/appwrite_dev.dart';
|
||||
|
||||
void main() { // Init SDK
|
||||
Client client = Client();
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import 'package:appwrite/appwrite.dart';
|
||||
import 'package:appwrite_dev/appwrite_dev.dart';
|
||||
|
||||
void main() { // Init SDK
|
||||
Client client = Client();
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import 'package:appwrite/appwrite.dart';
|
||||
import 'package:appwrite_dev/appwrite_dev.dart';
|
||||
|
||||
void main() { // Init SDK
|
||||
Client client = Client();
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import 'package:appwrite/appwrite.dart';
|
||||
import 'package:appwrite_dev/appwrite_dev.dart';
|
||||
|
||||
void main() { // Init SDK
|
||||
Client client = Client();
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import 'package:appwrite/appwrite.dart';
|
||||
import 'package:appwrite_dev/appwrite_dev.dart';
|
||||
|
||||
void main() { // Init SDK
|
||||
Client client = Client();
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import 'package:appwrite/appwrite.dart';
|
||||
import 'package:appwrite_dev/appwrite_dev.dart';
|
||||
|
||||
void main() { // Init SDK
|
||||
Client client = Client();
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import 'package:appwrite/appwrite.dart';
|
||||
import 'package:appwrite_dev/appwrite_dev.dart';
|
||||
|
||||
void main() { // Init SDK
|
||||
Client client = Client();
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import 'package:appwrite/appwrite.dart';
|
||||
import 'package:appwrite_dev/appwrite_dev.dart';
|
||||
|
||||
void main() { // Init SDK
|
||||
Client client = Client();
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import 'package:appwrite/appwrite.dart';
|
||||
import 'package:appwrite_dev/appwrite_dev.dart';
|
||||
|
||||
void main() { // Init SDK
|
||||
Client client = Client();
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import 'package:appwrite/appwrite.dart';
|
||||
import 'package:appwrite_dev/appwrite_dev.dart';
|
||||
|
||||
void main() { // Init SDK
|
||||
Client client = Client();
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import 'package:appwrite/appwrite.dart';
|
||||
import 'package:appwrite_dev/appwrite_dev.dart';
|
||||
|
||||
void main() { // Init SDK
|
||||
Client client = Client();
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import 'package:appwrite/appwrite.dart';
|
||||
import 'package:appwrite_dev/appwrite_dev.dart';
|
||||
|
||||
void main() { // Init SDK
|
||||
Client client = Client();
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import 'package:appwrite/appwrite.dart';
|
||||
import 'package:appwrite_dev/appwrite_dev.dart';
|
||||
|
||||
void main() { // Init SDK
|
||||
Client client = Client();
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
export 'package:dio/dio.dart' show Response;
|
||||
|
||||
export 'client.dart';
|
||||
export 'enums.dart';
|
||||
export 'services/account.dart';
|
||||
export 'services/avatars.dart';
|
||||
export 'services/database.dart';
|
||||
export 'services/locale.dart';
|
||||
export 'services/storage.dart';
|
||||
export 'services/teams.dart';
|
||||
@@ -1,6 +1,7 @@
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:dio/dio.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:dio/adapter.dart';
|
||||
import 'package:dio_cookie_manager/dio_cookie_manager.dart';
|
||||
import 'package:cookie_jar/cookie_jar.dart';
|
||||
@@ -20,17 +21,21 @@ class Client {
|
||||
PersistCookieJar cookieJar;
|
||||
|
||||
Client({this.endPoint = 'https://appwrite.io/v1', this.selfSigned = false, Dio http}) : this.http = http ?? Dio() {
|
||||
|
||||
type = (Platform.isIOS) ? 'ios' : type;
|
||||
type = (Platform.isMacOS) ? 'macos' : type;
|
||||
type = (Platform.isAndroid) ? 'android' : type;
|
||||
type = (Platform.isLinux) ? 'linux' : type;
|
||||
type = (Platform.isWindows) ? 'windows' : type;
|
||||
type = (Platform.isFuchsia) ? 'fuchsia' : type;
|
||||
// Platform is not supported in web so if web, set type to web automatically and skip Platform check
|
||||
if(kIsWeb) {
|
||||
type = 'web';
|
||||
}else{
|
||||
type = (Platform.isIOS) ? 'ios' : type;
|
||||
type = (Platform.isMacOS) ? 'macos' : type;
|
||||
type = (Platform.isAndroid) ? 'android' : type;
|
||||
type = (Platform.isLinux) ? 'linux' : type;
|
||||
type = (Platform.isWindows) ? 'windows' : type;
|
||||
type = (Platform.isFuchsia) ? 'fuchsia' : type;
|
||||
}
|
||||
|
||||
this.headers = {
|
||||
'content-type': 'application/json',
|
||||
'x-sdk-version': 'appwrite:dart:0.2.3',
|
||||
'x-sdk-version': 'appwrite:flutter:0.3.2',
|
||||
};
|
||||
|
||||
this.config = {};
|
||||
@@ -78,17 +83,20 @@ class Client {
|
||||
|
||||
Future init() async {
|
||||
if(!initialized) {
|
||||
final Directory cookieDir = await _getCookiePath();
|
||||
|
||||
cookieJar = new PersistCookieJar(dir:cookieDir.path);
|
||||
// if web skip cookie implementation and origin header as those are automatically handled by browsers
|
||||
if(!kIsWeb) {
|
||||
final Directory cookieDir = await _getCookiePath();
|
||||
cookieJar = new PersistCookieJar(dir:cookieDir.path);
|
||||
this.http.interceptors.add(CookieManager(cookieJar));
|
||||
PackageInfo packageInfo = await PackageInfo.fromPlatform();
|
||||
addHeader('Origin', 'appwrite-' + type + '://' + packageInfo.packageName);
|
||||
}else{
|
||||
// if web set httpClientAdapter as BrowserHttpClientAdapter with withCredentials true to make cookies work
|
||||
this.http.options.extra['withCredentials'] = true;
|
||||
}
|
||||
|
||||
this.http.options.baseUrl = this.endPoint;
|
||||
this.http.options.validateStatus = (status) => status < 400;
|
||||
this.http.interceptors.add(CookieManager(cookieJar));
|
||||
|
||||
PackageInfo packageInfo = await PackageInfo.fromPlatform();
|
||||
|
||||
addHeader('Origin', 'appwrite-' + type + '://' + packageInfo.packageName);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -114,6 +122,10 @@ class Client {
|
||||
}
|
||||
|
||||
if (method == HttpMethod.get) {
|
||||
params.keys.forEach((key) {if (params[key] is int || params[key] is double) {
|
||||
params[key] = params[key].toString();
|
||||
}});
|
||||
|
||||
return http.get(path, queryParameters: params, options: options);
|
||||
} else {
|
||||
return http.request(path, data: params, options: options);
|
||||
|
||||
@@ -27,6 +27,10 @@ class Avatars extends Service {
|
||||
'project': client.config['project'],
|
||||
};
|
||||
|
||||
params.keys.forEach((key) {if (params[key] is int || params[key] is double) {
|
||||
params[key] = params[key].toString();
|
||||
}});
|
||||
|
||||
Uri endpoint = Uri.parse(client.endPoint);
|
||||
Uri location = new Uri(scheme: endpoint.scheme,
|
||||
host: endpoint.host,
|
||||
@@ -55,6 +59,10 @@ class Avatars extends Service {
|
||||
'project': client.config['project'],
|
||||
};
|
||||
|
||||
params.keys.forEach((key) {if (params[key] is int || params[key] is double) {
|
||||
params[key] = params[key].toString();
|
||||
}});
|
||||
|
||||
Uri endpoint = Uri.parse(client.endPoint);
|
||||
Uri location = new Uri(scheme: endpoint.scheme,
|
||||
host: endpoint.host,
|
||||
@@ -79,6 +87,10 @@ class Avatars extends Service {
|
||||
'project': client.config['project'],
|
||||
};
|
||||
|
||||
params.keys.forEach((key) {if (params[key] is int || params[key] is double) {
|
||||
params[key] = params[key].toString();
|
||||
}});
|
||||
|
||||
Uri endpoint = Uri.parse(client.endPoint);
|
||||
Uri location = new Uri(scheme: endpoint.scheme,
|
||||
host: endpoint.host,
|
||||
@@ -106,6 +118,10 @@ class Avatars extends Service {
|
||||
'project': client.config['project'],
|
||||
};
|
||||
|
||||
params.keys.forEach((key) {if (params[key] is int || params[key] is double) {
|
||||
params[key] = params[key].toString();
|
||||
}});
|
||||
|
||||
Uri endpoint = Uri.parse(client.endPoint);
|
||||
Uri location = new Uri(scheme: endpoint.scheme,
|
||||
host: endpoint.host,
|
||||
@@ -134,6 +150,10 @@ class Avatars extends Service {
|
||||
'project': client.config['project'],
|
||||
};
|
||||
|
||||
params.keys.forEach((key) {if (params[key] is int || params[key] is double) {
|
||||
params[key] = params[key].toString();
|
||||
}});
|
||||
|
||||
Uri endpoint = Uri.parse(client.endPoint);
|
||||
Uri location = new Uri(scheme: endpoint.scheme,
|
||||
host: endpoint.host,
|
||||
@@ -161,6 +181,10 @@ class Avatars extends Service {
|
||||
'project': client.config['project'],
|
||||
};
|
||||
|
||||
params.keys.forEach((key) {if (params[key] is int || params[key] is double) {
|
||||
params[key] = params[key].toString();
|
||||
}});
|
||||
|
||||
Uri endpoint = Uri.parse(client.endPoint);
|
||||
Uri location = new Uri(scheme: endpoint.scheme,
|
||||
host: endpoint.host,
|
||||
|
||||
@@ -124,6 +124,10 @@ class Storage extends Service {
|
||||
'project': client.config['project'],
|
||||
};
|
||||
|
||||
params.keys.forEach((key) {if (params[key] is int || params[key] is double) {
|
||||
params[key] = params[key].toString();
|
||||
}});
|
||||
|
||||
Uri endpoint = Uri.parse(client.endPoint);
|
||||
Uri location = new Uri(scheme: endpoint.scheme,
|
||||
host: endpoint.host,
|
||||
@@ -154,6 +158,10 @@ class Storage extends Service {
|
||||
'project': client.config['project'],
|
||||
};
|
||||
|
||||
params.keys.forEach((key) {if (params[key] is int || params[key] is double) {
|
||||
params[key] = params[key].toString();
|
||||
}});
|
||||
|
||||
Uri endpoint = Uri.parse(client.endPoint);
|
||||
Uri location = new Uri(scheme: endpoint.scheme,
|
||||
host: endpoint.host,
|
||||
@@ -178,6 +186,10 @@ class Storage extends Service {
|
||||
'project': client.config['project'],
|
||||
};
|
||||
|
||||
params.keys.forEach((key) {if (params[key] is int || params[key] is double) {
|
||||
params[key] = params[key].toString();
|
||||
}});
|
||||
|
||||
Uri endpoint = Uri.parse(client.endPoint);
|
||||
Uri location = new Uri(scheme: endpoint.scheme,
|
||||
host: endpoint.host,
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
name: appwrite
|
||||
version: 0.2.3
|
||||
name: appwrite_dev
|
||||
version: 0.3.2
|
||||
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
|
||||
homepage: https://appwrite.io
|
||||
repository: https://github.com/appwrite/sdk-for-flutter-dev
|
||||
@@ -9,30 +9,15 @@ environment:
|
||||
sdk: '>=2.6.0 <3.0.0'
|
||||
dependencies:
|
||||
meta: ^1.1.8
|
||||
path_provider: ^1.6.5
|
||||
package_info: ^0.4.0+16
|
||||
dio: ^3.0.0
|
||||
cookie_jar: ^1.0.0
|
||||
path_provider: ^1.6.14
|
||||
package_info: ^0.4.3
|
||||
dio: ^3.0.10
|
||||
cookie_jar: ^1.0.1
|
||||
dio_cookie_manager: ^1.0.0
|
||||
flutter_web_auth: ^0.2.4
|
||||
flutter:
|
||||
sdk: flutter
|
||||
|
||||
# The following adds the Cupertino Icons font to your application.
|
||||
# Use with the CupertinoIcons class for iOS style icons.
|
||||
cupertino_icons: ^0.1.2
|
||||
|
||||
dev_dependencies:
|
||||
flutter_test:
|
||||
sdk: flutter
|
||||
|
||||
# For information on the generic Dart part of this file, see the
|
||||
# following page: https://dart.dev/tools/pub/pubspec
|
||||
|
||||
# The following section is specific to Flutter.
|
||||
flutter:
|
||||
|
||||
# The following line ensures that the Material Icons font is
|
||||
# included with your application, so that you can use the icons in
|
||||
# the material Icons class.
|
||||
uses-material-design: true
|
||||
sdk: flutter
|
||||
@@ -1,3 +1,8 @@
|
||||
## 0.3.0-dev.1
|
||||
|
||||
- Updated package dependencies (@lohanidamodar)
|
||||
- Added Flutter for Web compatibility (@lohanidamodar)
|
||||
|
||||
## 0.2.3
|
||||
|
||||
- Fixed OAuth2 cookie bug, where a new session cookie couldn't overwrite an old cookie
|
||||
|
||||
@@ -20,7 +20,7 @@ Add this to your package's `pubspec.yaml` file:
|
||||
|
||||
```yml
|
||||
dependencies:
|
||||
appwrite: ^0.2.3
|
||||
appwrite: ^0.3.0-dev.1
|
||||
```
|
||||
|
||||
You can install packages from the command line:
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:dio/dio.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:dio/adapter.dart';
|
||||
import 'package:dio_cookie_manager/dio_cookie_manager.dart';
|
||||
import 'package:cookie_jar/cookie_jar.dart';
|
||||
@@ -20,17 +21,21 @@ class Client {
|
||||
PersistCookieJar cookieJar;
|
||||
|
||||
Client({this.endPoint = 'https://appwrite.io/v1', this.selfSigned = false, Dio http}) : this.http = http ?? Dio() {
|
||||
|
||||
type = (Platform.isIOS) ? 'ios' : type;
|
||||
type = (Platform.isMacOS) ? 'macos' : type;
|
||||
type = (Platform.isAndroid) ? 'android' : type;
|
||||
type = (Platform.isLinux) ? 'linux' : type;
|
||||
type = (Platform.isWindows) ? 'windows' : type;
|
||||
type = (Platform.isFuchsia) ? 'fuchsia' : type;
|
||||
// Platform is not supported in web so if web, set type to web automatically and skip Platform check
|
||||
if(kIsWeb) {
|
||||
type = 'web';
|
||||
}else{
|
||||
type = (Platform.isIOS) ? 'ios' : type;
|
||||
type = (Platform.isMacOS) ? 'macos' : type;
|
||||
type = (Platform.isAndroid) ? 'android' : type;
|
||||
type = (Platform.isLinux) ? 'linux' : type;
|
||||
type = (Platform.isWindows) ? 'windows' : type;
|
||||
type = (Platform.isFuchsia) ? 'fuchsia' : type;
|
||||
}
|
||||
|
||||
this.headers = {
|
||||
'content-type': 'application/json',
|
||||
'x-sdk-version': 'appwrite:dart:0.2.3',
|
||||
'x-sdk-version': 'appwrite:flutter:0.3.0-dev.1',
|
||||
};
|
||||
|
||||
this.config = {};
|
||||
@@ -78,17 +83,20 @@ class Client {
|
||||
|
||||
Future init() async {
|
||||
if(!initialized) {
|
||||
final Directory cookieDir = await _getCookiePath();
|
||||
|
||||
cookieJar = new PersistCookieJar(dir:cookieDir.path);
|
||||
// if web skip cookie implementation and origin header as those are automatically handled by browsers
|
||||
if(!kIsWeb) {
|
||||
final Directory cookieDir = await _getCookiePath();
|
||||
cookieJar = new PersistCookieJar(dir:cookieDir.path);
|
||||
this.http.interceptors.add(CookieManager(cookieJar));
|
||||
PackageInfo packageInfo = await PackageInfo.fromPlatform();
|
||||
addHeader('Origin', 'appwrite-' + type + '://' + packageInfo.packageName);
|
||||
}else{
|
||||
// if web set httpClientAdapter as BrowserHttpClientAdapter with withCredentials true to make cookies work
|
||||
this.http.options.extra['withCredentials'] = true;
|
||||
}
|
||||
|
||||
this.http.options.baseUrl = this.endPoint;
|
||||
this.http.options.validateStatus = (status) => status < 400;
|
||||
this.http.interceptors.add(CookieManager(cookieJar));
|
||||
|
||||
PackageInfo packageInfo = await PackageInfo.fromPlatform();
|
||||
|
||||
addHeader('Origin', 'appwrite-' + type + '://' + packageInfo.packageName);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -114,6 +122,10 @@ class Client {
|
||||
}
|
||||
|
||||
if (method == HttpMethod.get) {
|
||||
params.keys.forEach((key) {if (params[key] is int || params[key] is double) {
|
||||
params[key] = params[key].toString();
|
||||
}});
|
||||
|
||||
return http.get(path, queryParameters: params, options: options);
|
||||
} else {
|
||||
return http.request(path, data: params, options: options);
|
||||
|
||||
@@ -27,6 +27,10 @@ class Avatars extends Service {
|
||||
'project': client.config['project'],
|
||||
};
|
||||
|
||||
params.keys.forEach((key) {if (params[key] is int || params[key] is double) {
|
||||
params[key] = params[key].toString();
|
||||
}});
|
||||
|
||||
Uri endpoint = Uri.parse(client.endPoint);
|
||||
Uri location = new Uri(scheme: endpoint.scheme,
|
||||
host: endpoint.host,
|
||||
@@ -55,6 +59,10 @@ class Avatars extends Service {
|
||||
'project': client.config['project'],
|
||||
};
|
||||
|
||||
params.keys.forEach((key) {if (params[key] is int || params[key] is double) {
|
||||
params[key] = params[key].toString();
|
||||
}});
|
||||
|
||||
Uri endpoint = Uri.parse(client.endPoint);
|
||||
Uri location = new Uri(scheme: endpoint.scheme,
|
||||
host: endpoint.host,
|
||||
@@ -79,6 +87,10 @@ class Avatars extends Service {
|
||||
'project': client.config['project'],
|
||||
};
|
||||
|
||||
params.keys.forEach((key) {if (params[key] is int || params[key] is double) {
|
||||
params[key] = params[key].toString();
|
||||
}});
|
||||
|
||||
Uri endpoint = Uri.parse(client.endPoint);
|
||||
Uri location = new Uri(scheme: endpoint.scheme,
|
||||
host: endpoint.host,
|
||||
@@ -106,6 +118,10 @@ class Avatars extends Service {
|
||||
'project': client.config['project'],
|
||||
};
|
||||
|
||||
params.keys.forEach((key) {if (params[key] is int || params[key] is double) {
|
||||
params[key] = params[key].toString();
|
||||
}});
|
||||
|
||||
Uri endpoint = Uri.parse(client.endPoint);
|
||||
Uri location = new Uri(scheme: endpoint.scheme,
|
||||
host: endpoint.host,
|
||||
@@ -134,6 +150,10 @@ class Avatars extends Service {
|
||||
'project': client.config['project'],
|
||||
};
|
||||
|
||||
params.keys.forEach((key) {if (params[key] is int || params[key] is double) {
|
||||
params[key] = params[key].toString();
|
||||
}});
|
||||
|
||||
Uri endpoint = Uri.parse(client.endPoint);
|
||||
Uri location = new Uri(scheme: endpoint.scheme,
|
||||
host: endpoint.host,
|
||||
@@ -197,6 +217,10 @@ class Avatars extends Service {
|
||||
'project': client.config['project'],
|
||||
};
|
||||
|
||||
params.keys.forEach((key) {if (params[key] is int || params[key] is double) {
|
||||
params[key] = params[key].toString();
|
||||
}});
|
||||
|
||||
Uri endpoint = Uri.parse(client.endPoint);
|
||||
Uri location = new Uri(scheme: endpoint.scheme,
|
||||
host: endpoint.host,
|
||||
|
||||
@@ -124,6 +124,10 @@ class Storage extends Service {
|
||||
'project': client.config['project'],
|
||||
};
|
||||
|
||||
params.keys.forEach((key) {if (params[key] is int || params[key] is double) {
|
||||
params[key] = params[key].toString();
|
||||
}});
|
||||
|
||||
Uri endpoint = Uri.parse(client.endPoint);
|
||||
Uri location = new Uri(scheme: endpoint.scheme,
|
||||
host: endpoint.host,
|
||||
@@ -154,6 +158,10 @@ class Storage extends Service {
|
||||
'project': client.config['project'],
|
||||
};
|
||||
|
||||
params.keys.forEach((key) {if (params[key] is int || params[key] is double) {
|
||||
params[key] = params[key].toString();
|
||||
}});
|
||||
|
||||
Uri endpoint = Uri.parse(client.endPoint);
|
||||
Uri location = new Uri(scheme: endpoint.scheme,
|
||||
host: endpoint.host,
|
||||
@@ -178,6 +186,10 @@ class Storage extends Service {
|
||||
'project': client.config['project'],
|
||||
};
|
||||
|
||||
params.keys.forEach((key) {if (params[key] is int || params[key] is double) {
|
||||
params[key] = params[key].toString();
|
||||
}});
|
||||
|
||||
Uri endpoint = Uri.parse(client.endPoint);
|
||||
Uri location = new Uri(scheme: endpoint.scheme,
|
||||
host: endpoint.host,
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
name: appwrite
|
||||
version: 0.2.3
|
||||
version: 0.3.0-dev.1
|
||||
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
|
||||
homepage: https://appwrite.io
|
||||
repository: https://github.com/appwrite/sdk-for-flutter
|
||||
@@ -9,30 +9,15 @@ environment:
|
||||
sdk: '>=2.6.0 <3.0.0'
|
||||
dependencies:
|
||||
meta: ^1.1.8
|
||||
path_provider: ^1.6.5
|
||||
package_info: ^0.4.0+16
|
||||
dio: ^3.0.0
|
||||
cookie_jar: ^1.0.0
|
||||
path_provider: ^1.6.14
|
||||
package_info: ^0.4.3
|
||||
dio: ^3.0.10
|
||||
cookie_jar: ^1.0.1
|
||||
dio_cookie_manager: ^1.0.0
|
||||
flutter_web_auth: ^0.2.4
|
||||
flutter:
|
||||
sdk: flutter
|
||||
|
||||
# The following adds the Cupertino Icons font to your application.
|
||||
# Use with the CupertinoIcons class for iOS style icons.
|
||||
cupertino_icons: ^0.1.2
|
||||
|
||||
dev_dependencies:
|
||||
flutter_test:
|
||||
sdk: flutter
|
||||
|
||||
# For information on the generic Dart part of this file, see the
|
||||
# following page: https://dart.dev/tools/pub/pubspec
|
||||
|
||||
# The following section is specific to Flutter.
|
||||
flutter:
|
||||
|
||||
# The following line ensures that the Material Icons font is
|
||||
# included with your application, so that you can use the icons in
|
||||
# the material Icons class.
|
||||
uses-material-design: true
|
||||
sdk: flutter
|
||||
+1
-1
@@ -123,7 +123,7 @@ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
break;
|
||||
case 'flutter-dev':
|
||||
$config = new Flutter();
|
||||
$config->setPackageName('appwrite-dev');
|
||||
$config->setPackageName('appwrite_dev');
|
||||
break;
|
||||
case 'dart':
|
||||
$config = new Dart();
|
||||
|
||||
@@ -46,7 +46,7 @@
|
||||
|
||||
<div class="row responsive">
|
||||
<div class="col span-8 margin-bottom-small">
|
||||
<input name="name" id="name" type="text" autocomplete="off" data-ls-bind="{{account.name}}" required class="margin-bottom-no">
|
||||
<input name="name" id="name" type="text" autocomplete="off" data-ls-bind="{{account.name}}" required class="margin-bottom-no" maxlength="128">
|
||||
</div>
|
||||
<div class="col span-4">
|
||||
<button type="submit" class="fill margin-bottom-no">Update Name</button>
|
||||
|
||||
@@ -220,7 +220,7 @@
|
||||
<p>Appwrite projects are containers for your resources and apps across different platforms.</p>
|
||||
|
||||
<label>Name</label>
|
||||
<input type="text" class="full-width margin-bottom-xl" name="name" required autocomplete="off" />
|
||||
<input type="text" class="full-width margin-bottom-xl" name="name" required autocomplete="off" maxlength="128" />
|
||||
|
||||
<footer>
|
||||
<button type="submit">Create</button> <button data-ui-modal-close="" type="button" class="reverse">Cancel</button>
|
||||
|
||||
@@ -193,7 +193,7 @@ $maxCells = 10;
|
||||
|
||||
<div class="box">
|
||||
<label for="collection-name">Name</label>
|
||||
<input name="name" id="collection-name" type="text" autocomplete="off" data-ls-bind="{{project-collection.name}}" data-forms-text-direction required placeholder="Collection Name" />
|
||||
<input name="name" id="collection-name" type="text" autocomplete="off" data-ls-bind="{{project-collection.name}}" data-forms-text-direction required placeholder="Collection Name" maxlength="128" />
|
||||
|
||||
<h3 class="margin-bottom-small">Rules</h3>
|
||||
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
data-failure-param-alert-classname="error">
|
||||
|
||||
<label for="user-name">Name</label>
|
||||
<input type="text" class="full-width" id="collection-name" name="name" required autocomplete="off" />
|
||||
<input type="text" class="full-width" id="collection-name" name="name" required autocomplete="off" maxlength="128" />
|
||||
|
||||
<input type="hidden" id="collection-read" name="read" required data-cast-to="json" value="<?php echo htmlentities(json_encode([])); ?>" />
|
||||
<input type="hidden" id="collection-write" name="write" required data-cast-to="json" value="<?php echo htmlentities(json_encode([])); ?>" />
|
||||
|
||||
@@ -483,7 +483,7 @@ $timeout = $this->getParam('timeout', 900);
|
||||
<div class="box">
|
||||
<section class="margin-bottom-large">
|
||||
<label for="name">Name</label>
|
||||
<input name="name" id="function-name" type="text" autocomplete="off" data-ls-bind="{{project-function.name}}" data-forms-text-direction required placeholder="Function Name" />
|
||||
<input name="name" id="function-name" type="text" autocomplete="off" data-ls-bind="{{project-function.name}}" data-forms-text-direction required placeholder="Function Name" maxlength="128" />
|
||||
|
||||
<label for="timeout">Timeout (seconds) <span class="tooltip small" data-tooltip="Limit the execution time of your function."><i class="icon-info-circled"></i></span></label>
|
||||
<input name="timeout" id="function-timeout" type="number" autocomplete="off" data-ls-bind="{{project-function.timeout}}" min="1" max="<?php echo $this->escape($timeout); ?>" />
|
||||
|
||||
@@ -105,7 +105,7 @@ $environments = $this->getParam('environments', []);
|
||||
data-failure-param-alert-classname="error">
|
||||
|
||||
<label for="name">Name</label>
|
||||
<input type="text" id="name" name="name" required autocomplete="off" class="margin-bottom" />
|
||||
<input type="text" id="name" name="name" required autocomplete="off" class="margin-bottom" maxlength="128" />
|
||||
|
||||
<label for="env">Environment</label>
|
||||
<select name="env" id="env" required class="margin-bottom-xl">
|
||||
|
||||
@@ -237,7 +237,7 @@ $graph = $this->getParam('graph', false);
|
||||
<input type="hidden" name="type" data-ls-bind="web" />
|
||||
|
||||
<label for="name">Name <span class="tooltip large" data-tooltip="Choose any name that will help you distinguish between your different apps."><i class="icon-question"></i></span></label>
|
||||
<input type="text" class="full-width" name="name" required autocomplete="off" placeholder="My Web App" />
|
||||
<input type="text" class="full-width" name="name" required autocomplete="off" placeholder="My Web App" maxlength="128" />
|
||||
|
||||
<label for="hostname">Hostname <span class="tooltip large" data-tooltip="The hostname that your website will use to interact with the <?php echo APP_NAME; ?> APIs in production or development environments. No port number required."><i class="icon-question"></i></span></label>
|
||||
<input name="hostname" type="text" class="margin-bottom" autocomplete="off" placeholder="localhost" required>
|
||||
@@ -275,7 +275,7 @@ $graph = $this->getParam('graph', false);
|
||||
<input type="hidden" name="platformId" data-ls-bind="{{platform.$id}}" />
|
||||
|
||||
<label data-ls-attrs="for=name-{{platform.$id}}">Name <span class="tooltip large" data-tooltip="Choose any name that will help you distinguish between your different apps."><i class="icon-question"></i></span></label>
|
||||
<input type="text" class="full-width" data-ls-attrs="id=name-{{platform.$id}}" name="name" required autocomplete="off" data-ls-bind="{{platform.name}}" placeholder="My Web App" />
|
||||
<input type="text" class="full-width" data-ls-attrs="id=name-{{platform.$id}}" name="name" required autocomplete="off" data-ls-bind="{{platform.name}}" placeholder="My Web App" maxlength="128" />
|
||||
|
||||
<label for="hostname">Hostname <span class="tooltip large" data-tooltip="The hostname that your website will use to interact with the <?php echo APP_NAME; ?> APIs in production or development environments. No port number required."><i class="icon-question"></i></span></label>
|
||||
<input name="hostname" type="text" class="margin-bottom" autocomplete="off" placeholder="localhost" data-ls-bind="{{platform.hostname}}" required />
|
||||
@@ -313,7 +313,7 @@ $graph = $this->getParam('graph', false);
|
||||
<input type="hidden" name="type" data-ls-bind="flutter-ios" />
|
||||
|
||||
<label for="name">Name <span class="tooltip large" data-tooltip="Choose any name that will help you distinguish between your different apps."><i class="icon-question"></i></span></label>
|
||||
<input type="text" class="full-width" name="name" required autocomplete="off" placeholder="My iOS App" />
|
||||
<input type="text" class="full-width" name="name" required autocomplete="off" placeholder="My iOS App" maxlength="128" />
|
||||
|
||||
<label for="key">Bundle ID <span class="tooltip large" data-tooltip="You can find your Bundle Identifier in the General tab for your app's primary target in Xcode."><i class="icon-question"></i></span></label>
|
||||
<input type="text" class="full-width" name="key" required autocomplete="off" placeholder="com.company.appname" />
|
||||
@@ -345,7 +345,7 @@ $graph = $this->getParam('graph', false);
|
||||
<input type="hidden" name="type" data-ls-bind="flutter-android" />
|
||||
|
||||
<label for="name">Name <span class="tooltip large" data-tooltip="Choose any name that will help you distinguish between your different apps."><i class="icon-question"></i></span></label>
|
||||
<input type="text" class="full-width" name="name" required autocomplete="off" placeholder="My Android App" />
|
||||
<input type="text" class="full-width" name="name" required autocomplete="off" placeholder="My Android App" maxlength="128" />
|
||||
|
||||
<label for="key">Package Name <span class="tooltip large" data-tooltip="Your package name is generally the applicationId in your app-level build.gradle file."><i class="icon-question"></i></span></label>
|
||||
<input type="text" class="full-width" name="key" required autocomplete="off" placeholder="com.company.appname" />
|
||||
@@ -377,7 +377,7 @@ $graph = $this->getParam('graph', false);
|
||||
<input type="hidden" name="platformId" data-ls-bind="{{platform.$id}}" />
|
||||
|
||||
<label data-ls-attrs="for=name-{{platform.$id}}">Name <span class="tooltip large" data-tooltip="Choose any name that will help you distinguish between your different apps."><i class="icon-question"></i></span></label>
|
||||
<input type="text" class="full-width" data-ls-attrs="id=name-{{platform.$id}}" name="name" required autocomplete="off" data-ls-bind="{{platform.name}}" placeholder="My iOS App" />
|
||||
<input type="text" class="full-width" data-ls-attrs="id=name-{{platform.$id}}" name="name" required autocomplete="off" data-ls-bind="{{platform.name}}" placeholder="My iOS App" maxlength="128" />
|
||||
|
||||
<label data-ls-attrs="for=key-{{platform.$id}}">Bundle ID <span class="tooltip large" data-tooltip="You can find your Bundle Identifier in the General tab for your app's primary target in Xcode."><i class="icon-question"></i></span></label>
|
||||
<input name="key" type="text" class="margin-bottom" autocomplete="off" placeholder="com.cpmpany.appname" data-ls-bind="{{platform.key}}" required />
|
||||
@@ -407,7 +407,7 @@ $graph = $this->getParam('graph', false);
|
||||
<input type="hidden" name="platformId" data-ls-bind="{{platform.$id}}" />
|
||||
|
||||
<label data-ls-attrs="for=name-{{platform.$id}}">Name <span class="tooltip large" data-tooltip="Choose any name that will help you distinguish between your different apps."><i class="icon-question"></i></span></label>
|
||||
<input type="text" class="full-width" data-ls-attrs="id=name-{{platform.$id}}" name="name" required autocomplete="off" data-ls-bind="{{platform.name}}" placeholder="My Android App" />
|
||||
<input type="text" class="full-width" data-ls-attrs="id=name-{{platform.$id}}" name="name" required autocomplete="off" data-ls-bind="{{platform.name}}" placeholder="My Android App" maxlength="128" />
|
||||
|
||||
<label data-ls-attrs="for=key-{{platform.$id}}">Package Name <span class="tooltip large" data-tooltip="Your package name is generally the applicationId in your app-level build.gradle file."><i class="icon-question"></i></span></label>
|
||||
<input name="key" type="text" class="margin-bottom" autocomplete="off" placeholder="com.cpmpany.appname" data-ls-bind="{{platform.key}}" required />
|
||||
|
||||
@@ -50,7 +50,7 @@ $scopes = $this->getParam('scopes', []);
|
||||
<input type="hidden" name="keyId" data-ls-bind="{{key.$id}}" />
|
||||
|
||||
<label data-ls-attrs="for=name-{{key.$id}}">Name <span class="tooltip large" data-tooltip="Choose any name that will help you distinguish between your different API keys."><i class="icon-question"></i></span></label>
|
||||
<input type="text" class="full-width" data-ls-attrs="id=name-{{key.$id}}" name="name" required autocomplete="off" data-ls-bind="{{key.name}}" />
|
||||
<input type="text" class="full-width" data-ls-attrs="id=name-{{key.$id}}" name="name" required autocomplete="off" data-ls-bind="{{key.name}}" maxlength="128" />
|
||||
|
||||
<section data-forms-select-all>
|
||||
<label data-ls-attrs="for=scopes-{{key.$id}}">Scopes (<a data-ls-attrs="href={{env.HOME}}/docs/keys" target="_blank" rel="noopener">Learn more</a>)</label>
|
||||
@@ -147,7 +147,7 @@ $scopes = $this->getParam('scopes', []);
|
||||
<input type="hidden" name="projectId" data-ls-bind="{{router.params.project}}" />
|
||||
|
||||
<label for="name">Name <span class="tooltip large" data-tooltip="Choose any name that will help you distinguish between your different API keys."><i class="icon-question"></i></span></label>
|
||||
<input type="text" class="full-width" id="name" name="name" required autocomplete="off" />
|
||||
<input type="text" class="full-width" id="name" name="name" required autocomplete="off" maxlength="128" />
|
||||
|
||||
<section data-forms-select-all>
|
||||
<label for="scopes">Scopes (<a data-ls-attrs="href={{env.HOME}}/docs/keys" target="_blank" rel="noopener">Learn more</a>)</label>
|
||||
|
||||
@@ -50,7 +50,7 @@ $customDomainsTarget = $this->getParam('customDomainsTarget', false);
|
||||
<input name="$id" type="hidden" data-ls-bind="{{console-project.$id}}" />
|
||||
|
||||
<label for="name">Name</label>
|
||||
<input name="name" id="name" type="text" autocomplete="off" data-ls-bind="{{console-project.name}}" data-forms-text-direction required>
|
||||
<input name="name" id="name" type="text" autocomplete="off" data-ls-bind="{{console-project.name}}" data-forms-text-direction required maxlength="128" />
|
||||
|
||||
<label for="logo">Project Logo</label>
|
||||
|
||||
@@ -483,7 +483,7 @@ $customDomainsTarget = $this->getParam('customDomainsTarget', false);
|
||||
<input name="email" id="email" type="email" autocomplete="email" required>
|
||||
|
||||
<label for="team-name">Name <small>(optional)</small></label>
|
||||
<input name="name" id="team-name" type="text" autocomplete="name">
|
||||
<input name="name" id="team-name" type="text" autocomplete="name" maxlength="128" />
|
||||
|
||||
<label for="roles" style="display: none">Role</label>
|
||||
<select id="roles" name="roles" required data-ls-loop="env.ROLES" data-ls-as="role" data-cast-to="array" style="display: none">
|
||||
|
||||
@@ -95,7 +95,7 @@
|
||||
<input type="hidden" name="taskId" data-ls-bind="{{task.$id}}" />
|
||||
|
||||
<label data-ls-attrs="for=name-{{task.$id}}">Name</label>
|
||||
<input type="text" class="full-width" data-ls-attrs="id=name-{{task.$id}}" name="name" required autocomplete="off" data-ls-bind="{{task.name}}" />
|
||||
<input type="text" class="full-width" data-ls-attrs="id=name-{{task.$id}}" name="name" required autocomplete="off" data-ls-bind="{{task.name}}" maxlength="128" />
|
||||
|
||||
<label data-ls-attrs="for=status-{{task.$id}}" class="margin-bottom">Status
|
||||
<div class="margin-top-small">
|
||||
@@ -254,7 +254,7 @@
|
||||
<input type="hidden" name="projectId" data-ls-bind="{{router.params.project}}" />
|
||||
|
||||
<label for="name">Name</label>
|
||||
<input type="text" class="full-width" id="name" name="name" required autocomplete="off" />
|
||||
<input type="text" class="full-width" id="name" name="name" required autocomplete="off" maxlength="128" />
|
||||
|
||||
<label data-ls-attrs="for=status" class="margin-bottom">Status
|
||||
<div class="margin-top-small">
|
||||
|
||||
@@ -36,7 +36,7 @@ $providers = $this->getParam('providers', []);
|
||||
data-failure-param-alert-classname="error">
|
||||
|
||||
<label for="user-name">Name</label>
|
||||
<input type="text" class="full-width" id="user-name" name="name" required autocomplete="off" />
|
||||
<input type="text" class="full-width" id="user-name" name="name" required autocomplete="off" maxlength="128" />
|
||||
|
||||
<label for="user-email">Email</label>
|
||||
<input type="email" class="full-width" id="user-email" name="email" required autocomplete="off" />
|
||||
@@ -189,7 +189,7 @@ $providers = $this->getParam('providers', []);
|
||||
data-failure-param-alert-classname="error">
|
||||
|
||||
<label for="team-name">Name</label>
|
||||
<input type="text" class="full-width" id="team-name" name="name" required autocomplete="off" />
|
||||
<input type="text" class="full-width" id="team-name" name="name" required autocomplete="off" maxlength="128" />
|
||||
|
||||
<hr />
|
||||
|
||||
|
||||
@@ -55,7 +55,7 @@
|
||||
<input data-ls-attrs="id=team-id-{{team.$id}}" name="teamId" type="hidden" disabled data-ls-bind="{{team.$id}}" />
|
||||
|
||||
<label for="name">Name</label>
|
||||
<input data-ls-attrs="id=team-name-{{team.$id}}" name="name" type="text" autocomplete="off" data-ls-bind="{{team.name}}">
|
||||
<input data-ls-attrs="id=team-name-{{team.$id}}" name="name" type="text" autocomplete="off" data-ls-bind="{{team.name}}" maxlength="128" />
|
||||
|
||||
<hr />
|
||||
|
||||
@@ -145,7 +145,7 @@
|
||||
<input name="email" id="email" type="email" autocomplete="email" required>
|
||||
|
||||
<label for="team-name">Name <small>(optional)</small></label>
|
||||
<input name="name" id="team-name" type="text" autocomplete="name">
|
||||
<input name="name" id="team-name" type="text" autocomplete="name" maxlength="128" />
|
||||
|
||||
<label for="roles">Roles</label>
|
||||
<input type="hidden" id="team-roles" name="roles" data-forms-tags data-cast-to="json" data-ls-bind="<?php echo $this->escape(json_encode(['owner'])); ?>" placeholder="Add any role you like" />
|
||||
|
||||
@@ -54,7 +54,7 @@ $events = array_keys($this->getParam('events', []));
|
||||
<input type="hidden" name="webhookId" data-ls-bind="{{webhook.$id}}" />
|
||||
|
||||
<label data-ls-attrs="for=name-{{webhook.$id}}">Name</label>
|
||||
<input type="text" class="full-width" data-ls-attrs="id=name-{{webhook.$id}}" name="name" required autocomplete="off" data-ls-bind="{{webhook.name}}" />
|
||||
<input type="text" class="full-width" data-ls-attrs="id=name-{{webhook.$id}}" name="name" required autocomplete="off" data-ls-bind="{{webhook.name}}" maxlength="128" />
|
||||
|
||||
<section data-forms-select-all>
|
||||
<label data-ls-attrs="for=events-{{webhook.$id}}">Events</label>
|
||||
@@ -170,7 +170,7 @@ $events = array_keys($this->getParam('events', []));
|
||||
<input type="hidden" name="projectId" data-ls-bind="{{router.params.project}}" />
|
||||
|
||||
<label for="name">Name</label>
|
||||
<input type="text" class="full-width" id="name" name="name" required autocomplete="off" />
|
||||
<input type="text" class="full-width" id="name" name="name" required autocomplete="off" maxlength="128" />
|
||||
|
||||
<section data-forms-select-all>
|
||||
<label for="events">Events</label>
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
data-failure-param-alert-classname="error">
|
||||
|
||||
<label>Name</label>
|
||||
<input name="name" type="text" autocomplete="name" placeholder="" required>
|
||||
<input name="name" type="text" autocomplete="name" placeholder="" required maxlength="128">
|
||||
|
||||
<label>Email</label>
|
||||
<input name="email" type="email" autocomplete="email" placeholder="" required data-ls-bind="{{router.params.email}}">
|
||||
|
||||
@@ -1,3 +1,16 @@
|
||||
## 0.3.2
|
||||
|
||||
- Fixed package namespaces
|
||||
|
||||
## 0.3.1
|
||||
|
||||
- Downgraded meta package version to 1.1.8
|
||||
|
||||
## 0.3.0
|
||||
|
||||
- Updated package dependencies (@lohanidamodar)
|
||||
- Added Flutter for Web compatibility (@lohanidamodar)
|
||||
|
||||
## 0.2.3
|
||||
|
||||
- Fixed OAuth2 cookie bug, where a new session cookie couldn't overwrite an old cookie
|
||||
|
||||
@@ -1,3 +1,8 @@
|
||||
## 0.3.0-dev.1
|
||||
|
||||
- Updated package dependencies (@lohanidamodar)
|
||||
- Added Flutter for Web compatibility (@lohanidamodar)
|
||||
|
||||
## 0.2.3
|
||||
|
||||
- Fixed OAuth2 cookie bug, where a new session cookie couldn't overwrite an old cookie
|
||||
|
||||
@@ -412,7 +412,7 @@ trait AccountBase
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'cookie' => 'a_session_'.$this->getProject()['$id'].'=' . $session,
|
||||
]), [
|
||||
'name' => 'ocSRq1d3QphHivJyUmYY7WMnrxyjdk5YvVwcDqx2zS0coxESN8RmsQwLWw5Whnf0WbVohuFWTRAaoKgCOO0Y0M7LwgFnZmi8881Y7'
|
||||
'name' => 'ocSRq1d3QphHivJyUmYY7WMnrxyjdk5YvVwcDqx2zS0coxESN8RmsQwLWw5Whnf0WbVohuFWTRAaoKgCOO0Y0M7LwgFnZmi8881Y72222222222222222222222222222'
|
||||
]);
|
||||
|
||||
$this->assertEquals($response['headers']['status-code'], 400);
|
||||
|
||||
Reference in New Issue
Block a user