diff --git a/app/config/collections.php b/app/config/collections.php index 47e25c20e..633e2c33b 100644 --- a/app/config/collections.php +++ b/app/config/collections.php @@ -3137,14 +3137,14 @@ $collections = [ ], [ '$id' => 'accessedAt', - 'type' => Database::VAR_INTEGER, + 'type' => Database::VAR_DATETIME, 'format' => '', 'size' => 0, 'signed' => false, - 'required' => true, + 'required' => false, 'default' => null, 'array' => false, - 'filters' => [], + 'filters' => ['datetime'], ], [ '$id' => 'signature', diff --git a/app/controllers/shared/api.php b/app/controllers/shared/api.php index a9b11887d..93bc020d9 100644 --- a/app/controllers/shared/api.php +++ b/app/controllers/shared/api.php @@ -17,6 +17,7 @@ use Utopia\Abuse\Adapters\TimeLimit; use Utopia\Cache\Adapter\Filesystem; use Utopia\Cache\Cache; use Utopia\Database\Database; +use Utopia\Database\DateTime; use Utopia\Database\Document; use Utopia\Database\Validator\Authorization; @@ -104,7 +105,7 @@ App::init() $abuse = new Abuse($timeLimit); $remaining = $timeLimit->remaining(); $limit = $timeLimit->limit(); - $time = (new DateTime($timeLimit->time()))->getTimestamp() + $route->getLabel('abuse-time', 3600); + $time = (new \DateTime($timeLimit->time()))->getTimestamp() + $route->getLabel('abuse-time', 3600); if ($limit && ($remaining < $closestLimit || is_null($closestLimit))) { $closestLimit = $remaining; @@ -362,6 +363,7 @@ App::shutdown() if ($useCache) { $resource = null; $data = $response->getPayload(); + if (!empty($data['payload'])) { $pattern = $route->getLabel('cache.resource', null); if (!empty($pattern)) { @@ -369,7 +371,6 @@ App::shutdown() } $key = md5($request->getURI() . implode('*', $request->getParams())); - $data = json_encode([ 'content-type' => $response->getContentType(), 'payload' => base64_encode($data['payload']), @@ -377,15 +378,17 @@ App::shutdown() $signature = md5($data); $cacheLog = $dbForProject->getDocument('cache', $key); + $accessedAt = $cacheLog->getAttribute('accessedAt', ''); + $now = DateTime::now(); if ($cacheLog->isEmpty()) { Authorization::skip(fn () => $dbForProject->createDocument('cache', new Document([ '$id' => $key, 'resource' => $resource, - 'accessedAt' => \time(), + 'accessedAt' => $now, 'signature' => $signature, ]))); - } elseif (date('Y/m/d', \time()) > date('Y/m/d', $cacheLog->getAttribute('accessedAt'))) { - $cacheLog->setAttribute('accessedAt', \time()); + } elseif (DateTime::formatTz(DateTime::addSeconds(new \DateTime(), -APP_CACHE_UPDATE)) > $accessedAt) { + $cacheLog->setAttribute('accessedAt', $now); Authorization::skip(fn () => $dbForProject->updateDocument('cache', $cacheLog->getId(), $cacheLog)); } diff --git a/app/init.php b/app/init.php index fb99b08c9..9faa0eec2 100644 --- a/app/init.php +++ b/app/init.php @@ -93,6 +93,7 @@ const APP_LIMIT_SUBQUERY = 1000; const APP_LIMIT_WRITE_RATE_DEFAULT = 60; // Default maximum write rate per rate period const APP_LIMIT_WRITE_RATE_PERIOD_DEFAULT = 60; // Default maximum write rate period in seconds const APP_KEY_ACCCESS = 24 * 60 * 60; // 24 hours +const APP_CACHE_UPDATE = 24 * 60 * 60; // 24 hours const APP_CACHE_BUSTER = 402; const APP_VERSION_STABLE = '0.15.3'; const APP_DATABASE_ATTRIBUTE_EMAIL = 'email'; diff --git a/app/workers/deletes.php b/app/workers/deletes.php index da52c1d2f..2ec819940 100644 --- a/app/workers/deletes.php +++ b/app/workers/deletes.php @@ -112,7 +112,7 @@ class DeletesV1 extends Worker $this->deleteCacheByResource($project->getId()); break; case DELETE_TYPE_CACHE_BY_TIMESTAMP: - $this->deleteCacheByTimestamp(); + $this->deleteCacheByDate(); break; default: Console::error('No delete operation for type: ' . $type); @@ -134,10 +134,10 @@ class DeletesV1 extends Worker ]); } - protected function deleteCacheByTimestamp(): void + protected function deleteCacheByDate(): void { $this->deleteCacheFiles([ - Query::lessThan('accessedAt', $this->args['timestamp']), + Query::lessThan('accessedAt', $this->args['datetime']), ]); } @@ -225,7 +225,7 @@ class DeletesV1 extends Worker ], $dbForProject); $this->deleteByGroup('stats', [ - Query::lessThan('time', [$datetime30m]), + Query::lessThan('time', $datetime30m), Query::equal('period', ['30m']), ], $dbForProject); }); diff --git a/package-lock.json b/package-lock.json index e24a9f8a1..58949bf12 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1250,12 +1250,12 @@ } }, "node_modules/ext": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.6.0.tgz", - "integrity": "sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", "dev": true, "dependencies": { - "type": "^2.5.0" + "type": "^2.7.2" } }, "node_modules/ext/node_modules/type": { @@ -3353,9 +3353,9 @@ } }, "node_modules/object.assign": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.3.tgz", - "integrity": "sha512-ZFJnX3zltyjcYJL0RoCJuzb+11zWGyaDbjgxZbdV7rFEcHQuYxrZqhow67aA7xpes6LhojyFDaBKAFfogQrikA==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", @@ -3696,9 +3696,9 @@ } }, "node_modules/prismjs": { - "version": "1.28.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.28.0.tgz", - "integrity": "sha512-8aaXdYvl1F7iC7Xm1spqSaY/OJBpYW3v+KJ+F17iYxvdc8sfjW194COK5wVhMZX45tGteiBQgdvD/nhxcRwylw==", + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", + "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", "engines": { "node": ">=6" } @@ -4375,9 +4375,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", - "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==", + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz", + "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==", "dev": true }, "node_modules/split-string": { @@ -6314,12 +6314,12 @@ } }, "ext": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.6.0.tgz", - "integrity": "sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", "dev": true, "requires": { - "type": "^2.5.0" + "type": "^2.7.2" }, "dependencies": { "type": { @@ -8052,9 +8052,9 @@ } }, "object.assign": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.3.tgz", - "integrity": "sha512-ZFJnX3zltyjcYJL0RoCJuzb+11zWGyaDbjgxZbdV7rFEcHQuYxrZqhow67aA7xpes6LhojyFDaBKAFfogQrikA==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", "dev": true, "requires": { "call-bind": "^1.0.2", @@ -8318,9 +8318,9 @@ "dev": true }, "prismjs": { - "version": "1.28.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.28.0.tgz", - "integrity": "sha512-8aaXdYvl1F7iC7Xm1spqSaY/OJBpYW3v+KJ+F17iYxvdc8sfjW194COK5wVhMZX45tGteiBQgdvD/nhxcRwylw==" + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", + "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==" }, "process-nextick-args": { "version": "2.0.1", @@ -8885,9 +8885,9 @@ } }, "spdx-license-ids": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", - "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==", + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz", + "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==", "dev": true }, "split-string": { diff --git a/src/Appwrite/Event/Delete.php b/src/Appwrite/Event/Delete.php index d039ff1fe..72ace2a86 100644 --- a/src/Appwrite/Event/Delete.php +++ b/src/Appwrite/Event/Delete.php @@ -11,8 +11,9 @@ class Delete extends Event protected ?Document $document = null; protected ?string $resource = null; protected ?string $datetime = null; - protected ?string $datetime1d = null; - protected ?string $datetime30m = null; + protected ?string $dateTime30m = null; + protected ?string $dateTime1d = null; + public function __construct() { @@ -60,9 +61,9 @@ class Delete extends Event * @param string $datetime * @return self */ - public function setDatetime1d(string $datetime): self + public function setDateTime1d(string $datetime): self { - $this->datetime1d = $datetime; + $this->dateTime1d = $datetime; return $this; } @@ -72,9 +73,9 @@ class Delete extends Event * @param string $datetime * @return self */ - public function setDatetime30m(string $datetime): self + public function setDateTime30m(string $datetime): self { - $this->datetime30m = $datetime; + $this->dateTime30m = $datetime; return $this; } @@ -139,8 +140,8 @@ class Delete extends Event 'document' => $this->document, 'resource' => $this->resource, 'datetime' => $this->datetime, - 'datetime1d' => $this->datetime1d, - 'datetime30m' => $this->datetime30m, + 'dateTime1d' => $this->dateTime1d, + 'dateTime30m' => $this->dateTime30m, ]); } }