1
0
Fork 0
mirror of synced 2024-06-29 19:50:26 +12:00

Merge branch 'master' into feat-storage-buckets

This commit is contained in:
Damodar Lohani 2022-01-16 17:18:43 +05:45
commit 4a37d402df
38 changed files with 1016 additions and 1056 deletions

View file

@ -37,6 +37,7 @@ body:
label: "🎲 Appwrite version"
description: "What version of Appwrite are you running?"
options:
- Version 0.12.x
- Version 0.11.x
- Version 0.10.x
- Version 0.9.x

View file

@ -1,3 +1,13 @@
# Version 0.12.1
## Bugs
- Fixed some issues with the Migration
- Fixed the UI to add Variables to Functions
- Fixed wrong data type for String Attribute size
- Fixed Request stats on the console
- Fixed Realtime Connection stats with high number by abbreviation
- Fixed backward compatibility of account status attribute.
# Version 0.12.0
## Features

View file

@ -32,7 +32,7 @@ ENV DEBUG=$DEBUG
ENV PHP_REDIS_VERSION=5.3.5 \
PHP_MONGODB_VERSION=1.9.1 \
PHP_SWOOLE_VERSION=v4.8.5 \
PHP_IMAGICK_VERSION=3.5.1 \
PHP_IMAGICK_VERSION=3.7.0 \
PHP_YAML_VERSION=2.2.2 \
PHP_MAXMINDDB_VERSION=v1.11.0

View file

@ -40,6 +40,7 @@ Table of Contents:
- [Client](#client)
- [Server](#server)
- [Community](#community)
- [Architecture](#architecture)
- [Contributing](#contributing)
- [Security](#security)
- [Follow Us](#follow-us)
@ -58,7 +59,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.12.0
appwrite/appwrite:0.12.1
```
### Windows
@ -70,7 +71,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.12.0
appwrite/appwrite:0.12.1
```
#### PowerShell
@ -80,7 +81,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.12.0
appwrite/appwrite:0.12.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.
@ -143,6 +144,15 @@ Below is a list of currently supported platforms and languages. If you wish to h
Looking for more SDKs? - Help us by contributing a pull request to our [SDK Generator](https://github.com/appwrite/sdk-generator)!
## Architecture
![Appwrite Architecture](docs/specs/overview.drawio.svg)
Appwrite uses a microservices architecture that was designed for easy scaling and delegation of responsibilities. In addition, Appwrite supports multiple APIs (REST, WebSocket, and GraphQL-soon) to allow you to interact with your resources leveraging your existing knowledge and protocols of choice.
The Appwrite API layer was designed to be extremely fast by leveraging in-memory caching and delegating any heavy-lifting tasks to the Appwrite background workers. The background workers also allow you to precisely control your compute capacity and costs using a message queue to handle the load. You can learn more about our architecture in the [contribution guide](CONTRIBUTING.md#architecture-1).
## Contributing
All code contributions - including those of people having commit access - must go through a pull request and be approved by a core developer before being merged. This is to ensure a proper review of all the code.

View file

@ -19,18 +19,6 @@ $collections = [
'webhooks' => [],
'keys' => [],
'platforms' => [
[
'$collection' => Database::SYSTEM_COLLECTION_PLATFORMS,
'name' => 'Production',
'type' => 'web',
'hostname' => 'appwrite.io',
],
[
'$collection' => Database::SYSTEM_COLLECTION_PLATFORMS,
'name' => 'Development',
'type' => 'web',
'hostname' => 'appwrite.test',
],
[
'$collection' => Database::SYSTEM_COLLECTION_PLATFORMS,
'name' => 'Localhost',

View file

@ -2253,6 +2253,7 @@ $collections = [
],
],
],
'realtime' => [
'$collection' => Database::METADATA,
'$id' => 'realtime',

View file

@ -152,7 +152,7 @@ return [
// ],
],
],
APP_PLATFORM_CONSOLE => [
'key' => APP_PLATFORM_CONSOLE,
'name' => 'Console',
@ -190,7 +190,7 @@ return [
[
'key' => 'nodejs',
'name' => 'Node.js',
'version' => '4.0.1',
'version' => '4.0.2',
'url' => 'https://github.com/appwrite/sdk-for-node',
'package' => 'https://www.npmjs.com/package/node-appwrite',
'enabled' => true,
@ -208,7 +208,7 @@ return [
[
'key' => 'deno',
'name' => 'Deno',
'version' => '2.0.1',
'version' => '2.0.2',
'url' => 'https://github.com/appwrite/sdk-for-deno',
'package' => 'https://deno.land/x/appwrite',
'enabled' => true,
@ -334,7 +334,7 @@ return [
[
'key' => 'dart',
'name' => 'Dart',
'version' => '3.0.1',
'version' => '3.0.2',
'url' => 'https://github.com/appwrite/sdk-for-dart',
'package' => 'https://pub.dev/packages/dart_appwrite',
'enabled' => true,
@ -370,7 +370,7 @@ return [
[
'key' => 'kotlin',
'name' => 'Kotlin',
'version' => '0.2.0',
'version' => '0.2.2',
'url' => 'https://github.com/appwrite/sdk-for-kotlin',
'package' => 'https://search.maven.org/artifact/io.appwrite/sdk-for-kotlin',
'enabled' => true,
@ -392,7 +392,7 @@ return [
[
'key' => 'swift',
'name' => 'Swift',
'version' => '0.2.0',
'version' => '0.2.1',
'url' => 'https://github.com/appwrite/sdk-for-swift',
'package' => 'https://github.com/appwrite/sdk-for-swift',
'enabled' => 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

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -479,7 +479,7 @@ App::get('/v1/account/sessions/oauth2/:provider/redirect')
$limit = $project->getAttribute('auths', [])['limit'] ?? 0;
if ($limit !== 0) {
$sum = $dbForProject->count('users', [ new Query('deleted', Query::TYPE_EQUAL, [false]),], APP_LIMIT_COUNT);
$sum = $dbForProject->count('users', [ new Query('deleted', Query::TYPE_EQUAL, [false]),], APP_LIMIT_USERS);
if ($sum >= $limit) {
throw new Exception('Project registration is restricted. Contact your administrator for more information.', 501);
@ -652,7 +652,7 @@ App::post('/v1/account/sessions/magic-url')
if ($limit !== 0) {
$sum = $dbForProject->count('users', [
new Query('deleted', Query::TYPE_EQUAL, [false]),
], APP_LIMIT_COUNT);
], APP_LIMIT_USERS);
if ($sum >= $limit) {
throw new Exception('Project registration is restricted. Contact your administrator for more information.', 501);
@ -924,7 +924,7 @@ App::post('/v1/account/sessions/anonymous')
if ($limit !== 0) {
$sum = $dbForProject->count('users', [
new Query('deleted', Query::TYPE_EQUAL, [false]),
], APP_LIMIT_COUNT);
], APP_LIMIT_USERS);
if ($sum >= $limit) {
throw new Exception('Project registration is restricted. Contact your administrator for more information.', 501);

View file

@ -461,7 +461,7 @@ App::patch('/v1/projects/:projectId/auth/limit')
->label('sdk.response.type', Response::CONTENT_TYPE_JSON)
->label('sdk.response.model', Response::MODEL_PROJECT)
->param('projectId', '', new UID(), 'Project unique ID.')
->param('limit', false, new Integer(true), 'Set the max number of users allowed in this project. Use 0 for unlimited.')
->param('limit', false, new Range(0, APP_LIMIT_USERS), 'Set the max number of users allowed in this project. Use 0 for unlimited.')
->inject('response')
->inject('dbForConsole')
->action(function ($projectId, $limit, $response, $dbForConsole) {

View file

@ -353,10 +353,12 @@ App::get('/v1/mock/tests/general/set-cookie')
->label('sdk.response.model', Response::MODEL_MOCK)
->label('sdk.mock', true)
->inject('response')
->action(function ($response) {
->inject('request')
->action(function ($response, $request) {
/** @var Appwrite\Utopia\Response $response */
/** @var Appwrite\Utopia\Request $request */
$response->addCookie('cookieName', 'cookieValue', \time() + 31536000, '/', 'localhost', true, true);
$response->addCookie('cookieName', 'cookieValue', \time() + 31536000, '/', $request->getHostname(), true, true);
});
App::get('/v1/mock/tests/general/get-cookie')

View file

@ -64,7 +64,7 @@ const APP_LIMIT_USERS = 10000;
const APP_LIMIT_ANTIVIRUS = 20971520; //20MB
const APP_LIMIT_ENCRYPTION = 20971520; //20MB
const APP_LIMIT_COMPRESSION = 20971520; //20MB
const APP_CACHE_BUSTER = 200;
const APP_CACHE_BUSTER = 201;
const APP_VERSION_STABLE = '0.13.0';
const APP_DATABASE_ATTRIBUTE_EMAIL = 'email';
const APP_DATABASE_ATTRIBUTE_ENUM = 'enum';
@ -778,18 +778,6 @@ App::setResource('console', function() {
'webhooks' => [],
'keys' => [],
'platforms' => [
[
'$collection' => 'platforms',
'name' => 'Production',
'type' => 'web',
'hostname' => 'appwrite.io',
],
[
'$collection' => 'platforms',
'name' => 'Development',
'type' => 'web',
'hostname' => 'appwrite.test',
],
[
'$collection' => 'platforms',
'name' => 'Localhost',

View file

@ -97,13 +97,13 @@ $usageStatsEnabled = $this->getParam('usageStatsEnabled', true);
</div>
<div class="chart-metric">
<div class="value margin-bottom-small"><span class="sum" data-ls-bind="{{usage.requests|statsGetLast|statsTotal}}">N/A</span></div>
<div class="value margin-bottom-small"><span class="sum" data-ls-bind="{{usage.requests|statsGetSum|statsTotal}}">N/A</span></div>
<div class="unit margin-start-no margin-bottom-small">Requests</div>
</div>
</div>
<div class="col span-3">
<div class="value margin-bottom-small">
<span class="sum" data-ls-bind="{{realtime.current|accessProject}}" data-default="0">0</span>
<span class="sum" data-ls-bind="{{realtime.current|accessProject|statsTotal}}" data-default="0">0</span>
</div>
<div class="unit margin-start-no margin-bottom-small">Connections</div>
<div class="chart-bar margin-top-small margin-bottom-small" data-ls-attrs="data-history={{realtime.history|accessProject}}" data-forms-chart-bars="{{realtime.history|accessProject}}"></div>

View file

@ -353,13 +353,13 @@ $smtpEnabled = $this->getParam('smtpEnabled', false);
data-failure-param-alert-text="Failed to update project users limit"
data-failure-param-alert-classname="error">
<input name="limit" id="users-limit" type="number" data-ls-bind="{{console-project.authLimit}}" data-cast-to="numeric" min="0" />
<input name="limit" id="users-limit" type="number" data-ls-bind="{{console-project.authLimit}}" data-cast-to="numeric" min="0" max="<?php echo APP_LIMIT_USERS; ?>" />
<div class="info row thin margin-bottom margin-top">
<div class="col span-1">
<i class="icon-info-circled text-sign"></i>
</div>
<div class="col span-11">This limit will prevent new users from signing up for your project, no matter what auth method has been used. You will still be able to create users and team memberships from your Appwrite console. For an unlimited amount of users, set the limit to 0.</div>
<div class="col span-11">This limit will prevent new users from signing up for your project, no matter what auth method has been used. You will still be able to create users and team memberships from your Appwrite console. For an unlimited amount of users, set the limit to 0. Max limit is <?php echo number_format(APP_LIMIT_USERS); ?>.</div>
</div>
<button>Update</button> &nbsp; <button data-ui-modal-close="" type="button" class="reverse">Cancel</button>

View file

@ -38,7 +38,7 @@
"appwrite/php-clamav": "1.1.*",
"appwrite/php-runtimes": "0.6.*",
"utopia-php/framework": "0.19.5",
"utopia-php/framework": "0.19.*",
"utopia-php/logger": "0.1.*",
"utopia-php/abuse": "0.7.*",
"utopia-php/analytics": "0.2.*",
@ -73,7 +73,7 @@
}
],
"require-dev": {
"appwrite/sdk-generator": "0.17.0",
"appwrite/sdk-generator": "0.17.1",
"phpunit/phpunit": "9.5.10",
"swoole/ide-helper": "4.8.3",
"textalk/websocket": "1.5.5",

12
composer.lock generated
View file

@ -3077,16 +3077,16 @@
},
{
"name": "appwrite/sdk-generator",
"version": "0.17.0",
"version": "0.17.1",
"source": {
"type": "git",
"url": "https://github.com/appwrite/sdk-generator.git",
"reference": "a68e072170a81532cfb0ff914864d8f074a73a37"
"reference": "3542c6ed0f808b6a9f6735a8aad7ccda961bea29"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/appwrite/sdk-generator/zipball/a68e072170a81532cfb0ff914864d8f074a73a37",
"reference": "a68e072170a81532cfb0ff914864d8f074a73a37",
"url": "https://api.github.com/repos/appwrite/sdk-generator/zipball/3542c6ed0f808b6a9f6735a8aad7ccda961bea29",
"reference": "3542c6ed0f808b6a9f6735a8aad7ccda961bea29",
"shasum": ""
},
"require": {
@ -3120,9 +3120,9 @@
"description": "Appwrite PHP library for generating API SDKs for multiple programming languages and platforms",
"support": {
"issues": "https://github.com/appwrite/sdk-generator/issues",
"source": "https://github.com/appwrite/sdk-generator/tree/0.17.0"
"source": "https://github.com/appwrite/sdk-generator/tree/0.17.1"
},
"time": "2022-01-04T09:24:44+00:00"
"time": "2022-01-07T12:55:37+00:00"
},
{
"name": "composer/pcre",

View file

@ -1 +1,3 @@
Use this endpoint to allow a user to accept an invitation to join a team after being redirected back to your app from the invitation email received by the user.
Use this endpoint to allow a user to accept an invitation to join a team after being redirected back to your app from the invitation email received by the user.
If the request is successful, a session for the user is automatically created.

View file

@ -1,3 +1,6 @@
## 3.0.2
- String Attribute Type got fixed
## 3.0.1
- Export Query Builder

View file

@ -1,4 +1,4 @@
<svg host="65bd71144e" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="1108px" height="839px" viewBox="-0.5 -0.5 1108 839" content="&lt;mxfile host=&quot;612c770d-d23c-4897-ac0d-72478d1c5aef&quot; modified=&quot;2021-02-22T07:17:54.650Z&quot; agent=&quot;5.0 (Macintosh; Intel Mac OS X 11_2_1) AppleWebKit/537.36 (KHTML, like Gecko) Code/1.53.2 Chrome/87.0.4280.141 Electron/11.2.1 Safari/537.36&quot; etag=&quot;sAOb0L0gpVpMeEycjwCe&quot; version=&quot;14.2.4&quot; type=&quot;embed&quot;&gt;&lt;diagram id=&quot;WOshqXSVd2VkRfcggtcB&quot; name=&quot;Page-1&quot;&gt;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&lt;/diagram&gt;&lt;/mxfile&gt;">
<svg host="65bd71144e" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="1108px" height="839px" viewBox="-0.5 -0.5 1108 839" content="&lt;mxfile&gt;&lt;diagram id=&quot;WOshqXSVd2VkRfcggtcB&quot; name=&quot;Page-1&quot;&gt;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&lt;/diagram&gt;&lt;/mxfile&gt;">
<defs/>
<g>
<path d="M 77 40 L 77 80 L 397 80 L 397 113.63" fill="none" stroke="#23445d" stroke-miterlimit="10" pointer-events="stroke"/>
@ -201,13 +201,13 @@
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 520px; margin-left: 608px;">
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
Pub/Sub (Redis)
Queue (Redis)
</div>
</div>
</div>
</foreignObject>
<text x="667" y="524" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">
Pub/Sub (Redis)
Queue (Redis)
</text>
</switch>
</g>
@ -239,13 +239,13 @@
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 590px; margin-left: 468px;">
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
Database (MariaDB)
Database
</div>
</div>
</div>
</foreignObject>
<text x="527" y="594" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">
Database (MariaDB)
Database
</text>
</switch>
</g>
@ -404,22 +404,20 @@
</g>
<path d="M 437 720 L 437 820 L 297 820 L 297 590 L 460.63 590" fill="none" stroke="#d6b656" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 465.88 590 L 458.88 593.5 L 460.63 590 L 458.88 586.5 Z" fill="#d6b656" stroke="#d6b656" stroke-miterlimit="10" pointer-events="all"/>
<path d="M 437 680 L 437 640 L 667 640 L 667 546.37" fill="none" stroke="#0e8088" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 667 541.12 L 670.5 548.12 L 667 546.37 L 663.5 548.12 Z" fill="#0e8088" stroke="#0e8088" stroke-miterlimit="10" pointer-events="all"/>
<rect x="397" y="680" width="80" height="40" fill="#b0e3e6" stroke="#0e8088" pointer-events="all"/>
<rect x="397" y="680" width="80" height="40" fill="#b1ddf0" stroke="#10739e" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 700px; margin-left: 398px;">
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
Deletes
Maintenance
</div>
</div>
</div>
</foreignObject>
<text x="437" y="704" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">
Deletes
Maintenance
</text>
</switch>
</g>
@ -450,9 +448,7 @@
<path d="M 347 541.12 L 350.5 548.12 L 347 546.37 L 343.5 548.12 Z" fill="#9673a6" stroke="#9673a6" stroke-miterlimit="10" pointer-events="all"/>
<path d="M 347 720 L 347 740 L 207 740 L 207 546.37" fill="none" stroke="#9673a6" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 207 541.12 L 210.5 548.12 L 207 546.37 L 203.5 548.12 Z" fill="#9673a6" stroke="#9673a6" stroke-miterlimit="10" pointer-events="all"/>
<path d="M 347 680 L 347 640 L 667 640 L 667 546.37" fill="none" stroke="#0e8088" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 667 541.12 L 670.5 548.12 L 667 546.37 L 663.5 548.12 Z" fill="#0e8088" stroke="#0e8088" stroke-miterlimit="10" pointer-events="all"/>
<rect x="307" y="680" width="80" height="40" fill="#b0e3e6" stroke="#0e8088" pointer-events="all"/>
<rect x="307" y="680" width="80" height="40" fill="#b1ddf0" stroke="#10739e" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
@ -530,8 +526,6 @@
</g>
<path d="M 707 720 L 707 820 L 297 820 L 297 590 L 460.63 590" fill="none" stroke="#d6b656" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 465.88 590 L 458.88 593.5 L 460.63 590 L 458.88 586.5 Z" fill="#d6b656" stroke="#d6b656" stroke-miterlimit="10" pointer-events="all"/>
<path d="M 707 680 L 707 640 L 667 640 L 667 546.37" fill="none" stroke="#d4d4d4" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 667 541.12 L 670.5 548.12 L 667 546.37 L 663.5 548.12 Z" fill="#d4d4d4" stroke="#d4d4d4" stroke-miterlimit="10" pointer-events="all"/>
<path d="M 707 680 L 707 640 L 667 640 L 667 546.37" fill="none" stroke="#0e8088" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 667 541.12 L 670.5 548.12 L 667 546.37 L 663.5 548.12 Z" fill="#0e8088" stroke="#0e8088" stroke-miterlimit="10" pointer-events="all"/>
<rect x="667" y="680" width="80" height="40" fill="#b0e3e6" stroke="#0e8088" pointer-events="all"/>
@ -541,13 +535,13 @@
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 700px; margin-left: 668px;">
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
Tasks
Database
</div>
</div>
</div>
</foreignObject>
<text x="707" y="704" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">
Tasks
Database
</text>
</switch>
</g>
@ -678,13 +672,13 @@
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 700px; margin-left: 1028px;">
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
Scheduler
Deletes
</div>
</div>
</div>
</foreignObject>
<text x="1067" y="704" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">
Scheduler
Deletes
</text>
</switch>
</g>
@ -714,13 +708,13 @@
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 520px; margin-left: 748px;">
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
Antivirus (ClamAV)
AntiVirus (ClamAV)
</div>
</div>
</div>
</foreignObject>
<text x="807" y="524" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">
Antivirus (ClamAV)
AntiVirus (ClamAV)
</text>
</switch>
</g>
@ -743,6 +737,23 @@
</text>
</switch>
</g>
<rect x="217" y="680" width="80" height="40" fill="#b1ddf0" stroke="#10739e" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 700px; margin-left: 218px;">
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
Scheduler
</div>
</div>
</div>
</foreignObject>
<text x="257" y="704" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">
Scheduler
</text>
</switch>
</g>
</g>
<switch>
<g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/>

Before

Width:  |  Height:  |  Size: 64 KiB

After

Width:  |  Height:  |  Size: 64 KiB

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -668,7 +668,8 @@ let units=["kB","MB","GB","TB","PB","EB","ZB","YB"];let u=-1;do{$value/=thresh;+
let thresh=1000;if(Math.abs($value)<thresh){return'B';}
let units=["kB","MB","GB","TB","PB","EB","ZB","YB"];let u=-1;do{$value/=thresh;++u;}while(Math.abs($value)>=thresh&&u<units.length-1);return units[u];}).add("statsTotal",function($value){if(!$value){return 0;}
$value=abbreviate($value,0,false,false);return $value??"N/A";}).add("statsGetLast",function($value){if(!$value||$value.length<1){return 0;}
return $value[$value.length-1].value;}).add("isEmpty",function($value){return(!!$value);}).add("isEmptyObject",function($value){return((Object.keys($value).length===0&&$value.constructor===Object)||$value.length===0)}).add("activeDomainsCount",function($value){let result=[];if(Array.isArray($value)){result=$value.filter(function(node){return(node.verification&&node.certificateId);});}
return $value[$value.length-1].value;}).add("statsGetSum",function($value){if(!$value||$value.length<1){return 0;}
return $value.reduce(function(value,object){return value+object.value},0);}).add("isEmpty",function($value){return(!!$value);}).add("isEmptyObject",function($value){return((Object.keys($value).length===0&&$value.constructor===Object)||$value.length===0)}).add("activeDomainsCount",function($value){let result=[];if(Array.isArray($value)){result=$value.filter(function(node){return(node.verification&&node.certificateId);});}
return result.length;}).add("documentAction",function(container){let collection=container.get('project-collection');let document=container.get('project-document');if(collection&&document&&!document.$id){return'database.createDocument';}
return'database.updateDocument';}).add("documentSuccess",function(container){let document=container.get('project-document');if(document&&!document.$id){return',redirect';}
return'';}).add("firstElement",function($value){if($value&&$value[0]){return $value[0];}
@ -811,7 +812,7 @@ position=direction;let current=Math.ceil(direction/window.innerHeight);element.s
else{element.classList.remove('scroll-end')}};window.addEventListener('scroll',check,false);window.addEventListener('resize',check,false);check();}});})(window);(function(window){window.ls.container.get("view").add({selector:"data-setup",controller:function(element,console,form,alerts,router){element.addEventListener("submit",function(event){event.preventDefault();let loaderId=alerts.add({text:'Creating new project...',class:""},0);let formData=form.toJson(element);formData["name"]=formData["name"]||(element.dataset["defaultName"]||"");console.teams.create('unique()',formData["name"]||"").then(function(data){let team=data["$id"];formData=JSON.parse(JSON.stringify(formData).replace(new RegExp("{{teamId}}","g"),team));console.projects.create(formData["projectId"],formData["name"],team).then(function(project){alerts.remove(loaderId);window.location.href="/console/home?project="+project["$id"];},function(){throw new Error("Failed to setup project");});},function(){throw new Error("Setup failed creating project team");});});}});})(window);(function(window){window.ls.container.get("view").add({selector:"data-switch",controller:function(element,router,document){let check=function(c){if(!element.value){return;}
if(element.value===router.params.project){return;}
return router.change("/console/home?project="+element.value);};element.addEventListener("change",function(){check();});}});})(window);(function(window){window.ls.container.get("view").add({selector:"data-general-theme",controller:function(element,router,document){let toggle=function(c){if(document.body.classList.contains('theme-light')){document.body.classList.remove('theme-light');document.body.classList.add('theme-dark');window.localStorage.setItem('user-theme','theme-dark')}
else{document.body.classList.remove('theme-dark');document.body.classList.add('theme-light');window.localStorage.setItem('user-theme','theme-light')}};element.addEventListener("click",function(){toggle();});}});})(window);(function(window){window.ls.container.get("view").add({selector:"data-version",controller:function(alerts,env,cookie){let cookieName="version-update-"+env.VERSION.replace(/\./g,"_");if(!cookie.get(cookieName)){var xhr=new XMLHttpRequest();xhr.open('GET','/console/version',true);xhr.onload=function(){if(this.readyState==4&&this.status==200){let data=JSON.parse(this.responseText);let text='Appwrite version '+data.version+' is available, check the';if(isNewerVersion(env.VERSION,data.version)){alerts.add({text:text,class:"success",link:"https://github.com/appwrite/appwrite/releases",label:'release notes',callback:function(){cookie.set(cookieName,"true",365*10);}},0);}}};xhr.send(null);function isNewerVersion(oldVer,newVer){const oldParts=oldVer.split('.')
else{document.body.classList.remove('theme-dark');document.body.classList.add('theme-light');window.localStorage.setItem('user-theme','theme-light')}};element.addEventListener("click",function(){toggle();});}});})(window);(function(window){window.ls.container.get("view").add({selector:"data-version",controller:function(alerts,env,cookie){let cookieName="version-update-"+env.VERSION.replace(/\./g,"_");if(!cookie.get(cookieName)){var xhr=new XMLHttpRequest();xhr.open('GET','https://appwrite.io/version',true);xhr.onload=function(){if(this.readyState==4&&this.status==200){let data=JSON.parse(this.responseText);let text='Appwrite version '+data.version+' is available, check the';if(isNewerVersion(env.VERSION,data.version)){alerts.add({text:text,class:"success",link:"https://github.com/appwrite/appwrite/releases",label:'release notes',callback:function(){cookie.set(cookieName,"true",365*10);}},0);}}};xhr.send(null);function isNewerVersion(oldVer,newVer){const oldParts=oldVer.split('.')
const newParts=newVer.split('.')
for(var i=0;i<newParts.length;i++){const a=parseInt(newParts[i])||0
const b=parseInt(oldParts[i])||0

View file

@ -183,12 +183,12 @@ window.ls.filter
return $value[$value.length - 1].value;
})
.add("statsGetLast", function ($value) {
.add("statsGetSum", function ($value) {
if (!$value || $value.length < 1) {
return 0;
}
return $value[$value.length - 1].value;
return $value.reduce(function(value, object) { return value + object.value }, 0);
})
.add("isEmpty", function ($value) {
return (!!$value);

View file

@ -7,7 +7,7 @@
if (!cookie.get(cookieName)) {
var xhr = new XMLHttpRequest();
xhr.open('GET', '/console/version', true);
xhr.open('GET', 'https://appwrite.io/version', true);
xhr.onload = function () {
if (this.readyState == 4 && this.status == 200) {

View file

@ -67,6 +67,7 @@ abstract class Migration
'0.11.0' => 'V10',
'0.12.0' => 'V10',
'0.12.0' => 'V11',
'0.12.1' => 'V11',
'0.13.0' => 'V11',
];

View file

@ -141,7 +141,13 @@ class V12 extends Filter
if(isset($usedOperator)) {
[ $attributeKey, $filterValue ] = \explode($usedOperator, $filter);
$filterValue = \is_numeric($filterValue) ? $filterValue : '"' . $filterValue . '"';
if($filterValue === 'true' || $filterValue === 'false') {
// Let's keep it at true and false string, but without "" around
// No action needed
} else {
$filterValue = \is_numeric($filterValue) ? $filterValue : '"' . $filterValue . '"';
}
$query = $attributeKey . '.' . $operators[$usedOperator] . '(' . $filterValue . ')';
\array_push($queries, $query);
}
@ -152,7 +158,6 @@ class V12 extends Filter
unset($content['search']);
unset($content['filters']);
unset($content['search']);
$content['queries'] = $queries;
return $content;

View file

@ -13,7 +13,7 @@ class AttributeString extends Attribute
$this
->addRule('size', [
'type' => self::TYPE_STRING,
'type' => self::TYPE_INTEGER,
'description' => 'Attribute size.',
'default' => 0,
'example' => 128,
@ -52,4 +52,4 @@ class AttributeString extends Attribute
{
return Response::MODEL_ATTRIBUTE_STRING;
}
}
}