From 2bb4d8fb8973246a5cf7b34beb4e7e9332de8d7b Mon Sep 17 00:00:00 2001 From: shimon Date: Mon, 2 Oct 2023 17:02:48 +0300 Subject: [PATCH] sync with 1.4 --- app/controllers/api/account.php | 82 ++++----- app/controllers/api/avatars.php | 43 ++--- app/controllers/api/console.php | 2 +- app/controllers/api/databases.php | 93 +++++------ app/controllers/api/functions.php | 72 ++++---- app/controllers/api/graphql.php | 6 +- app/controllers/api/locale.php | 14 +- app/controllers/api/project.php | 24 +-- app/controllers/api/storage.php | 158 +++++++++--------- app/controllers/api/teams.php | 29 ++-- app/controllers/api/vcs.php | 2 + app/controllers/general.php | 32 +++- app/controllers/web/console.php | 1 - docker-compose.yml | 1 + src/Appwrite/Platform/Workers/Builds.php | 64 ++++--- src/Appwrite/Platform/Workers/Deletes.php | 65 +------ .../Utopia/Response/Model/UsageBuckets.php | 30 +--- .../Utopia/Response/Model/UsageCollection.php | 30 +--- .../Utopia/Response/Model/UsageDatabase.php | 62 +------ .../Utopia/Response/Model/UsageDatabases.php | 102 +---------- .../Utopia/Response/Model/UsageFunction.php | 50 +++--- .../Utopia/Response/Model/UsageFunctions.php | 47 +++--- .../Utopia/Response/Model/UsageProject.php | 14 +- .../Utopia/Response/Model/UsageStorage.php | 66 +------- .../Utopia/Response/Model/UsageUsers.php | 47 +----- 25 files changed, 393 insertions(+), 743 deletions(-) diff --git a/app/controllers/api/account.php b/app/controllers/api/account.php index 7c7230bbf6..1830886be8 100644 --- a/app/controllers/api/account.php +++ b/app/controllers/api/account.php @@ -283,7 +283,7 @@ App::post('/v1/account/sessions/email') }); App::get('/v1/account/sessions/oauth2/:provider') - ->desc('Create OAuth2 Session') + ->desc('Create OAuth2 session') ->groups(['api', 'account']) ->label('error', __DIR__ . '/../../views/general/error.phtml') ->label('scope', 'public') @@ -349,17 +349,17 @@ App::get('/v1/account/sessions/oauth2/:provider') }); App::get('/v1/account/sessions/oauth2/callback/:provider/:projectId') - ->desc('OAuth2 Callback') - ->groups(['api', 'account']) + ->desc('OAuth2 callback') + ->groups(['account']) ->label('error', __DIR__ . '/../../views/general/error.phtml') ->label('scope', 'public') ->label('docs', false) ->param('projectId', '', new Text(1024), 'Project ID.') ->param('provider', '', new WhiteList(\array_keys(Config::getParam('providers')), true), 'OAuth2 provider.') - ->param('code', '', new Text(2048), 'OAuth2 code. This is a temporary code that the will be later exchanged for an access token.', true) + ->param('code', '', new Text(2048, 0), 'OAuth2 code. This is a temporary code that the will be later exchanged for an access token.', true) ->param('state', '', new Text(2048), 'Login state params.', true) - ->param('error', '', new Text(2048), 'Error code returned from the OAuth2 provider.', true) - ->param('error_description', '', new Text(2048), 'Human-readable text providing additional information about the error returned from the OAuth2 provider.', true) + ->param('error', '', new Text(2048, 0), 'Error code returned from the OAuth2 provider.', true) + ->param('error_description', '', new Text(2048, 0), 'Human-readable text providing additional information about the error returned from the OAuth2 provider.', true) ->inject('request') ->inject('response') ->action(function (string $projectId, string $provider, string $code, string $state, string $error, string $error_description, Request $request, Response $response) { @@ -381,18 +381,18 @@ App::get('/v1/account/sessions/oauth2/callback/:provider/:projectId') }); App::post('/v1/account/sessions/oauth2/callback/:provider/:projectId') - ->desc('OAuth2 Callback') - ->groups(['api', 'account']) + ->desc('OAuth2 callback') + ->groups(['account']) ->label('error', __DIR__ . '/../../views/general/error.phtml') ->label('scope', 'public') ->label('origin', '*') ->label('docs', false) ->param('projectId', '', new Text(1024), 'Project ID.') ->param('provider', '', new WhiteList(\array_keys(Config::getParam('providers')), true), 'OAuth2 provider.') - ->param('code', '', new Text(2048), 'OAuth2 code. This is a temporary code that the will be later exchanged for an access token.', true) + ->param('code', '', new Text(2048, 0), 'OAuth2 code. This is a temporary code that the will be later exchanged for an access token.', true) ->param('state', '', new Text(2048), 'Login state params.', true) - ->param('error', '', new Text(2048,), 'Error code returned from the OAuth2 provider.', true) - ->param('error_description', '', new Text(2048), 'Human-readable text providing additional information about the error returned from the OAuth2 provider.', true) + ->param('error', '', new Text(2048, 0), 'Error code returned from the OAuth2 provider.', true) + ->param('error_description', '', new Text(2048, 0), 'Human-readable text providing additional information about the error returned from the OAuth2 provider.', true) ->inject('request') ->inject('response') ->action(function (string $projectId, string $provider, string $code, string $state, string $error, string $error_description, Request $request, Response $response) { @@ -414,7 +414,7 @@ App::post('/v1/account/sessions/oauth2/callback/:provider/:projectId') }); App::get('/v1/account/sessions/oauth2/:provider/redirect') - ->desc('OAuth2 Redirect') + ->desc('OAuth2 redirect') ->groups(['api', 'account', 'session']) ->label('error', __DIR__ . '/../../views/general/error.phtml') ->label('event', 'users.[userId].sessions.[sessionId].create') @@ -426,10 +426,10 @@ App::get('/v1/account/sessions/oauth2/:provider/redirect') ->label('abuse-key', 'ip:{ip}') ->label('docs', false) ->param('provider', '', new WhiteList(\array_keys(Config::getParam('providers')), true), 'OAuth2 provider.') - ->param('code', '', new Text(2048), 'OAuth2 code. This is a temporary code that the will be later exchanged for an access token.', true) + ->param('code', '', new Text(2048, 0), 'OAuth2 code. This is a temporary code that the will be later exchanged for an access token.', true) ->param('state', '', new Text(2048), 'OAuth2 state params.', true) - ->param('error', '', new Text(2048), 'Error code returned from the OAuth2 provider.', true) - ->param('error_description', '', new Text(2048), 'Human-readable text providing additional information about the error returned from the OAuth2 provider.', true) + ->param('error', '', new Text(2048, 0), 'Error code returned from the OAuth2 provider.', true) + ->param('error_description', '', new Text(2048, 0), 'Human-readable text providing additional information about the error returned from the OAuth2 provider.', true) ->inject('request') ->inject('response') ->inject('project') @@ -866,7 +866,7 @@ App::delete('/v1/account/identities/:identityId') }); App::post('/v1/account/sessions/magic-url') - ->desc('Create Magic URL session') + ->desc('Create magic URL session') ->groups(['api', 'account']) ->label('scope', 'public') ->label('auth.type', 'magic-url') @@ -1084,7 +1084,7 @@ App::post('/v1/account/sessions/magic-url') }); App::put('/v1/account/sessions/magic-url') - ->desc('Create Magic URL session (confirmation)') + ->desc('Create magic URL session (confirmation)') ->groups(['api', 'account', 'session']) ->label('scope', 'public') ->label('event', 'users.[userId].sessions.[sessionId].create') @@ -1204,7 +1204,7 @@ App::put('/v1/account/sessions/magic-url') }); App::post('/v1/account/sessions/phone') - ->desc('Create Phone session') + ->desc('Create phone session') ->groups(['api', 'account']) ->label('scope', 'public') ->label('auth.type', 'phone') @@ -1340,7 +1340,7 @@ App::post('/v1/account/sessions/phone') }); App::put('/v1/account/sessions/phone') - ->desc('Create Phone Session (confirmation)') + ->desc('Create phone session (confirmation)') ->groups(['api', 'account', 'session']) ->label('scope', 'public') ->label('event', 'users.[userId].sessions.[sessionId].create') @@ -1456,7 +1456,7 @@ App::put('/v1/account/sessions/phone') }); App::post('/v1/account/sessions/anonymous') - ->desc('Create Anonymous Session') + ->desc('Create anonymous session') ->groups(['api', 'account', 'auth', 'session']) ->label('event', 'users.[userId].sessions.[sessionId].create') ->label('scope', 'public') @@ -1638,7 +1638,7 @@ App::post('/v1/account/jwt') }); App::get('/v1/account') - ->desc('Get Account') + ->desc('Get account') ->groups(['api', 'account']) ->label('scope', 'account') ->label('usage.metric', 'users.{scope}.requests.read') @@ -1659,7 +1659,7 @@ App::get('/v1/account') }); App::get('/v1/account/prefs') - ->desc('Get Account Preferences') + ->desc('Get account preferences') ->groups(['api', 'account']) ->label('scope', 'account') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_JWT]) @@ -1681,7 +1681,7 @@ App::get('/v1/account/prefs') }); App::get('/v1/account/sessions') - ->desc('List Sessions') + ->desc('List sessions') ->groups(['api', 'account']) ->label('scope', 'account') ->label('usage.metric', 'users.{scope}.requests.read') @@ -1720,7 +1720,7 @@ App::get('/v1/account/sessions') }); App::get('/v1/account/logs') - ->desc('List Logs') + ->desc('List logs') ->groups(['api', 'account']) ->label('scope', 'account') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_JWT]) @@ -1780,7 +1780,7 @@ App::get('/v1/account/logs') }); App::get('/v1/account/sessions/:sessionId') - ->desc('Get Session') + ->desc('Get session') ->groups(['api', 'account']) ->label('scope', 'account') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_JWT]) @@ -1824,7 +1824,7 @@ App::get('/v1/account/sessions/:sessionId') }); App::patch('/v1/account/name') - ->desc('Update Name') + ->desc('Update name') ->groups(['api', 'account']) ->label('event', 'users.[userId].update.name') ->label('scope', 'account') @@ -1857,7 +1857,7 @@ App::patch('/v1/account/name') }); App::patch('/v1/account/password') - ->desc('Update Password') + ->desc('Update password') ->groups(['api', 'account']) ->label('event', 'users.[userId].update.password') ->label('scope', 'account') @@ -1881,7 +1881,7 @@ App::patch('/v1/account/password') ->inject('project') ->inject('dbForProject') ->inject('queueForEvents') - ->action(function (string $password, string $oldPassword, Response $response, Document $user, Database $dbForProject, Event $queueForEvents) { + ->action(function (string $password, string $oldPassword, Response $response, Document $user, Document $project, Database $dbForProject, Event $queueForEvents) { // Check old password only if its an existing user. if (!empty($user->getAttribute('passwordUpdate')) && !Auth::passwordVerify($oldPassword, $user->getAttribute('password'), $user->getAttribute('hash'), $user->getAttribute('hashOptions'))) { // Double check user password @@ -1923,7 +1923,7 @@ App::patch('/v1/account/password') }); App::patch('/v1/account/email') - ->desc('Update Email') + ->desc('Update email') ->groups(['api', 'account']) ->label('event', 'users.[userId].update.email') ->label('scope', 'account') @@ -1992,7 +1992,7 @@ App::patch('/v1/account/email') }); App::patch('/v1/account/phone') - ->desc('Update Phone') + ->desc('Update phone') ->groups(['api', 'account']) ->label('event', 'users.[userId].update.phone') ->label('scope', 'account') @@ -2050,7 +2050,7 @@ App::patch('/v1/account/phone') }); App::patch('/v1/account/prefs') - ->desc('Update Preferences') + ->desc('Update preferences') ->groups(['api', 'account']) ->label('event', 'users.[userId].update.prefs') ->label('scope', 'account') @@ -2083,7 +2083,7 @@ App::patch('/v1/account/prefs') }); App::patch('/v1/account/status') - ->desc('Update Status') + ->desc('Update status') ->groups(['api', 'account']) ->label('event', 'users.[userId].update.status') ->label('scope', 'account') @@ -2126,7 +2126,7 @@ App::patch('/v1/account/status') }); App::delete('/v1/account/sessions/:sessionId') - ->desc('Delete Session') + ->desc('Delete session') ->groups(['api', 'account']) ->label('scope', 'account') ->label('event', 'users.[userId].sessions.[sessionId].delete') @@ -2201,7 +2201,7 @@ App::delete('/v1/account/sessions/:sessionId') }); App::patch('/v1/account/sessions/:sessionId') - ->desc('Update OAuth Session (Refresh Tokens)') + ->desc('Update OAuth session (refresh tokens)') ->groups(['api', 'account']) ->label('scope', 'account') ->label('event', 'users.[userId].sessions.[sessionId].update') @@ -2286,7 +2286,7 @@ App::patch('/v1/account/sessions/:sessionId') }); App::delete('/v1/account/sessions') - ->desc('Delete Sessions') + ->desc('Delete sessions') ->groups(['api', 'account']) ->label('scope', 'account') ->label('event', 'users.[userId].sessions.[sessionId].delete') @@ -2346,7 +2346,7 @@ App::delete('/v1/account/sessions') }); App::post('/v1/account/recovery') - ->desc('Create Password Recovery') + ->desc('Create password recovery') ->groups(['api', 'account']) ->label('scope', 'public') ->label('event', 'users.[userId].recovery.[tokenId].create') @@ -2528,7 +2528,7 @@ App::post('/v1/account/recovery') }); App::put('/v1/account/recovery') - ->desc('Create Password Recovery (confirmation)') + ->desc('Create password recovery (confirmation)') ->groups(['api', 'account']) ->label('scope', 'public') ->label('event', 'users.[userId].recovery.[tokenId].update') @@ -2615,7 +2615,7 @@ App::put('/v1/account/recovery') }); App::post('/v1/account/verification') - ->desc('Create Email Verification') + ->desc('Create email verification') ->groups(['api', 'account']) ->label('scope', 'account') ->label('event', 'users.[userId].verification.[tokenId].create') @@ -2775,7 +2775,7 @@ App::post('/v1/account/verification') }); App::put('/v1/account/verification') - ->desc('Create Email Verification (confirmation)') + ->desc('Create email verification (confirmation)') ->groups(['api', 'account']) ->label('scope', 'public') ->label('event', 'users.[userId].verification.[tokenId].update') @@ -2835,7 +2835,7 @@ App::put('/v1/account/verification') }); App::post('/v1/account/verification/phone') - ->desc('Create Phone Verification') + ->desc('Create phone verification') ->groups(['api', 'account']) ->label('scope', 'account') ->label('event', 'users.[userId].verification.[tokenId].create') @@ -2930,7 +2930,7 @@ App::post('/v1/account/verification/phone') }); App::put('/v1/account/verification/phone') - ->desc('Create Phone Verification (confirmation)') + ->desc('Create phone verification (confirmation)') ->groups(['api', 'account']) ->label('scope', 'public') ->label('event', 'users.[userId].verification.[tokenId].update') diff --git a/app/controllers/api/avatars.php b/app/controllers/api/avatars.php index 3b93348643..e0d967eb00 100644 --- a/app/controllers/api/avatars.php +++ b/app/controllers/api/avatars.php @@ -191,7 +191,7 @@ $getUserGitHub = function (string $userId, Document $project, Database $dbForPro }; App::get('/v1/avatars/credit-cards/:code') - ->desc('Get Credit Card Icon') + ->desc('Get credit card icon') ->groups(['api', 'avatars']) ->label('scope', 'avatars.read') ->label('cache', true) @@ -211,7 +211,7 @@ App::get('/v1/avatars/credit-cards/:code') ->action(fn (string $code, int $width, int $height, int $quality, Response $response) => $avatarCallback('credit-cards', $code, $width, $height, $quality, $response)); App::get('/v1/avatars/browsers/:code') - ->desc('Get Browser Icon') + ->desc('Get browser icon') ->groups(['api', 'avatars']) ->label('scope', 'avatars.read') ->label('cache', true) @@ -231,7 +231,7 @@ App::get('/v1/avatars/browsers/:code') ->action(fn (string $code, int $width, int $height, int $quality, Response $response) => $avatarCallback('browsers', $code, $width, $height, $quality, $response)); App::get('/v1/avatars/flags/:code') - ->desc('Get Country Flag') + ->desc('Get country flag') ->groups(['api', 'avatars']) ->label('scope', 'avatars.read') ->label('cache', true) @@ -251,7 +251,7 @@ App::get('/v1/avatars/flags/:code') ->action(fn (string $code, int $width, int $height, int $quality, Response $response) => $avatarCallback('flags', $code, $width, $height, $quality, $response)); App::get('/v1/avatars/image') - ->desc('Get Image from URL') + ->desc('Get image from URL') ->groups(['api', 'avatars']) ->label('scope', 'avatars.read') ->label('cache', true) @@ -307,7 +307,7 @@ App::get('/v1/avatars/image') }); App::get('/v1/avatars/favicon') - ->desc('Get Favicon') + ->desc('Get favicon') ->groups(['api', 'avatars']) ->label('scope', 'avatars.read') ->label('cache', true) @@ -449,7 +449,7 @@ App::get('/v1/avatars/favicon') }); App::get('/v1/avatars/qr') - ->desc('Get QR Code') + ->desc('Get QR code') ->groups(['api', 'avatars']) ->label('scope', 'avatars.read') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_KEY, APP_AUTH_TYPE_JWT]) @@ -489,7 +489,7 @@ App::get('/v1/avatars/qr') }); App::get('/v1/avatars/initials') - ->desc('Get User Initials') + ->desc('Get user initials') ->groups(['api', 'avatars']) ->label('scope', 'avatars.read') ->label('cache.resource', 'avatar/initials') @@ -509,12 +509,11 @@ App::get('/v1/avatars/initials') ->action(function (string $name, int $width, int $height, string $background, Response $response, Document $user) { $themes = [ - ['background' => '#FFA1CE'], // Default (Pink) - ['background' => '#FDC584'], // Orange - ['background' => '#94DBD1'], // Green - ['background' => '#A1C4FF'], // Blue - ['background' => '#FFA1CE'], // Pink - ['background' => '#CBB1FC'] // Purple + ['background' => '#FD366E'], // Default (Pink) + ['background' => '#FE9567'], // Orange + ['background' => '#7C67FE'], // Purple + ['background' => '#68A3FE'], // Blue + ['background' => '#85DBD8'], // Mint ]; $name = (!empty($name)) ? $name : $user->getAttribute('name', $user->getAttribute('email', '')); @@ -526,11 +525,13 @@ App::get('/v1/avatars/initials') $code = 0; foreach ($words as $key => $w) { - $initials .= $w[0] ?? ''; - $code += (isset($w[0])) ? \ord($w[0]) : 0; + if (ctype_alnum($w[0] ?? '')) { + $initials .= $w[0]; + $code += ord($w[0]); - if ($key == 1) { - break; + if ($key == 1) { + break; + } } } @@ -548,8 +549,8 @@ App::get('/v1/avatars/initials') $punch->newImage($width, $height, 'transparent'); - $draw->setFont(__DIR__ . "/../../assets/fonts/poppins-v9-latin-500.ttf"); - $image->setFont(__DIR__ . "/../../assets/fonts/poppins-v9-latin-500.ttf"); + $draw->setFont(__DIR__ . "/../../assets/fonts/inter-v8-latin-regular.woff2"); + $image->setFont(__DIR__ . "/../../assets/fonts/inter-v8-latin-regular.woff2"); $draw->setFillColor(new ImagickPixel('black')); $draw->setFontSize($fontSize); @@ -724,7 +725,7 @@ App::get('/v1/cards/cloud') $text = new \ImagickDraw(); $text->setTextAlignment(Imagick::ALIGN_CENTER); - $text->setFont(__DIR__ . '/../../../public/fonts/Poppins-Bold.ttf'); + $text->setFont(__DIR__ . '/../../../public/fonts/Inter-Bold.ttf'); $text->setFillColor(new \ImagickPixel('#FFFFFF')); if (\strlen($name) > 32) { @@ -1108,7 +1109,7 @@ App::get('/v1/cards/cloud-og') $textName = new \ImagickDraw(); $textName->setTextAlignment(Imagick::ALIGN_CENTER); - $textName->setFont(__DIR__ . '/../../../public/fonts/Poppins-Bold.ttf'); + $textName->setFont(__DIR__ . '/../../../public/fonts/Inter-Bold.ttf'); $textName->setFillColor(new \ImagickPixel('#FFFFFF')); if (\strlen($name) > 32) { diff --git a/app/controllers/api/console.php b/app/controllers/api/console.php index 1bd62a1d4c..5abcd0fa23 100644 --- a/app/controllers/api/console.php +++ b/app/controllers/api/console.php @@ -17,7 +17,7 @@ App::init() App::get('/v1/console/variables') - ->desc('Get Variables') + ->desc('Get variables') ->groups(['api', 'projects']) ->label('scope', 'projects.read') ->label('sdk.auth', [APP_AUTH_TYPE_ADMIN]) diff --git a/app/controllers/api/databases.php b/app/controllers/api/databases.php index 596ea6171b..06fc5254fe 100644 --- a/app/controllers/api/databases.php +++ b/app/controllers/api/databases.php @@ -17,12 +17,9 @@ use MaxMind\Db\Reader; use Utopia\App; use Utopia\Audit\Audit; use Utopia\Config\Config; -use Utopia\Database\Adapter\MariaDB; use Utopia\Database\Database; -use Utopia\Database\DateTime; use Utopia\Database\Document; use Utopia\Database\Exception\Authorization as AuthorizationException; -use Utopia\Database\Exception\Conflict; use Utopia\Database\Exception\Duplicate as DuplicateException; use Utopia\Database\Exception\Limit as LimitException; use Utopia\Database\Exception\Restricted as RestrictedException; @@ -385,7 +382,7 @@ function updateAttribute( } App::post('/v1/databases') - ->desc('Create Database') + ->desc('Create database') ->groups(['api', 'database']) ->label('event', 'databases.[databaseId].create') ->label('scope', 'databases.write') @@ -461,7 +458,7 @@ App::post('/v1/databases') }); App::get('/v1/databases') - ->desc('List Databases') + ->desc('List databases') ->groups(['api', 'database']) ->label('scope', 'databases.read') ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) @@ -508,7 +505,7 @@ App::get('/v1/databases') }); App::get('/v1/databases/:databaseId') - ->desc('Get Database') + ->desc('Get database') ->groups(['api', 'database']) ->label('scope', 'databases.read') ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) @@ -533,7 +530,7 @@ App::get('/v1/databases/:databaseId') }); App::get('/v1/databases/:databaseId/logs') - ->desc('List Database Logs') + ->desc('List database logs') ->groups(['api', 'database']) ->label('scope', 'databases.read') ->label('sdk.auth', [APP_AUTH_TYPE_ADMIN]) @@ -619,7 +616,7 @@ App::get('/v1/databases/:databaseId/logs') App::put('/v1/databases/:databaseId') - ->desc('Update Database') + ->desc('Update database') ->groups(['api', 'database', 'schema']) ->label('scope', 'databases.write') ->label('event', 'databases.[databaseId].update') @@ -663,7 +660,7 @@ App::put('/v1/databases/:databaseId') }); App::delete('/v1/databases/:databaseId') - ->desc('Delete Database') + ->desc('Delete database') ->groups(['api', 'database', 'schema']) ->label('scope', 'databases.write') ->label('event', 'databases.[databaseId].delete') @@ -707,7 +704,7 @@ App::delete('/v1/databases/:databaseId') }); App::post('/v1/databases/:databaseId/collections') - ->desc('Create Collection') + ->desc('Create collection') ->groups(['api', 'database']) ->label('event', 'databases.[databaseId].collections.[collectionId].create') ->label('scope', 'collections.write') @@ -775,7 +772,7 @@ App::post('/v1/databases/:databaseId/collections') App::get('/v1/databases/:databaseId/collections') ->alias('/v1/database/collections', ['databaseId' => 'default']) - ->desc('List Collections') + ->desc('List collections') ->groups(['api', 'database']) ->label('scope', 'collections.read') ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) @@ -832,7 +829,7 @@ App::get('/v1/databases/:databaseId/collections') App::get('/v1/databases/:databaseId/collections/:collectionId') ->alias('/v1/database/collections/:collectionId', ['databaseId' => 'default']) - ->desc('Get Collection') + ->desc('Get collection') ->groups(['api', 'database']) ->label('scope', 'collections.read') ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) @@ -866,7 +863,7 @@ App::get('/v1/databases/:databaseId/collections/:collectionId') App::get('/v1/databases/:databaseId/collections/:collectionId/logs') ->alias('/v1/database/collections/:collectionId/logs', ['databaseId' => 'default']) - ->desc('List Collection Logs') + ->desc('List collection logs') ->groups(['api', 'database']) ->label('scope', 'collections.read') ->label('sdk.auth', [APP_AUTH_TYPE_ADMIN]) @@ -960,7 +957,7 @@ App::get('/v1/databases/:databaseId/collections/:collectionId/logs') App::put('/v1/databases/:databaseId/collections/:collectionId') ->alias('/v1/database/collections/:collectionId', ['databaseId' => 'default']) - ->desc('Update Collection') + ->desc('Update collection') ->groups(['api', 'database', 'schema']) ->label('scope', 'collections.write') ->label('event', 'databases.[databaseId].collections.[collectionId].update') @@ -1028,7 +1025,7 @@ App::put('/v1/databases/:databaseId/collections/:collectionId') App::delete('/v1/databases/:databaseId/collections/:collectionId') ->alias('/v1/database/collections/:collectionId', ['databaseId' => 'default']) - ->desc('Delete Collection') + ->desc('Delete collection') ->groups(['api', 'database', 'schema']) ->label('scope', 'collections.write') ->label('event', 'databases.[databaseId].collections.[collectionId].delete') @@ -1082,7 +1079,7 @@ App::delete('/v1/databases/:databaseId/collections/:collectionId') App::post('/v1/databases/:databaseId/collections/:collectionId/attributes/string') ->alias('/v1/database/collections/:collectionId/attributes/string', ['databaseId' => 'default']) - ->desc('Create String Attribute') + ->desc('Create string attribute') ->groups(['api', 'database', 'schema']) ->label('event', 'databases.[databaseId].collections.[collectionId].attributes.[attributeId].create') ->label('scope', 'collections.write') @@ -1138,7 +1135,7 @@ App::post('/v1/databases/:databaseId/collections/:collectionId/attributes/string App::post('/v1/databases/:databaseId/collections/:collectionId/attributes/email') ->alias('/v1/database/collections/:collectionId/attributes/email', ['databaseId' => 'default']) - ->desc('Create Email Attribute') + ->desc('Create email attribute') ->groups(['api', 'database', 'schema']) ->label('event', 'databases.[databaseId].collections.[collectionId].attributes.[attributeId].create') ->label('scope', 'collections.write') @@ -1180,7 +1177,7 @@ App::post('/v1/databases/:databaseId/collections/:collectionId/attributes/email' App::post('/v1/databases/:databaseId/collections/:collectionId/attributes/enum') ->alias('/v1/database/collections/:collectionId/attributes/enum', ['databaseId' => 'default']) - ->desc('Create Enum Attribute') + ->desc('Create enum attribute') ->groups(['api', 'database', 'schema']) ->label('event', 'databases.[databaseId].collections.[collectionId].attributes.[attributeId].create') ->label('scope', 'collections.write') @@ -1238,7 +1235,7 @@ App::post('/v1/databases/:databaseId/collections/:collectionId/attributes/enum') App::post('/v1/databases/:databaseId/collections/:collectionId/attributes/ip') ->alias('/v1/database/collections/:collectionId/attributes/ip', ['databaseId' => 'default']) - ->desc('Create IP Address Attribute') + ->desc('Create IP address attribute') ->groups(['api', 'database', 'schema']) ->label('event', 'databases.[databaseId].collections.[collectionId].attributes.[attributeId].create') ->label('scope', 'collections.write') @@ -1280,7 +1277,7 @@ App::post('/v1/databases/:databaseId/collections/:collectionId/attributes/ip') App::post('/v1/databases/:databaseId/collections/:collectionId/attributes/url') ->alias('/v1/database/collections/:collectionId/attributes/url', ['databaseId' => 'default']) - ->desc('Create URL Attribute') + ->desc('Create URL attribute') ->groups(['api', 'database', 'schema']) ->label('event', 'databases.[databaseId].collections.[collectionId].attributes.[attributeId].create') ->label('scope', 'collections.write') @@ -1322,7 +1319,7 @@ App::post('/v1/databases/:databaseId/collections/:collectionId/attributes/url') App::post('/v1/databases/:databaseId/collections/:collectionId/attributes/integer') ->alias('/v1/database/collections/:collectionId/attributes/integer', ['databaseId' => 'default']) - ->desc('Create Integer Attribute') + ->desc('Create integer attribute') ->groups(['api', 'database', 'schema']) ->label('event', 'databases.[databaseId].collections.[collectionId].attributes.[attributeId].create') ->label('scope', 'collections.write') @@ -1393,7 +1390,7 @@ App::post('/v1/databases/:databaseId/collections/:collectionId/attributes/intege App::post('/v1/databases/:databaseId/collections/:collectionId/attributes/float') ->alias('/v1/database/collections/:collectionId/attributes/float', ['databaseId' => 'default']) - ->desc('Create Float Attribute') + ->desc('Create float attribute') ->groups(['api', 'database', 'schema']) ->label('event', 'databases.[databaseId].collections.[collectionId].attributes.[attributeId].create') ->label('scope', 'collections.write') @@ -1467,7 +1464,7 @@ App::post('/v1/databases/:databaseId/collections/:collectionId/attributes/float' App::post('/v1/databases/:databaseId/collections/:collectionId/attributes/boolean') ->alias('/v1/database/collections/:collectionId/attributes/boolean', ['databaseId' => 'default']) - ->desc('Create Boolean Attribute') + ->desc('Create boolean attribute') ->groups(['api', 'database', 'schema']) ->label('event', 'databases.[databaseId].collections.[collectionId].attributes.[attributeId].create') ->label('scope', 'collections.write') @@ -1508,7 +1505,7 @@ App::post('/v1/databases/:databaseId/collections/:collectionId/attributes/boolea App::post('/v1/databases/:databaseId/collections/:collectionId/attributes/datetime') ->alias('/v1/database/collections/:collectionId/attributes/datetime', ['databaseId' => 'default']) - ->desc('Create DateTime Attribute') + ->desc('Create datetime attribute') ->groups(['api', 'database']) ->label('event', 'databases.[databaseId].collections.[collectionId].attributes.[attributeId].create') ->label('scope', 'collections.write') @@ -1552,7 +1549,7 @@ App::post('/v1/databases/:databaseId/collections/:collectionId/attributes/dateti App::post('/v1/databases/:databaseId/collections/:collectionId/attributes/relationship') ->alias('/v1/database/collections/:collectionId/attributes/relationship', ['databaseId' => 'default']) - ->desc('Create Relationship Attribute') + ->desc('Create relationship attribute') ->groups(['api', 'database']) ->label('event', 'databases.[databaseId].collections.[collectionId].attributes.[attributeId].create') ->label('scope', 'collections.write') @@ -1632,7 +1629,7 @@ App::post('/v1/databases/:databaseId/collections/:collectionId/attributes/relati App::get('/v1/databases/:databaseId/collections/:collectionId/attributes') ->alias('/v1/database/collections/:collectionId/attributes', ['databaseId' => 'default']) - ->desc('List Attributes') + ->desc('List attributes') ->groups(['api', 'database']) ->label('scope', 'collections.read') ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) @@ -1705,7 +1702,7 @@ App::get('/v1/databases/:databaseId/collections/:collectionId/attributes') App::get('/v1/databases/:databaseId/collections/:collectionId/attributes/:key') ->alias('/v1/database/collections/:collectionId/attributes/:key', ['databaseId' => 'default']) - ->desc('Get Attribute') + ->desc('Get attribute') ->groups(['api', 'database']) ->label('scope', 'collections.read') ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) @@ -1779,7 +1776,7 @@ App::get('/v1/databases/:databaseId/collections/:collectionId/attributes/:key') }); App::patch('/v1/databases/:databaseId/collections/:collectionId/attributes/string/:key') - ->desc('Update String Attribute') + ->desc('Update string attribute') ->groups(['api', 'database', 'schema']) ->label('scope', 'collections.write') ->label('event', 'databases.[databaseId].collections.[collectionId].attributes.[attributeId].update') @@ -1818,7 +1815,7 @@ App::patch('/v1/databases/:databaseId/collections/:collectionId/attributes/strin }); App::patch('/v1/databases/:databaseId/collections/:collectionId/attributes/email/:key') - ->desc('Update Email Attribute') + ->desc('Update email attribute') ->groups(['api', 'database', 'schema']) ->label('scope', 'collections.write') ->label('event', 'databases.[databaseId].collections.[collectionId].attributes.[attributeId].update') @@ -1859,7 +1856,7 @@ App::patch('/v1/databases/:databaseId/collections/:collectionId/attributes/email }); App::patch('/v1/databases/:databaseId/collections/:collectionId/attributes/enum/:key') - ->desc('Update Enum Attribute') + ->desc('Update enum attribute') ->groups(['api', 'database', 'schema']) ->label('scope', 'collections.write') ->label('event', 'databases.[databaseId].collections.[collectionId].attributes.[attributeId].update') @@ -1902,7 +1899,7 @@ App::patch('/v1/databases/:databaseId/collections/:collectionId/attributes/enum/ }); App::patch('/v1/databases/:databaseId/collections/:collectionId/attributes/ip/:key') - ->desc('Update IP Address Attribute') + ->desc('Update IP address attribute') ->groups(['api', 'database', 'schema']) ->label('scope', 'collections.write') ->label('event', 'databases.[databaseId].collections.[collectionId].attributes.[attributeId].update') @@ -1943,7 +1940,7 @@ App::patch('/v1/databases/:databaseId/collections/:collectionId/attributes/ip/:k }); App::patch('/v1/databases/:databaseId/collections/:collectionId/attributes/url/:key') - ->desc('Update URL Attribute') + ->desc('Update URL attribute') ->groups(['api', 'database', 'schema']) ->label('scope', 'collections.write') ->label('event', 'databases.[databaseId].collections.[collectionId].attributes.[attributeId].update') @@ -1984,7 +1981,7 @@ App::patch('/v1/databases/:databaseId/collections/:collectionId/attributes/url/: }); App::patch('/v1/databases/:databaseId/collections/:collectionId/attributes/integer/:key') - ->desc('Update Integer Attribute') + ->desc('Update integer attribute') ->groups(['api', 'database', 'schema']) ->label('scope', 'collections.write') ->label('event', 'databases.[databaseId].collections.[collectionId].attributes.[attributeId].update') @@ -2035,7 +2032,7 @@ App::patch('/v1/databases/:databaseId/collections/:collectionId/attributes/integ }); App::patch('/v1/databases/:databaseId/collections/:collectionId/attributes/float/:key') - ->desc('Update Float Attribute') + ->desc('Update float attribute') ->groups(['api', 'database', 'schema']) ->label('scope', 'collections.write') ->label('event', 'databases.[databaseId].collections.[collectionId].attributes.[attributeId].update') @@ -2086,7 +2083,7 @@ App::patch('/v1/databases/:databaseId/collections/:collectionId/attributes/float }); App::patch('/v1/databases/:databaseId/collections/:collectionId/attributes/boolean/:key') - ->desc('Update Boolean Attribute') + ->desc('Update boolean attribute') ->groups(['api', 'database', 'schema']) ->label('scope', 'collections.write') ->label('event', 'databases.[databaseId].collections.[collectionId].attributes.[attributeId].update') @@ -2126,7 +2123,7 @@ App::patch('/v1/databases/:databaseId/collections/:collectionId/attributes/boole }); App::patch('/v1/databases/:databaseId/collections/:collectionId/attributes/datetime/:key') - ->desc('Update DateTime Attribute') + ->desc('Update dateTime attribute') ->groups(['api', 'database', 'schema']) ->label('scope', 'collections.write') ->label('event', 'databases.[databaseId].collections.[collectionId].attributes.[attributeId].update') @@ -2166,7 +2163,7 @@ App::patch('/v1/databases/:databaseId/collections/:collectionId/attributes/datet }); App::patch('/v1/databases/:databaseId/collections/:collectionId/attributes/:key/relationship') - ->desc('Update Relationship Attribute') + ->desc('Update relationship attribute') ->groups(['api', 'database', 'schema']) ->label('scope', 'collections.write') ->label('event', 'databases.[databaseId].collections.[collectionId].attributes.[attributeId].update') @@ -2222,7 +2219,7 @@ App::patch('/v1/databases/:databaseId/collections/:collectionId/attributes/:key/ App::delete('/v1/databases/:databaseId/collections/:collectionId/attributes/:key') ->alias('/v1/database/collections/:collectionId/attributes/:key', ['databaseId' => 'default']) - ->desc('Delete Attribute') + ->desc('Delete attribute') ->groups(['api', 'database', 'schema']) ->label('scope', 'collections.write') ->label('event', 'databases.[databaseId].collections.[collectionId].attributes.[attributeId].delete') @@ -2332,7 +2329,7 @@ App::delete('/v1/databases/:databaseId/collections/:collectionId/attributes/:key App::post('/v1/databases/:databaseId/collections/:collectionId/indexes') ->alias('/v1/database/collections/:collectionId/indexes', ['databaseId' => 'default']) - ->desc('Create Index') + ->desc('Create index') ->groups(['api', 'database']) ->label('event', 'databases.[databaseId].collections.[collectionId].indexes.[indexId].create') ->label('scope', 'collections.write') @@ -2490,7 +2487,7 @@ App::post('/v1/databases/:databaseId/collections/:collectionId/indexes') App::get('/v1/databases/:databaseId/collections/:collectionId/indexes') ->alias('/v1/database/collections/:collectionId/indexes', ['databaseId' => 'default']) - ->desc('List Indexes') + ->desc('List indexes') ->groups(['api', 'database']) ->label('scope', 'collections.read') ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) @@ -2553,7 +2550,7 @@ App::get('/v1/databases/:databaseId/collections/:collectionId/indexes') App::get('/v1/databases/:databaseId/collections/:collectionId/indexes/:key') ->alias('/v1/database/collections/:collectionId/indexes/:key', ['databaseId' => 'default']) - ->desc('Get Index') + ->desc('Get index') ->groups(['api', 'database']) ->label('scope', 'collections.read') ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) @@ -2592,7 +2589,7 @@ App::get('/v1/databases/:databaseId/collections/:collectionId/indexes/:key') App::delete('/v1/databases/:databaseId/collections/:collectionId/indexes/:key') ->alias('/v1/database/collections/:collectionId/indexes/:key', ['databaseId' => 'default']) - ->desc('Delete Index') + ->desc('Delete index') ->groups(['api', 'database']) ->label('scope', 'collections.write') ->label('event', 'databases.[databaseId].collections.[collectionId].indexes.[indexId].delete') @@ -2656,7 +2653,7 @@ App::delete('/v1/databases/:databaseId/collections/:collectionId/indexes/:key') App::post('/v1/databases/:databaseId/collections/:collectionId/documents') ->alias('/v1/database/collections/:collectionId/documents', ['databaseId' => 'default']) - ->desc('Create Document') + ->desc('Create document') ->groups(['api', 'database']) ->label('event', 'databases.[databaseId].collections.[collectionId].documents.[documentId].create') ->label('scope', 'documents.write') @@ -2895,7 +2892,7 @@ App::post('/v1/databases/:databaseId/collections/:collectionId/documents') App::get('/v1/databases/:databaseId/collections/:collectionId/documents') ->alias('/v1/database/collections/:collectionId/documents', ['databaseId' => 'default']) - ->desc('List Documents') + ->desc('List documents') ->groups(['api', 'database']) ->label('scope', 'documents.read') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_KEY, APP_AUTH_TYPE_JWT]) @@ -3020,7 +3017,7 @@ App::get('/v1/databases/:databaseId/collections/:collectionId/documents') App::get('/v1/databases/:databaseId/collections/:collectionId/documents/:documentId') ->alias('/v1/database/collections/:collectionId/documents/:documentId', ['databaseId' => 'default']) - ->desc('Get Document') + ->desc('Get document') ->groups(['api', 'database']) ->label('scope', 'documents.read') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_KEY, APP_AUTH_TYPE_JWT]) @@ -3113,7 +3110,7 @@ App::get('/v1/databases/:databaseId/collections/:collectionId/documents/:documen App::get('/v1/databases/:databaseId/collections/:collectionId/documents/:documentId/logs') ->alias('/v1/database/collections/:collectionId/documents/:documentId/logs', ['databaseId' => 'default']) - ->desc('List Document Logs') + ->desc('List document logs') ->groups(['api', 'database']) ->label('scope', 'documents.read') ->label('sdk.auth', [APP_AUTH_TYPE_ADMIN]) @@ -3212,7 +3209,7 @@ App::get('/v1/databases/:databaseId/collections/:collectionId/documents/:documen App::patch('/v1/databases/:databaseId/collections/:collectionId/documents/:documentId') ->alias('/v1/database/collections/:collectionId/documents/:documentId', ['databaseId' => 'default']) - ->desc('Update Document') + ->desc('Update document') ->groups(['api', 'database']) ->label('event', 'databases.[databaseId].collections.[collectionId].documents.[documentId].update') ->label('scope', 'documents.write') @@ -3440,7 +3437,7 @@ App::patch('/v1/databases/:databaseId/collections/:collectionId/documents/:docum App::delete('/v1/databases/:databaseId/collections/:collectionId/documents/:documentId') ->alias('/v1/database/collections/:collectionId/documents/:documentId', ['databaseId' => 'default']) - ->desc('Delete Document') + ->desc('Delete document') ->groups(['api', 'database']) ->label('scope', 'documents.write') ->label('event', 'databases.[databaseId].collections.[collectionId].documents.[documentId].delete') diff --git a/app/controllers/api/functions.php b/app/controllers/api/functions.php index 8fcee70530..b510f37b5f 100644 --- a/app/controllers/api/functions.php +++ b/app/controllers/api/functions.php @@ -13,7 +13,6 @@ use Appwrite\Extend\Exception; use Appwrite\Utopia\Database\Validator\CustomId; use Appwrite\Messaging\Adapter\Realtime; use Utopia\Validator\Assoc; -use Appwrite\Usage\Stats; use Utopia\Database\Helpers\ID; use Utopia\Database\Helpers\Permission; use Utopia\Database\Helpers\Role; @@ -84,6 +83,7 @@ $redeployVcs = function (Request $request, Document $function, Document $project Permission::delete(Role::any()), ], 'resourceId' => $function->getId(), + 'resourceInternalId' => $function->getInternalId(), 'resourceType' => 'functions', 'entrypoint' => $entrypoint, 'commands' => $function->getAttribute('commands', ''), @@ -120,7 +120,7 @@ $redeployVcs = function (Request $request, Document $function, Document $project App::post('/v1/functions') ->groups(['api', 'functions']) - ->desc('Create Function') + ->desc('Create function') ->label('scope', 'functions.write') ->label('event', 'functions.[functionId].create') ->label('audits.event', 'function.create') @@ -339,7 +339,7 @@ App::post('/v1/functions') App::get('/v1/functions') ->groups(['api', 'functions']) - ->desc('List Functions') + ->desc('List functions') ->label('scope', 'functions.read') ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) ->label('sdk.namespace', 'functions') @@ -414,7 +414,7 @@ App::get('/v1/functions/runtimes') App::get('/v1/functions/:functionId') ->groups(['api', 'functions']) - ->desc('Get Function') + ->desc('Get function') ->label('scope', 'functions.read') ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) ->label('sdk.namespace', 'functions') @@ -437,7 +437,7 @@ App::get('/v1/functions/:functionId') }); App::get('/v1/functions/:functionId/usage') - ->desc('Get Function Usage') + ->desc('Get function usage') ->groups(['api', 'functions', 'usage']) ->label('scope', 'functions.read') ->label('sdk.auth', [APP_AUTH_TYPE_ADMIN]) @@ -600,7 +600,7 @@ App::get('/v1/functions/usage') App::put('/v1/functions/:functionId') ->groups(['api', 'functions']) - ->desc('Update Function') + ->desc('Update function') ->label('scope', 'functions.write') ->label('event', 'functions.[functionId].update') ->label('audits.event', 'function.update') @@ -865,7 +865,7 @@ App::get('/v1/functions/:functionId/deployments/:deploymentId/download') App::patch('/v1/functions/:functionId/deployments/:deploymentId') ->groups(['api', 'functions']) - ->desc('Update Function Deployment') + ->desc('Update function deployment') ->label('scope', 'functions.write') ->label('event', 'functions.[functionId].deployments.[deploymentId].update') ->label('audits.event', 'deployment.update') @@ -881,10 +881,9 @@ App::patch('/v1/functions/:functionId/deployments/:deploymentId') ->param('deploymentId', '', new UID(), 'Deployment ID.') ->inject('response') ->inject('dbForProject') - ->inject('project') ->inject('queueForEvents') ->inject('dbForConsole') - ->action(function (string $functionId, string $deploymentId, Response $response, Database $dbForProject, Document $project, Event $queueForEvents, Database $dbForConsole) { + ->action(function (string $functionId, string $deploymentId, Response $response, Database $dbForProject, Event $queueForEvents, Database $dbForConsole) { $function = $dbForProject->getDocument('functions', $functionId); $deployment = $dbForProject->getDocument('deployments', $deploymentId); @@ -928,7 +927,7 @@ App::patch('/v1/functions/:functionId/deployments/:deploymentId') App::delete('/v1/functions/:functionId') ->groups(['api', 'functions']) - ->desc('Delete Function') + ->desc('Delete function') ->label('scope', 'functions.write') ->label('event', 'functions.[functionId].delete') ->label('audits.event', 'function.delete') @@ -944,9 +943,8 @@ App::delete('/v1/functions/:functionId') ->inject('dbForProject') ->inject('queueForDeletes') ->inject('queueForEvents') - ->inject('project') ->inject('dbForConsole') - ->action(function (string $functionId, Response $response, Database $dbForProject, Delete $queueForDeletes, Event $queueForEvents, Document $project, Database $dbForConsole) { + ->action(function (string $functionId, Response $response, Database $dbForProject, Delete $queueForDeletes, Event $queueForEvents, Database $dbForConsole) { $function = $dbForProject->getDocument('functions', $functionId); @@ -976,7 +974,7 @@ App::delete('/v1/functions/:functionId') App::post('/v1/functions/:functionId/deployments') ->groups(['api', 'functions']) - ->desc('Create Deployment') + ->desc('Create deployment') ->label('scope', 'functions.write') ->label('event', 'functions.[functionId].deployments.[deploymentId].create') ->label('audits.event', 'deployment.create') @@ -1002,9 +1000,8 @@ App::post('/v1/functions/:functionId/deployments') ->inject('project') ->inject('deviceFunctions') ->inject('deviceLocal') - ->inject('dbForConsole') ->inject('queueForBuilds') - ->action(function (string $functionId, string $entrypoint, ?string $commands, mixed $code, bool $activate, Request $request, Response $response, Database $dbForProject, Event $queueForEvents, Document $project, Device $deviceFunctions, Device $deviceLocal, Database $dbForConsole, Build $queueForBuilds) { + ->action(function (string $functionId, string $entrypoint, ?string $commands, mixed $code, bool $activate, Request $request, Response $response, Database $dbForProject, Event $queueForEvents, Document $project, Device $deviceFunctions, Device $deviceLocal, Build $queueForBuilds) { $activate = filter_var($activate, FILTER_VALIDATE_BOOLEAN); @@ -1038,7 +1035,7 @@ App::post('/v1/functions/:functionId/deployments') } $fileExt = new FileExt([FileExt::TYPE_GZIP]); - $fileSizeValidator = new FileSize(App::getEnv('_APP_FUNCTIONS_SIZE_LIMIT', 0)); + $fileSizeValidator = new FileSize(App::getEnv('_APP_FUNCTIONS_SIZE_LIMIT', '30000000')); $upload = new Upload(); // Make sure we handle a single file and multiple files the same way @@ -1197,7 +1194,7 @@ App::post('/v1/functions/:functionId/deployments') App::get('/v1/functions/:functionId/deployments') ->groups(['api', 'functions']) - ->desc('List Deployments') + ->desc('List deployments') ->label('scope', 'functions.read') ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) ->label('sdk.namespace', 'functions') @@ -1267,7 +1264,7 @@ App::get('/v1/functions/:functionId/deployments') App::get('/v1/functions/:functionId/deployments/:deploymentId') ->groups(['api', 'functions']) - ->desc('Get Deployment') + ->desc('Get deployment') ->label('scope', 'functions.read') ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) ->label('sdk.namespace', 'functions') @@ -1309,7 +1306,7 @@ App::get('/v1/functions/:functionId/deployments/:deploymentId') App::delete('/v1/functions/:functionId/deployments/:deploymentId') ->groups(['api', 'functions']) - ->desc('Delete Deployment') + ->desc('Delete deployment') ->label('scope', 'functions.write') ->label('event', 'functions.[functionId].deployments.[deploymentId].delete') ->label('audits.event', 'deployment.delete') @@ -1373,7 +1370,7 @@ App::delete('/v1/functions/:functionId/deployments/:deploymentId') App::post('/v1/functions/:functionId/deployments/:deploymentId/builds/:buildId') ->groups(['api', 'functions']) - ->desc('Create Build') + ->desc('Create build') ->label('scope', 'functions.write') ->label('event', 'functions.[functionId].deployments.[deploymentId].update') ->label('audits.event', 'deployment.update') @@ -1441,7 +1438,7 @@ App::post('/v1/functions/:functionId/deployments/:deploymentId/builds/:buildId') App::post('/v1/functions/:functionId/executions') ->groups(['api', 'functions']) - ->desc('Create Execution') + ->desc('Create execution') ->label('scope', 'execution.write') ->label('event', 'functions.[functionId].executions.[executionId].create') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_KEY, APP_AUTH_TYPE_JWT]) @@ -1452,7 +1449,7 @@ App::post('/v1/functions/:functionId/executions') ->label('sdk.response.type', Response::CONTENT_TYPE_JSON) ->label('sdk.response.model', Response::MODEL_EXECUTION) ->param('functionId', '', new UID(), 'Function ID.') - ->param('body', '', new Text(8192, 0), 'HTTP body of execution. Default value is empty string.', true) + ->param('body', '', new Text(0, 0), 'HTTP body of execution. Default value is empty string.', true) ->param('async', false, new Boolean(), 'Execute code in the background. Default value is false.', true) ->param('path', '/', new Text(2048), 'HTTP path of execution. Path can include query params. Default value is /', true) ->param('method', 'POST', new Whitelist(['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS'], true), 'HTTP method of execution. Default value is GET.', true) @@ -1683,13 +1680,7 @@ App::post('/v1/functions/:functionId/executions') $execution->setAttribute('errors', $executionResponse['errors']); $execution->setAttribute('duration', $executionResponse['duration']); - /** - * Sync execution compute usage from - */ - $queueForUsage - ->addMetric(METRIC_EXECUTIONS_COMPUTE, (int)($executionResponse['duration'] * 1000))// per project - ->addMetric(str_replace('{functionInternalId}', $function->getInternalId(), METRIC_FUNCTION_ID_EXECUTIONS_COMPUTE), (int)($executionResponse['duration'] * 1000))// per function - ; + } catch (\Throwable $th) { $durationEnd = \microtime(true); @@ -1706,13 +1697,10 @@ App::post('/v1/functions/:functionId/executions') $execution = Authorization::skip(fn () => $dbForProject->createDocument('executions', $execution)); } - // TODO revise this later using route label $queueForUsage - ->setParam('functionId', $function->getId()) - ->setParam('executions.{scope}.compute', 1) - ->setParam('executionStatus', $execution->getAttribute('status', '')) - ->setParam('executionTime', $execution->getAttribute('duration')); // ms - + ->addMetric(METRIC_EXECUTIONS_COMPUTE, (int)($executionResponse['duration'] * 1000))// per project + ->addMetric(str_replace('{functionInternalId}', $function->getInternalId(), METRIC_FUNCTION_ID_EXECUTIONS_COMPUTE), (int)($executionResponse['duration'] * 1000))// per function + ; $roles = Authorization::getRoles(); $isPrivilegedUser = Auth::isPrivilegedUser($roles); @@ -1738,7 +1726,7 @@ App::post('/v1/functions/:functionId/executions') App::get('/v1/functions/:functionId/executions') ->groups(['api', 'functions']) - ->desc('List Executions') + ->desc('List executions') ->label('scope', 'execution.read') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_KEY, APP_AUTH_TYPE_JWT]) ->label('sdk.namespace', 'functions') @@ -1813,7 +1801,7 @@ App::get('/v1/functions/:functionId/executions') App::get('/v1/functions/:functionId/executions/:executionId') ->groups(['api', 'functions']) - ->desc('Get Execution') + ->desc('Get execution') ->label('scope', 'execution.read') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_KEY, APP_AUTH_TYPE_JWT]) ->label('sdk.namespace', 'functions') @@ -1861,7 +1849,7 @@ App::get('/v1/functions/:functionId/executions/:executionId') // Variables App::post('/v1/functions/:functionId/variables') - ->desc('Create Variable') + ->desc('Create variable') ->groups(['api', 'functions']) ->label('scope', 'functions.write') ->label('audits.event', 'variable.create') @@ -1925,7 +1913,7 @@ App::post('/v1/functions/:functionId/variables') }); App::get('/v1/functions/:functionId/variables') - ->desc('List Variables') + ->desc('List variables') ->groups(['api', 'functions']) ->label('scope', 'functions.read') ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) @@ -1952,7 +1940,7 @@ App::get('/v1/functions/:functionId/variables') }); App::get('/v1/functions/:functionId/variables/:variableId') - ->desc('Get Variable') + ->desc('Get variable') ->groups(['api', 'functions']) ->label('scope', 'functions.read') ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) @@ -1991,7 +1979,7 @@ App::get('/v1/functions/:functionId/variables/:variableId') }); App::put('/v1/functions/:functionId/variables/:variableId') - ->desc('Update Variable') + ->desc('Update variable') ->groups(['api', 'functions']) ->label('scope', 'functions.write') ->label('audits.event', 'variable.update') @@ -2052,7 +2040,7 @@ App::put('/v1/functions/:functionId/variables/:variableId') }); App::delete('/v1/functions/:functionId/variables/:variableId') - ->desc('Delete Variable') + ->desc('Delete variable') ->groups(['api', 'functions']) ->label('scope', 'functions.write') ->label('audits.event', 'variable.delete') diff --git a/app/controllers/api/graphql.php b/app/controllers/api/graphql.php index 8ee3b5ac47..830aecbe0c 100644 --- a/app/controllers/api/graphql.php +++ b/app/controllers/api/graphql.php @@ -18,7 +18,7 @@ use Utopia\Validator\JSON; use Utopia\Validator\Text; App::get('/v1/graphql') - ->desc('GraphQL Endpoint') + ->desc('GraphQL endpoint') ->groups(['graphql']) ->label('scope', 'graphql') ->label('sdk.auth', [APP_AUTH_TYPE_KEY, APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_JWT]) @@ -58,7 +58,7 @@ App::get('/v1/graphql') }); App::post('/v1/graphql/mutation') - ->desc('GraphQL Endpoint') + ->desc('GraphQL endpoint') ->groups(['graphql']) ->label('scope', 'graphql') ->label('sdk.auth', [APP_AUTH_TYPE_KEY, APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_JWT]) @@ -103,7 +103,7 @@ App::post('/v1/graphql/mutation') }); App::post('/v1/graphql') - ->desc('GraphQL Endpoint') + ->desc('GraphQL endpoint') ->groups(['graphql']) ->label('scope', 'graphql') ->label('sdk.auth', [APP_AUTH_TYPE_KEY, APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_JWT]) diff --git a/app/controllers/api/locale.php b/app/controllers/api/locale.php index 29b4932543..53f0c5bb25 100644 --- a/app/controllers/api/locale.php +++ b/app/controllers/api/locale.php @@ -9,7 +9,7 @@ use Utopia\Database\Document; use Utopia\Locale\Locale; App::get('/v1/locale') - ->desc('Get User Locale') + ->desc('Get user locale') ->groups(['api', 'locale']) ->label('scope', 'locale.read') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_KEY, APP_AUTH_TYPE_JWT]) @@ -91,7 +91,7 @@ App::get('/v1/locale/codes') }); App::get('/v1/locale/countries') - ->desc('List Countries') + ->desc('List countries') ->groups(['api', 'locale']) ->label('scope', 'locale.read') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_KEY, APP_AUTH_TYPE_JWT]) @@ -124,7 +124,7 @@ App::get('/v1/locale/countries') }); App::get('/v1/locale/countries/eu') - ->desc('List EU Countries') + ->desc('List EU countries') ->groups(['api', 'locale']) ->label('scope', 'locale.read') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_KEY, APP_AUTH_TYPE_JWT]) @@ -159,7 +159,7 @@ App::get('/v1/locale/countries/eu') }); App::get('/v1/locale/countries/phones') - ->desc('List Countries Phone Codes') + ->desc('List countries phone codes') ->groups(['api', 'locale']) ->label('scope', 'locale.read') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_KEY, APP_AUTH_TYPE_JWT]) @@ -193,7 +193,7 @@ App::get('/v1/locale/countries/phones') }); App::get('/v1/locale/continents') - ->desc('List Continents') + ->desc('List continents') ->groups(['api', 'locale']) ->label('scope', 'locale.read') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_KEY, APP_AUTH_TYPE_JWT]) @@ -225,7 +225,7 @@ App::get('/v1/locale/continents') }); App::get('/v1/locale/currencies') - ->desc('List Currencies') + ->desc('List currencies') ->groups(['api', 'locale']) ->label('scope', 'locale.read') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_KEY, APP_AUTH_TYPE_JWT]) @@ -248,7 +248,7 @@ App::get('/v1/locale/currencies') App::get('/v1/locale/languages') - ->desc('List Languages') + ->desc('List languages') ->groups(['api', 'locale']) ->label('scope', 'locale.read') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_KEY, APP_AUTH_TYPE_JWT]) diff --git a/app/controllers/api/project.php b/app/controllers/api/project.php index d992b759c6..0d0909fb0a 100644 --- a/app/controllers/api/project.php +++ b/app/controllers/api/project.php @@ -3,6 +3,7 @@ use Appwrite\Extend\Exception; use Appwrite\Utopia\Response; use Utopia\App; +use Utopia\Config\Config; use Utopia\Database\Database; use Utopia\Database\Document; use Utopia\Database\Exception\Duplicate as DuplicateException; @@ -14,7 +15,6 @@ use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\UID; use Utopia\Validator\Text; use Utopia\Validator\WhiteList; -use Utopia\Database\DateTime; App::get('/v1/project/usage') ->desc('Get usage stats for a project') @@ -72,18 +72,18 @@ App::get('/v1/project/usage') '1d' => 'Y-m-d\T00:00:00.000P', }; - foreach ($metrics as $metric) { - $usage[$metric] = []; - $leap = time() - ($days['limit'] * $days['factor']); - while ($leap < time()) { - $leap += $days['factor']; - $formatDate = date($format, $leap); - $usage[$metric][] = [ - 'value' => $stats[$metric][$formatDate]['value'] ?? 0, - 'date' => $formatDate, - ]; - } + foreach ($metrics as $metric) { + $usage[$metric] = []; + $leap = time() - ($days['limit'] * $days['factor']); + while ($leap < time()) { + $leap += $days['factor']; + $formatDate = date($format, $leap); + $usage[$metric][] = [ + 'value' => $stats[$metric][$formatDate]['value'] ?? 0, + 'date' => $formatDate, + ]; } + } $response->dynamic(new Document([ diff --git a/app/controllers/api/storage.php b/app/controllers/api/storage.php index 0976d3c15b..427f360f78 100644 --- a/app/controllers/api/storage.php +++ b/app/controllers/api/storage.php @@ -192,7 +192,7 @@ App::get('/v1/storage/buckets') }); App::get('/v1/storage/buckets/:bucketId') - ->desc('Get Bucket') + ->desc('Get bucket') ->groups(['api', 'storage']) ->label('scope', 'buckets.read') ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) @@ -217,7 +217,7 @@ App::get('/v1/storage/buckets/:bucketId') }); App::put('/v1/storage/buckets/:bucketId') - ->desc('Update Bucket') + ->desc('Update bucket') ->groups(['api', 'storage']) ->label('scope', 'buckets.write') ->label('event', 'buckets.[bucketId].update') @@ -284,7 +284,7 @@ App::put('/v1/storage/buckets/:bucketId') }); App::delete('/v1/storage/buckets/:bucketId') - ->desc('Delete Bucket') + ->desc('Delete bucket') ->groups(['api', 'storage']) ->label('scope', 'buckets.write') ->label('audits.event', 'bucket.delete') @@ -326,7 +326,7 @@ App::delete('/v1/storage/buckets/:bucketId') App::post('/v1/storage/buckets/:bucketId/files') ->alias('/v1/storage/files', ['bucketId' => 'default']) - ->desc('Create File') + ->desc('Create file') ->groups(['api', 'storage']) ->label('scope', 'files.write') ->label('audits.event', 'file.create') @@ -678,7 +678,7 @@ App::post('/v1/storage/buckets/:bucketId/files') App::get('/v1/storage/buckets/:bucketId/files') ->alias('/v1/storage/files', ['bucketId' => 'default']) - ->desc('List Files') + ->desc('List files') ->groups(['api', 'storage']) ->label('scope', 'files.read') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_KEY, APP_AUTH_TYPE_JWT]) @@ -757,7 +757,7 @@ App::get('/v1/storage/buckets/:bucketId/files') App::get('/v1/storage/buckets/:bucketId/files/:fileId') ->alias('/v1/storage/files/:fileId', ['bucketId' => 'default']) - ->desc('Get File') + ->desc('Get file') ->groups(['api', 'storage']) ->label('scope', 'files.read') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_KEY, APP_AUTH_TYPE_JWT]) @@ -804,7 +804,7 @@ App::get('/v1/storage/buckets/:bucketId/files/:fileId') App::get('/v1/storage/buckets/:bucketId/files/:fileId/preview') ->alias('/v1/storage/files/:fileId/preview', ['bucketId' => 'default']) - ->desc('Get File Preview') + ->desc('Get file preview') ->groups(['api', 'storage']) ->label('scope', 'files.read') ->label('cache', true) @@ -971,7 +971,7 @@ App::get('/v1/storage/buckets/:bucketId/files/:fileId/preview') App::get('/v1/storage/buckets/:bucketId/files/:fileId/download') ->alias('/v1/storage/files/:fileId/download', ['bucketId' => 'default']) - ->desc('Get File for Download') + ->desc('Get file for download') ->groups(['api', 'storage']) ->label('scope', 'files.read') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_KEY, APP_AUTH_TYPE_JWT]) @@ -1112,7 +1112,7 @@ App::get('/v1/storage/buckets/:bucketId/files/:fileId/download') App::get('/v1/storage/buckets/:bucketId/files/:fileId/view') ->alias('/v1/storage/files/:fileId/view', ['bucketId' => 'default']) - ->desc('Get File for View') + ->desc('Get file for view') ->groups(['api', 'storage']) ->label('scope', 'files.read') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_KEY, APP_AUTH_TYPE_JWT]) @@ -1263,7 +1263,7 @@ App::get('/v1/storage/buckets/:bucketId/files/:fileId/view') App::put('/v1/storage/buckets/:bucketId/files/:fileId') ->alias('/v1/storage/files/:fileId', ['bucketId' => 'default']) - ->desc('Update File') + ->desc('Update file') ->groups(['api', 'storage']) ->label('scope', 'files.write') ->label('event', 'buckets.[bucketId].files.[fileId].update') @@ -1466,6 +1466,75 @@ App::delete('/v1/storage/buckets/:bucketId/files/:fileId') $response->noContent(); }); +App::get('/v1/storage/usage') + ->desc('Get usage stats for storage') + ->groups(['api', 'storage']) + ->label('scope', 'files.read') + ->label('sdk.auth', [APP_AUTH_TYPE_ADMIN]) + ->label('sdk.namespace', 'storage') + ->label('sdk.method', 'getUsage') + ->label('sdk.response.code', Response::STATUS_CODE_OK) + ->label('sdk.response.type', Response::CONTENT_TYPE_JSON) + ->label('sdk.response.model', Response::MODEL_USAGE_STORAGE) + ->param('range', '30d', new WhiteList(['24h', '7d', '30d', '90d'], true), 'Date range.', true) + ->inject('response') + ->inject('dbForProject') + ->action(function (string $range, Response $response, Database $dbForProject) { + + $periods = Config::getParam('usage', []); + $stats = $usage = []; + $days = $periods[$range]; + $metrics = [ + METRIC_BUCKETS, + METRIC_FILES, + METRIC_FILES_STORAGE, + ]; + + Authorization::skip(function () use ($dbForProject, $days, $metrics, &$stats) { + foreach ($metrics as $metric) { + $limit = $days['limit']; + $period = $days['period']; + $results = $dbForProject->find('stats', [ + Query::equal('period', [$period]), + Query::equal('metric', [$metric]), + Query::limit($limit), + Query::orderDesc('time'), + ]); + $stats[$metric] = []; + foreach ($results as $result) { + $stats[$metric][$result->getAttribute('time')] = [ + 'value' => $result->getAttribute('value'), + ]; + } + } + }); + + $format = match ($days['period']) { + '1h' => 'Y-m-d\TH:00:00.000P', + '1d' => 'Y-m-d\T00:00:00.000P', + }; + + foreach ($metrics as $metric) { + $usage[$metric] = []; + $leap = time() - ($days['limit'] * $days['factor']); + while ($leap < time()) { + $leap += $days['factor']; + $formatDate = date($format, $leap); + $usage[$metric][] = [ + 'value' => $stats[$metric][$formatDate]['value'] ?? 0, + 'date' => $formatDate, + ]; + } + } + + $response->dynamic(new Document([ + 'range' => $range, + 'bucketsTotal' => $usage[$metrics[0]], + 'filesTotal' => $usage[$metrics[1]], + 'filesStorage' => $usage[$metrics[2]], + ]), Response::MODEL_USAGE_STORAGE); + }); + App::get('/v1/storage/:bucketId/usage') ->desc('Get usage stats for storage bucket') ->groups(['api', 'storage']) @@ -1540,72 +1609,3 @@ App::get('/v1/storage/:bucketId/usage') 'filesStorage' => $usage[$metrics[1]], ]), Response::MODEL_USAGE_BUCKETS); }); - -App::get('/v1/storage/usage') - ->desc('Get usage stats for storage') - ->groups(['api', 'storage']) - ->label('scope', 'files.read') - ->label('sdk.auth', [APP_AUTH_TYPE_ADMIN]) - ->label('sdk.namespace', 'storage') - ->label('sdk.method', 'getUsage') - ->label('sdk.response.code', Response::STATUS_CODE_OK) - ->label('sdk.response.type', Response::CONTENT_TYPE_JSON) - ->label('sdk.response.model', Response::MODEL_USAGE_STORAGE) - ->param('range', '30d', new WhiteList(['24h', '7d', '30d', '90d'], true), 'Date range.', true) - ->inject('response') - ->inject('dbForProject') - ->action(function (string $range, Response $response, Database $dbForProject) { - - $periods = Config::getParam('usage', []); - $stats = $usage = []; - $days = $periods[$range]; - $metrics = [ - METRIC_BUCKETS, - METRIC_FILES, - METRIC_FILES_STORAGE, - ]; - - Authorization::skip(function () use ($dbForProject, $days, $metrics, &$stats) { - foreach ($metrics as $metric) { - $limit = $days['limit']; - $period = $days['period']; - $results = $dbForProject->find('stats', [ - Query::equal('period', [$period]), - Query::equal('metric', [$metric]), - Query::limit($limit), - Query::orderDesc('time'), - ]); - $stats[$metric] = []; - foreach ($results as $result) { - $stats[$metric][$result->getAttribute('time')] = [ - 'value' => $result->getAttribute('value'), - ]; - } - } - }); - - $format = match ($days['period']) { - '1h' => 'Y-m-d\TH:00:00.000P', - '1d' => 'Y-m-d\T00:00:00.000P', - }; - - foreach ($metrics as $metric) { - $usage[$metric] = []; - $leap = time() - ($days['limit'] * $days['factor']); - while ($leap < time()) { - $leap += $days['factor']; - $formatDate = date($format, $leap); - $usage[$metric][] = [ - 'value' => $stats[$metric][$formatDate]['value'] ?? 0, - 'date' => $formatDate, - ]; - } - } - - $response->dynamic(new Document([ - 'range' => $range, - 'bucketsTotal' => $usage[$metrics[0]], - 'filesTotal' => $usage[$metrics[1]], - 'filesStorage' => $usage[$metrics[2]], - ]), Response::MODEL_USAGE_STORAGE); - }); diff --git a/app/controllers/api/teams.php b/app/controllers/api/teams.php index f52121743a..99fcfeb38c 100644 --- a/app/controllers/api/teams.php +++ b/app/controllers/api/teams.php @@ -41,7 +41,7 @@ use Utopia\Validator\Assoc; use Utopia\Validator\Text; App::post('/v1/teams') - ->desc('Create Team') + ->desc('Create team') ->groups(['api', 'teams']) ->label('event', 'teams.[teamId].create') ->label('scope', 'teams.write') @@ -129,7 +129,7 @@ App::post('/v1/teams') }); App::get('/v1/teams') - ->desc('List Teams') + ->desc('List teams') ->groups(['api', 'teams']) ->label('scope', 'teams.read') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_KEY, APP_AUTH_TYPE_JWT]) @@ -181,7 +181,7 @@ App::get('/v1/teams') }); App::get('/v1/teams/:teamId') - ->desc('Get Team') + ->desc('Get team') ->groups(['api', 'teams']) ->label('scope', 'teams.read') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_KEY, APP_AUTH_TYPE_JWT]) @@ -208,7 +208,7 @@ App::get('/v1/teams/:teamId') }); App::get('/v1/teams/:teamId/prefs') - ->desc('Get Team Preferences') + ->desc('Get team preferences') ->groups(['api', 'teams']) ->label('scope', 'teams.read') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_JWT]) @@ -236,7 +236,7 @@ App::get('/v1/teams/:teamId/prefs') }); App::put('/v1/teams/:teamId') - ->desc('Update Name') + ->desc('Update name') ->groups(['api', 'teams']) ->label('event', 'teams.[teamId].update') ->label('scope', 'teams.write') @@ -279,7 +279,7 @@ App::put('/v1/teams/:teamId') }); App::put('/v1/teams/:teamId/prefs') - ->desc('Update Preferences') + ->desc('Update preferences') ->groups(['api', 'teams']) ->label('event', 'teams.[teamId].update.prefs') ->label('scope', 'teams.write') @@ -315,7 +315,7 @@ App::put('/v1/teams/:teamId/prefs') }); App::delete('/v1/teams/:teamId') - ->desc('Delete Team') + ->desc('Delete team') ->groups(['api', 'teams']) ->label('event', 'teams.[teamId].delete') ->label('scope', 'teams.write') @@ -357,7 +357,7 @@ App::delete('/v1/teams/:teamId') }); App::post('/v1/teams/:teamId/memberships') - ->desc('Create Team Membership') + ->desc('Create team membership') ->groups(['api', 'teams', 'auth']) ->label('event', 'teams.[teamId].memberships.[membershipId].create') ->label('scope', 'teams.write') @@ -666,7 +666,7 @@ App::post('/v1/teams/:teamId/memberships') }); App::get('/v1/teams/:teamId/memberships') - ->desc('List Team Memberships') + ->desc('List team memberships') ->groups(['api', 'teams']) ->label('scope', 'teams.read') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_KEY, APP_AUTH_TYPE_JWT]) @@ -750,7 +750,7 @@ App::get('/v1/teams/:teamId/memberships') }); App::get('/v1/teams/:teamId/memberships/:membershipId') - ->desc('Get Team Membership') + ->desc('Get team membership') ->groups(['api', 'teams']) ->label('scope', 'teams.read') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_KEY, APP_AUTH_TYPE_JWT]) @@ -792,7 +792,7 @@ App::get('/v1/teams/:teamId/memberships/:membershipId') }); App::patch('/v1/teams/:teamId/memberships/:membershipId') - ->desc('Update Membership') + ->desc('Update membership') ->groups(['api', 'teams']) ->label('event', 'teams.[teamId].memberships.[membershipId].update') ->label('scope', 'teams.write') @@ -863,7 +863,7 @@ App::patch('/v1/teams/:teamId/memberships/:membershipId') }); App::patch('/v1/teams/:teamId/memberships/:membershipId/status') - ->desc('Update Team Membership Status') + ->desc('Update team membership status') ->groups(['api', 'teams']) ->label('event', 'teams.[teamId].memberships.[membershipId].update.status') ->label('scope', 'public') @@ -998,7 +998,7 @@ App::patch('/v1/teams/:teamId/memberships/:membershipId/status') }); App::delete('/v1/teams/:teamId/memberships/:membershipId') - ->desc('Delete Team Membership') + ->desc('Delete team membership') ->groups(['api', 'teams']) ->label('event', 'teams.[teamId].memberships.[membershipId].delete') ->label('scope', 'teams.write') @@ -1064,7 +1064,7 @@ App::delete('/v1/teams/:teamId/memberships/:membershipId') }); App::get('/v1/teams/:teamId/logs') - ->desc('List Team Logs') + ->desc('List team logs') ->groups(['api', 'teams']) ->label('scope', 'teams.read') ->label('sdk.auth', [APP_AUTH_TYPE_ADMIN]) @@ -1096,6 +1096,7 @@ App::get('/v1/teams/:teamId/logs') $audit = new Audit($dbForProject); $resource = 'team/' . $team->getId(); $logs = $audit->getLogsByResource($resource, $limit, $offset); + $output = []; foreach ($logs as $i => &$log) { diff --git a/app/controllers/api/vcs.php b/app/controllers/api/vcs.php index 2abf4ef30c..b0050c61d4 100644 --- a/app/controllers/api/vcs.php +++ b/app/controllers/api/vcs.php @@ -50,6 +50,7 @@ $createGitDeployments = function (GitHub $github, string $providerInstallationId $functionId = $resource->getAttribute('resourceId'); $function = Authorization::skip(fn () => $dbForProject->getDocument('functions', $functionId)); + $functionInternalId = $function->getInternalId(); $deploymentId = ID::unique(); $repositoryId = $resource->getId(); @@ -173,6 +174,7 @@ $createGitDeployments = function (GitHub $github, string $providerInstallationId Permission::delete(Role::any()), ], 'resourceId' => $functionId, + 'resourceInternalId' => $functionInternalId, 'resourceType' => 'functions', 'entrypoint' => $function->getAttribute('entrypoint'), 'commands' => $function->getAttribute('commands'), diff --git a/app/controllers/general.php b/app/controllers/general.php index 50da07ead6..d0189621cc 100644 --- a/app/controllers/general.php +++ b/app/controllers/general.php @@ -47,6 +47,8 @@ Config::setParam('cookieSamesite', Response::COOKIE_SAMESITE_NONE); function router(App $utopia, Database $dbForConsole, SwooleRequest $swooleRequest, Request $request, Response $response) { + $utopia->getRoute()?->label('error', __DIR__ . '/../views/general/error.phtml'); + $host = $request->getHostname() ?? ''; $route = Authorization::skip( @@ -57,12 +59,25 @@ function router(App $utopia, Database $dbForConsole, SwooleRequest $swooleReques )[0] ?? null; if ($route === null) { + if ($host === App::getEnv('_APP_DOMAIN_FUNCTIONS', '')) { + throw new AppwriteException(AppwriteException::GENERAL_ACCESS_FORBIDDEN, 'This domain cannot be used for security reasons. Please use any subdomain instead.'); + } + + if (\str_ends_with($host, App::getEnv('_APP_DOMAIN_FUNCTIONS', ''))) { + throw new AppwriteException(AppwriteException::GENERAL_ACCESS_FORBIDDEN, 'This domain is not connected to any Appwrite resource yet. Please configure custom domain or function domain to allow this request.'); + } + + if (App::getEnv('_APP_OPTIONS_ROUTER_PROTECTION', 'disabled') === 'enabled') { + if ($host !== 'localhost' && $host !== APP_HOSTNAME_INTERNAL) { // localhost allowed for proxy, APP_HOSTNAME_INTERNAL allowed for migrations + throw new AppwriteException(AppwriteException::GENERAL_ACCESS_FORBIDDEN, 'Router protection does not allow accessing Appwrite over this domain. Please add it as custom domain to your project or disable _APP_OPTIONS_ROUTER_PROTECTION environment variable.'); + } + } + // Act as API - no Proxy logic + $utopia->getRoute()?->label('error', ''); return false; } - $utopia->getRoute()?->label('error', __DIR__ . '/../views/general/error.phtml'); - $projectId = $route->getAttribute('projectId'); $project = Authorization::skip( fn () => $dbForConsole->getDocument('projects', $projectId) @@ -83,6 +98,16 @@ function router(App $utopia, Database $dbForConsole, SwooleRequest $swooleReques $type = $route->getAttribute('resourceType'); if ($type === 'function') { + if (App::getEnv('_APP_OPTIONS_FUNCTIONS_FORCE_HTTPS', 'disabled') === 'enabled') { // Force HTTPS + if ($request->getProtocol() !== 'https') { + if ($request->getMethod() !== Request::METHOD_GET) { + throw new AppwriteException(AppwriteException::GENERAL_PROTOCOL_UNSUPPORTED, 'Method unsupported over HTTP. Please use HTTPS instead.'); + } + + return $response->redirect('https://' . $request->getHostname() . $request->getURI()); + } + } + $functionId = $route->getAttribute('resourceId'); $projectId = $route->getAttribute('projectId'); @@ -164,6 +189,7 @@ function router(App $utopia, Database $dbForConsole, SwooleRequest $swooleReques throw new AppwriteException(AppwriteException::GENERAL_SERVER_ERROR, 'Unknown resource type ' . $type); } + $utopia->getRoute()?->label('error', ''); return false; } @@ -381,7 +407,7 @@ App::init() if (App::getEnv('_APP_OPTIONS_FORCE_HTTPS', 'disabled') === 'enabled') { // Force HTTPS if ($request->getProtocol() !== 'https' && ($swooleRequest->header['host'] ?? '') !== 'localhost' && ($swooleRequest->header['host'] ?? '') !== APP_HOSTNAME_INTERNAL) { // localhost allowed for proxy, APP_HOSTNAME_INTERNAL allowed for migrations if ($request->getMethod() !== Request::METHOD_GET) { - throw new AppwriteException(AppwriteException::GENERAL_PROTOCOL_UNSUPPORTED, 'Method unsupported over HTTP.'); + throw new AppwriteException(AppwriteException::GENERAL_PROTOCOL_UNSUPPORTED, 'Method unsupported over HTTP. Please use HTTPS instead.'); } return $response->redirect('https://' . $request->getHostname() . $request->getURI()); diff --git a/app/controllers/web/console.php b/app/controllers/web/console.php index 4a6f15df3a..dcf9c80a51 100644 --- a/app/controllers/web/console.php +++ b/app/controllers/web/console.php @@ -1,6 +1,5 @@ inject('queueForUsage') ->inject('cache') ->inject('getProjectDB') - ->inject('deviceFunctions') - ->callback(fn($message, Database $dbForConsole, Event $queueForEvents, Func $queueForFunctions, Usage $queueForUsage, Cache $cache, callable $getProjectDB, callable $deviceFunctions) => $this->action($message, $dbForConsole, $queueForEvents, $queueForFunctions, $queueForUsage, $cache, $getProjectDB, $deviceFunctions)); + ->inject('getFunctionsDevice') + ->callback(fn($message, Database $dbForConsole, Event $queueForEvents, Func $queueForFunctions, Usage $queueForUsage, Cache $cache, callable $getProjectDB, callable $getFunctionsDevice) => $this->action($message, $dbForConsole, $queueForEvents, $queueForFunctions, $queueForUsage, $cache, $getProjectDB, $getFunctionsDevice)); } /** @@ -62,12 +62,11 @@ class Builds extends Action * @param Usage $queueForUsage * @param Cache $cache * @param callable $getProjectDB - * @param callable $deviceFunctions + * @param callable $getFunctionsDevice * @return void * @throws \Utopia\Database\Exception - * @throws Exception */ - public function action(Message $message, Database $dbForConsole, Event $queueForEvents, Func $queueForFunctions, Usage $queueForUsage, Cache $cache, callable $getProjectDB, callable $deviceFunctions): void + public function action(Message $message, Database $dbForConsole, Event $queueForEvents, Func $queueForFunctions, Usage $queueForUsage, Cache $cache, callable $getProjectDB, callable $getFunctionsDevice): void { $payload = $message->getPayload() ?? []; @@ -86,7 +85,7 @@ class Builds extends Action case BUILD_TYPE_RETRY: Console::info('Creating build for deployment: ' . $deployment->getId()); $github = new GitHub($cache); - $this->buildDeployment($deviceFunctions, $queueForFunctions, $queueForEvents, $queueForUsage, $dbForConsole, $getProjectDB, $github, $project, $resource, $deployment, $template); + $this->buildDeployment($getFunctionsDevice, $queueForFunctions, $queueForEvents, $queueForUsage, $dbForConsole, $getProjectDB, $github, $project, $resource, $deployment, $template); break; default: @@ -95,7 +94,7 @@ class Builds extends Action } /** - * @param callable $deviceFunctions + * @param callable $getFunctionsDevice * @param Func $queueForFunctions * @param Event $queueForEvents * @param Usage $queueForUsage @@ -108,8 +107,9 @@ class Builds extends Action * @param Document $template * @return void * @throws \Utopia\Database\Exception + * @throws Exception */ - protected function buildDeployment(callable $deviceFunctions, Func $queueForFunctions, Event $queueForEvents, Usage $queueForUsage, Database $dbForConsole, callable $getProjectDB, GitHub $github, Document $project, Document $function, Document $deployment, Document $template): void + protected function buildDeployment(callable $getFunctionsDevice, Func $queueForFunctions, Event $queueForEvents, Usage $queueForUsage, Database $dbForConsole, callable $getProjectDB, GitHub $github, Document $project, Document $function, Document $deployment, Document $template): void { $executor = new Executor(App::getEnv('_APP_EXECUTOR_HOST')); @@ -290,7 +290,7 @@ class Builds extends Action Console::execute('tar --exclude code.tar.gz -czf ' . $tmpPathFile . ' -C /tmp/builds/' . \escapeshellcmd($buildId) . '/code' . (empty($rootDirectory) ? '' : '/' . $rootDirectory) . ' .', '', $stdout, $stderr); - $deviceFunctions = $deviceFunctions($project->getId()); + $deviceFunctions = $getFunctionsDevice($project->getId()); $localDevice = new Local(); $buffer = $localDevice->read($tmpPathFile); @@ -382,33 +382,30 @@ class Builds extends Action $command = \str_replace('"', '\\"', $command); $response = null; - $err = null; - // TODO: Remove run() wrapper when switching to new utopia queue. That should be done on Swoole adapter in the libary - Co\run(function () use ($executor, $project, $deployment, &$response, $source, $function, $runtime, $vars, $command, &$build, $dbForProject, $allEvents, &$err) { - Co::join([ - Co\go(function () use ($executor, &$response, $project, $deployment, $source, $function, $runtime, $vars, $command, &$err) { - try { - $version = $function->getAttribute('version', 'v2'); - $command = $version === 'v2' ? 'tar -zxf /tmp/code.tar.gz -C /usr/code && cd /usr/local/src/ && ./build.sh' : 'tar -zxf /tmp/code.tar.gz -C /mnt/code && helpers/build.sh "' . $command . '"'; + Co::join([ + Co\go(function () use ($executor, &$response, $project, $deployment, $source, $function, $runtime, $vars, $command, &$err) { + try { + $version = $function->getAttribute('version', 'v2'); + $command = $version === 'v2' ? 'tar -zxf /tmp/code.tar.gz -C /usr/code && cd /usr/local/src/ && ./build.sh' : 'tar -zxf /tmp/code.tar.gz -C /mnt/code && helpers/build.sh "' . $command . '"'; - $response = $executor->createRuntime( - deploymentId: $deployment->getId(), - projectId: $project->getId(), - source: $source, - image: $runtime['image'], - version: $version, - remove: true, - entrypoint: $deployment->getAttribute('entrypoint'), - destination: APP_STORAGE_BUILDS . "/app-{$project->getId()}", - variables: $vars, - command: $command - ); - } catch (Exception $error) { - $err = $error; - } - }), + $response = $executor->createRuntime( + deploymentId: $deployment->getId(), + projectId: $project->getId(), + source: $source, + image: $runtime['image'], + version: $version, + remove: true, + entrypoint: $deployment->getAttribute('entrypoint'), + destination: APP_STORAGE_BUILDS . "/app-{$project->getId()}", + variables: $vars, + command: $command + ); + } catch (Exception $error) { + $err = $error; + } + }), Co\go(function () use ($executor, $project, $deployment, &$response, &$build, $dbForProject, $allEvents, &$err) { try { $executor->getLogs( @@ -451,7 +448,6 @@ class Builds extends Action } }), ]); - }); if ($err) { throw $err; diff --git a/src/Appwrite/Platform/Workers/Deletes.php b/src/Appwrite/Platform/Workers/Deletes.php index 7ca1e8564d..e76dd29032 100644 --- a/src/Appwrite/Platform/Workers/Deletes.php +++ b/src/Appwrite/Platform/Workers/Deletes.php @@ -136,10 +136,6 @@ class Deletes extends Action case DELETE_TYPE_SESSIONS: $this->deleteExpiredSessions($dbForConsole, $getProjectDB); break; - case DELETE_TYPE_CERTIFICATES: - $document = new Document($this->args['document']); - $this->deleteCertificates($document); - break; case DELETE_TYPE_USAGE: $this->deleteUsageStats($dbForConsole, $getProjectDB, $hourlyUsageRetentionDatetime); break; @@ -419,15 +415,6 @@ class Deletes extends Action $projectId = $document->getId(); $projectInternalId = $document->getInternalId(); - // Delete project certificates - $domains = $dbForConsole->find('domains', [ - Query::equal('projectInternalId', [$projectInternalId]) - ]); - - foreach ($domains as $domain) { - $this->deleteCertificates($dbForConsole, $domain); - } - // Delete project tables $dbForProject = $getProjectDB($document); @@ -483,54 +470,6 @@ class Deletes extends Action $cache->delete($cache->getRoot(), true); } - /** - * @param Database $dbForConsole - * @param Document $document certificates document - * @return void - * @throws Exception - */ - protected function deleteCertificates(Database $dbForConsole, Document $document): void - { - // If domain has certificate generated - if (isset($document['certificateId'])) { - $domainUsingCertificate = $dbForConsole->findOne('domains', [ - Query::equal('certificateId', [$document['certificateId']]) - ]); - - if (!$domainUsingCertificate) { - $mainDomain = App::getEnv('_APP_DOMAIN_TARGET', ''); - if ($mainDomain === $document->getAttribute('domain')) { - $domainUsingCertificate = $mainDomain; - } - } - - // If certificate is still used by some domain, mark we can't delete. - // Current domain should not be found, because we only have copy. Original domain is already deleted from database. - if ($domainUsingCertificate) { - Console::warning("Skipping certificate deletion, because a domain is still using it."); - return; - } - } - - $domain = $document->getAttribute('domain'); - $directory = APP_STORAGE_CERTIFICATES . '/' . $domain; - $checkTraversal = realpath($directory) === $directory; - - if ($domain && $checkTraversal && is_dir($directory)) { - // Delete certificate document, so Appwrite is aware of change - if (isset($document['certificateId'])) { - $dbForConsole->deleteDocument('certificates', $document['certificateId']); - } - - // Delete files, so Traefik is aware of change - array_map('unlink', glob($directory . '/*.*')); - rmdir($directory); - Console::info("Deleted certificate files for {$domain}"); - } else { - Console::info("No certificate files found for {$domain}"); - } - } - /** * @param callable $getProjectDB * @param Document $document user document @@ -786,7 +725,7 @@ class Deletes extends Action * Request executor to delete all deployment containers */ Console::info("Requesting executor to delete all deployment containers for function " . $functionId); - $this->deleteRuntimes($document, $project); + $this->deleteRuntimes($getProjectDB, $document, $project); } /** @@ -909,7 +848,6 @@ class Deletes extends Action $count = 0; $chunk = 0; $limit = 50; - $results = []; $sum = $limit; $executionStart = \microtime(true); @@ -947,7 +885,6 @@ class Deletes extends Action $count = 0; $chunk = 0; $limit = 50; - $results = []; $sum = $limit; $executionStart = \microtime(true); diff --git a/src/Appwrite/Utopia/Response/Model/UsageBuckets.php b/src/Appwrite/Utopia/Response/Model/UsageBuckets.php index 8c6c81f234..83b8744760 100644 --- a/src/Appwrite/Utopia/Response/Model/UsageBuckets.php +++ b/src/Appwrite/Utopia/Response/Model/UsageBuckets.php @@ -16,7 +16,7 @@ class UsageBuckets extends Model 'default' => '', 'example' => '30d', ]) - ->addRule('filesCount', [ + ->addRule('filesTotal', [ 'type' => Response::MODEL_METRIC, 'description' => 'Aggregated stats for total number of files in this bucket.', 'default' => [], @@ -30,34 +30,6 @@ class UsageBuckets extends Model 'example' => [], 'array' => true ]) - ->addRule('filesCreate', [ - 'type' => Response::MODEL_METRIC, - 'description' => 'Aggregated stats for files created.', - 'default' => [], - 'example' => [], - 'array' => true - ]) - ->addRule('filesRead', [ - 'type' => Response::MODEL_METRIC, - 'description' => 'Aggregated stats for files read.', - 'default' => [], - 'example' => [], - 'array' => true - ]) - ->addRule('filesUpdate', [ - 'type' => Response::MODEL_METRIC, - 'description' => 'Aggregated stats for files updated.', - 'default' => [], - 'example' => [], - 'array' => true - ]) - ->addRule('filesDelete', [ - 'type' => Response::MODEL_METRIC, - 'description' => 'Aggregated stats for files deleted.', - 'default' => [], - 'example' => [], - 'array' => true - ]) ; } diff --git a/src/Appwrite/Utopia/Response/Model/UsageCollection.php b/src/Appwrite/Utopia/Response/Model/UsageCollection.php index 8b6966fcd2..5abcf46b7d 100644 --- a/src/Appwrite/Utopia/Response/Model/UsageCollection.php +++ b/src/Appwrite/Utopia/Response/Model/UsageCollection.php @@ -16,41 +16,13 @@ class UsageCollection extends Model 'default' => '', 'example' => '30d', ]) - ->addRule('documentsCount', [ + ->addRule('documentsTotal', [ 'type' => Response::MODEL_METRIC, 'description' => 'Aggregated stats for total number of documents.', 'default' => [], 'example' => [], 'array' => true ]) - ->addRule('documentsCreate', [ - 'type' => Response::MODEL_METRIC, - 'description' => 'Aggregated stats for documents created.', - 'default' => [], - 'example' => [], - 'array' => true - ]) - ->addRule('documentsRead', [ - 'type' => Response::MODEL_METRIC, - 'description' => 'Aggregated stats for documents read.', - 'default' => [], - 'example' => [], - 'array' => true - ]) - ->addRule('documentsUpdate', [ - 'type' => Response::MODEL_METRIC, - 'description' => 'Aggregated stats for documents updated.', - 'default' => [], - 'example' => [], - 'array' => true - ]) - ->addRule('documentsDelete', [ - 'type' => Response::MODEL_METRIC, - 'description' => 'Aggregated stats for documents deleted.', - 'default' => [], - 'example' => [], - 'array' => true - ]) ; } diff --git a/src/Appwrite/Utopia/Response/Model/UsageDatabase.php b/src/Appwrite/Utopia/Response/Model/UsageDatabase.php index 0c84d796ba..58d49c506e 100644 --- a/src/Appwrite/Utopia/Response/Model/UsageDatabase.php +++ b/src/Appwrite/Utopia/Response/Model/UsageDatabase.php @@ -16,72 +16,16 @@ class UsageDatabase extends Model 'default' => '', 'example' => '30d', ]) - ->addRule('documentsCount', [ - 'type' => Response::MODEL_METRIC, - 'description' => 'Aggregated stats for total number of documents.', - 'default' => [], - 'example' => [], - 'array' => true - ]) - ->addRule('collectionsCount', [ + ->addRule('collectionsTotal', [ 'type' => Response::MODEL_METRIC, 'description' => 'Aggregated stats for total number of collections.', 'default' => [], 'example' => [], 'array' => true ]) - ->addRule('documentsCreate', [ + ->addRule('documentsTotal', [ 'type' => Response::MODEL_METRIC, - 'description' => 'Aggregated stats for documents created.', - 'default' => [], - 'example' => [], - 'array' => true - ]) - ->addRule('documentsRead', [ - 'type' => Response::MODEL_METRIC, - 'description' => 'Aggregated stats for documents read.', - 'default' => [], - 'example' => [], - 'array' => true - ]) - ->addRule('documentsUpdate', [ - 'type' => Response::MODEL_METRIC, - 'description' => 'Aggregated stats for documents updated.', - 'default' => [], - 'example' => [], - 'array' => true - ]) - ->addRule('documentsDelete', [ - 'type' => Response::MODEL_METRIC, - 'description' => 'Aggregated stats for documents deleted.', - 'default' => [], - 'example' => [], - 'array' => true - ]) - ->addRule('collectionsCreate', [ - 'type' => Response::MODEL_METRIC, - 'description' => 'Aggregated stats for collections created.', - 'default' => [], - 'example' => [], - 'array' => true - ]) - ->addRule('collectionsRead', [ - 'type' => Response::MODEL_METRIC, - 'description' => 'Aggregated stats for collections read.', - 'default' => [], - 'example' => [], - 'array' => true - ]) - ->addRule('collectionsUpdate', [ - 'type' => Response::MODEL_METRIC, - 'description' => 'Aggregated stats for collections updated.', - 'default' => [], - 'example' => [], - 'array' => true - ]) - ->addRule('collectionsDelete', [ - 'type' => Response::MODEL_METRIC, - 'description' => 'Aggregated stats for collections delete.', + 'description' => 'Aggregated stats for total number of documents.', 'default' => [], 'example' => [], 'array' => true diff --git a/src/Appwrite/Utopia/Response/Model/UsageDatabases.php b/src/Appwrite/Utopia/Response/Model/UsageDatabases.php index 93488a47db..a6008ca9e6 100644 --- a/src/Appwrite/Utopia/Response/Model/UsageDatabases.php +++ b/src/Appwrite/Utopia/Response/Model/UsageDatabases.php @@ -16,111 +16,27 @@ class UsageDatabases extends Model 'default' => '', 'example' => '30d', ]) - ->addRule('databasesCount', [ + ->addRule('databasesTotal', [ 'type' => Response::MODEL_METRIC, 'description' => 'Aggregated stats for total number of documents.', 'default' => [], 'example' => [], 'array' => true ]) - ->addRule('documentsCount', [ + ->addRule('collectionsTotal', [ + 'type' => Response::MODEL_METRIC, + 'description' => 'Aggregated stats for total number of collections.', + 'default' => [], + 'example' => [], + 'array' => true + ]) + ->addRule('documentsTotal', [ 'type' => Response::MODEL_METRIC, 'description' => 'Aggregated stats for total number of documents.', 'default' => [], 'example' => [], 'array' => true ]) - ->addRule('collectionsCount', [ - 'type' => Response::MODEL_METRIC, - 'description' => 'Aggregated stats for total number of collections.', - 'default' => [], - 'example' => [], - 'array' => true - ]) - ->addRule('databasesCreate', [ - 'type' => Response::MODEL_METRIC, - 'description' => 'Aggregated stats for documents created.', - 'default' => [], - 'example' => [], - 'array' => true - ]) - ->addRule('databasesRead', [ - 'type' => Response::MODEL_METRIC, - 'description' => 'Aggregated stats for documents read.', - 'default' => [], - 'example' => [], - 'array' => true - ]) - ->addRule('databasesUpdate', [ - 'type' => Response::MODEL_METRIC, - 'description' => 'Aggregated stats for documents updated.', - 'default' => [], - 'example' => [], - 'array' => true - ]) - ->addRule('databasesDelete', [ - 'type' => Response::MODEL_METRIC, - 'description' => 'Aggregated stats for total number of collections.', - 'default' => [], - 'example' => [], - 'array' => true - ]) - ->addRule('documentsCreate', [ - 'type' => Response::MODEL_METRIC, - 'description' => 'Aggregated stats for documents created.', - 'default' => [], - 'example' => [], - 'array' => true - ]) - ->addRule('documentsRead', [ - 'type' => Response::MODEL_METRIC, - 'description' => 'Aggregated stats for documents read.', - 'default' => [], - 'example' => [], - 'array' => true - ]) - ->addRule('documentsUpdate', [ - 'type' => Response::MODEL_METRIC, - 'description' => 'Aggregated stats for documents updated.', - 'default' => [], - 'example' => [], - 'array' => true - ]) - ->addRule('documentsDelete', [ - 'type' => Response::MODEL_METRIC, - 'description' => 'Aggregated stats for documents deleted.', - 'default' => [], - 'example' => [], - 'array' => true - ]) - ->addRule('collectionsCreate', [ - 'type' => Response::MODEL_METRIC, - 'description' => 'Aggregated stats for collections created.', - 'default' => [], - 'example' => [], - 'array' => true - ]) - ->addRule('collectionsRead', [ - 'type' => Response::MODEL_METRIC, - 'description' => 'Aggregated stats for collections read.', - 'default' => [], - 'example' => [], - 'array' => true - ]) - ->addRule('collectionsUpdate', [ - 'type' => Response::MODEL_METRIC, - 'description' => 'Aggregated stats for collections updated.', - 'default' => [], - 'example' => [], - 'array' => true - ]) - ->addRule('collectionsDelete', [ - 'type' => Response::MODEL_METRIC, - 'description' => 'Aggregated stats for collections delete.', - 'default' => [], - 'example' => [], - 'array' => true - ]) ; } diff --git a/src/Appwrite/Utopia/Response/Model/UsageFunction.php b/src/Appwrite/Utopia/Response/Model/UsageFunction.php index 58d76bbf41..03acaa750a 100644 --- a/src/Appwrite/Utopia/Response/Model/UsageFunction.php +++ b/src/Appwrite/Utopia/Response/Model/UsageFunction.php @@ -16,30 +16,16 @@ class UsageFunction extends Model 'default' => '', 'example' => '30d', ]) - ->addRule('executionsTotal', [ + ->addRule('deploymentsTotal', [ 'type' => Response::MODEL_METRIC, - 'description' => 'Aggregated stats for number of function executions.', + 'description' => 'Aggregated stats for number of function deployments.', 'default' => [], 'example' => [], 'array' => true ]) - ->addRule('executionsFailure', [ + ->addRule('deploymentsStorage', [ 'type' => Response::MODEL_METRIC, - 'description' => 'Aggregated stats for function execution failures.', - 'default' => [], - 'example' => [], - 'array' => true - ]) - ->addRule('executionsSuccess', [ - 'type' => Response::MODEL_METRIC, - 'description' => 'Aggregated stats for function execution successes.', - 'default' => [], - 'example' => [], - 'array' => true - ]) - ->addRule('executionsTime', [ - 'type' => Response::MODEL_METRIC, - 'description' => 'Aggregated stats for function execution duration.', + 'description' => 'Aggregated stats for function deployments storage.', 'default' => [], 'example' => [], 'array' => true @@ -51,23 +37,31 @@ class UsageFunction extends Model 'example' => [], 'array' => true ]) - ->addRule('buildsFailure', [ + ->addRule('buildsStorage', [ 'type' => Response::MODEL_METRIC, - 'description' => 'Aggregated stats for function build failures.', - 'default' => [], - 'example' => [], - 'array' => true - ]) - ->addRule('buildsSuccess', [ - 'type' => Response::MODEL_METRIC, - 'description' => 'Aggregated stats for function build successes.', + 'description' => 'Aggregated stats for builds storage.', 'default' => [], 'example' => [], 'array' => true ]) ->addRule('buildsTime', [ 'type' => Response::MODEL_METRIC, - 'description' => 'Aggregated stats for function build duration.', + 'description' => 'Aggregated stats for function build compute.', + 'default' => [], + 'example' => [], + 'array' => true + ]) + ->addRule('executionsTotal', [ + 'type' => Response::MODEL_METRIC, + 'description' => 'Aggregated stats for number of function executions.', + 'default' => [], + 'example' => [], + 'array' => true + ]) + + ->addRule('executionsTime', [ + 'type' => Response::MODEL_METRIC, + 'description' => 'Aggregated stats for function execution compute.', 'default' => [], 'example' => [], 'array' => true diff --git a/src/Appwrite/Utopia/Response/Model/UsageFunctions.php b/src/Appwrite/Utopia/Response/Model/UsageFunctions.php index 7adb0d4aa3..6ab36e21ac 100644 --- a/src/Appwrite/Utopia/Response/Model/UsageFunctions.php +++ b/src/Appwrite/Utopia/Response/Model/UsageFunctions.php @@ -16,30 +16,23 @@ class UsageFunctions extends Model 'default' => '', 'example' => '30d', ]) - ->addRule('executionsTotal', [ + ->addRule('functionsTotal', [ 'type' => Response::MODEL_METRIC, - 'description' => 'Aggregated stats for number of function executions.', + 'description' => 'Aggregated stats for number of functions.', 'default' => [], 'example' => [], 'array' => true ]) - ->addRule('executionsFailure', [ + ->addRule('deploymentsTotal', [ 'type' => Response::MODEL_METRIC, - 'description' => 'Aggregated stats for function execution failures.', + 'description' => 'Aggregated stats for number of function deployments.', 'default' => [], 'example' => [], 'array' => true ]) - ->addRule('executionsSuccess', [ + ->addRule('deploymentsStorage', [ 'type' => Response::MODEL_METRIC, - 'description' => 'Aggregated stats for function execution successes.', - 'default' => [], - 'example' => [], - 'array' => true - ]) - ->addRule('executionsTime', [ - 'type' => Response::MODEL_METRIC, - 'description' => 'Aggregated stats for function execution duration.', + 'description' => 'Aggregated stats for function deployments storage.', 'default' => [], 'example' => [], 'array' => true @@ -51,23 +44,31 @@ class UsageFunctions extends Model 'example' => [], 'array' => true ]) - ->addRule('buildsFailure', [ + ->addRule('buildsStorage', [ 'type' => Response::MODEL_METRIC, - 'description' => 'Aggregated stats for function build failures.', - 'default' => [], - 'example' => [], - 'array' => true - ]) - ->addRule('buildsSuccess', [ - 'type' => Response::MODEL_METRIC, - 'description' => 'Aggregated stats for function build successes.', + 'description' => 'Aggregated stats for builds storage.', 'default' => [], 'example' => [], 'array' => true ]) ->addRule('buildsTime', [ 'type' => Response::MODEL_METRIC, - 'description' => 'Aggregated stats for function build duration.', + 'description' => 'Aggregated stats for function build compute.', + 'default' => [], + 'example' => [], + 'array' => true + ]) + ->addRule('executionsTotal', [ + 'type' => Response::MODEL_METRIC, + 'description' => 'Aggregated stats for number of function executions.', + 'default' => [], + 'example' => [], + 'array' => true + ]) + + ->addRule('executionsTime', [ + 'type' => Response::MODEL_METRIC, + 'description' => 'Aggregated stats for function execution compute.', 'default' => [], 'example' => [], 'array' => true diff --git a/src/Appwrite/Utopia/Response/Model/UsageProject.php b/src/Appwrite/Utopia/Response/Model/UsageProject.php index e37bc5928d..641613809a 100644 --- a/src/Appwrite/Utopia/Response/Model/UsageProject.php +++ b/src/Appwrite/Utopia/Response/Model/UsageProject.php @@ -16,7 +16,7 @@ class UsageProject extends Model 'default' => '', 'example' => '30d', ]) - ->addRule('requests', [ + ->addRule('requestsTotal', [ 'type' => Response::MODEL_METRIC, 'description' => 'Aggregated stats for number of requests.', 'default' => [], @@ -30,42 +30,42 @@ class UsageProject extends Model 'example' => [], 'array' => true ]) - ->addRule('executions', [ + ->addRule('executionsTotal', [ 'type' => Response::MODEL_METRIC, 'description' => 'Aggregated stats for function executions.', 'default' => [], 'example' => [], 'array' => true ]) - ->addRule('documents', [ + ->addRule('documentsTotal', [ 'type' => Response::MODEL_METRIC, 'description' => 'Aggregated stats for number of documents.', 'default' => [], 'example' => [], 'array' => true ]) - ->addRule('databases', [ + ->addRule('databasesTotal', [ 'type' => Response::MODEL_METRIC, 'description' => 'Aggregated stats for number of databases.', 'default' => [], 'example' => [], 'array' => true ]) - ->addRule('users', [ + ->addRule('usersTotal', [ 'type' => Response::MODEL_METRIC, 'description' => 'Aggregated stats for number of users.', 'default' => [], 'example' => [], 'array' => true ]) - ->addRule('storage', [ + ->addRule('filesStorage', [ 'type' => Response::MODEL_METRIC, 'description' => 'Aggregated stats for the occupied storage size (in bytes).', 'default' => [], 'example' => [], 'array' => true ]) - ->addRule('buckets', [ + ->addRule('bucketsTotal', [ 'type' => Response::MODEL_METRIC, 'description' => 'Aggregated stats for number of buckets.', 'default' => [], diff --git a/src/Appwrite/Utopia/Response/Model/UsageStorage.php b/src/Appwrite/Utopia/Response/Model/UsageStorage.php index 7e3c08e12a..88d0beca01 100644 --- a/src/Appwrite/Utopia/Response/Model/UsageStorage.php +++ b/src/Appwrite/Utopia/Response/Model/UsageStorage.php @@ -16,79 +16,23 @@ class UsageStorage extends Model 'default' => '', 'example' => '30d', ]) - ->addRule('storage', [ - 'type' => Response::MODEL_METRIC, - 'description' => 'Aggregated stats for the occupied storage size (in bytes).', - 'default' => [], - 'example' => [], - 'array' => true - ]) - ->addRule('filesCount', [ - 'type' => Response::MODEL_METRIC, - 'description' => 'Aggregated stats for total number of files.', - 'default' => [], - 'example' => [], - 'array' => true - ]) - ->addRule('bucketsCount', [ + ->addRule('bucketsTotal', [ 'type' => Response::MODEL_METRIC, 'description' => 'Aggregated stats for total number of buckets.', 'default' => [], 'example' => [], 'array' => true ]) - ->addRule('bucketsCreate', [ + ->addRule('filesTotal', [ 'type' => Response::MODEL_METRIC, - 'description' => 'Aggregated stats for buckets created.', + 'description' => 'Aggregated stats for total number of files.', 'default' => [], 'example' => [], 'array' => true ]) - ->addRule('bucketsRead', [ + ->addRule('filesStorage', [ 'type' => Response::MODEL_METRIC, - 'description' => 'Aggregated stats for buckets read.', - 'default' => [], - 'example' => [], - 'array' => true - ]) - ->addRule('bucketsUpdate', [ - 'type' => Response::MODEL_METRIC, - 'description' => 'Aggregated stats for buckets updated.', - 'default' => [], - 'example' => [], - 'array' => true - ]) - ->addRule('bucketsDelete', [ - 'type' => Response::MODEL_METRIC, - 'description' => 'Aggregated stats for buckets deleted.', - 'default' => [], - 'example' => [], - 'array' => true - ]) - ->addRule('filesCreate', [ - 'type' => Response::MODEL_METRIC, - 'description' => 'Aggregated stats for files created.', - 'default' => [], - 'example' => [], - 'array' => true - ]) - ->addRule('filesRead', [ - 'type' => Response::MODEL_METRIC, - 'description' => 'Aggregated stats for files read.', - 'default' => [], - 'example' => [], - 'array' => true - ]) - ->addRule('filesUpdate', [ - 'type' => Response::MODEL_METRIC, - 'description' => 'Aggregated stats for files updated.', - 'default' => [], - 'example' => [], - 'array' => true - ]) - ->addRule('filesDelete', [ - 'type' => Response::MODEL_METRIC, - 'description' => 'Aggregated stats for files deleted.', + 'description' => 'Aggregated stats for the occupied storage size (in bytes).', 'default' => [], 'example' => [], 'array' => true diff --git a/src/Appwrite/Utopia/Response/Model/UsageUsers.php b/src/Appwrite/Utopia/Response/Model/UsageUsers.php index 4c7b37d50f..c0cc4baa54 100644 --- a/src/Appwrite/Utopia/Response/Model/UsageUsers.php +++ b/src/Appwrite/Utopia/Response/Model/UsageUsers.php @@ -16,62 +16,21 @@ class UsageUsers extends Model 'default' => '', 'example' => '30d', ]) - ->addRule('usersCount', [ + ->addRule('usersTotal', [ 'type' => Response::MODEL_METRIC, 'description' => 'Aggregated stats for total number of users.', 'default' => [], 'example' => [], 'array' => true ]) - ->addRule('usersCreate', [ - 'type' => Response::MODEL_METRIC, - 'description' => 'Aggregated stats for users created.', - 'default' => [], - 'example' => [], - 'array' => true - ]) - ->addRule('usersRead', [ - 'type' => Response::MODEL_METRIC, - 'description' => 'Aggregated stats for users read.', - 'default' => [], - 'example' => [], - 'array' => true - ]) - ->addRule('usersUpdate', [ - 'type' => Response::MODEL_METRIC, - 'description' => 'Aggregated stats for users updated.', - 'default' => [], - 'example' => [], - 'array' => true - ]) - ->addRule('usersDelete', [ - 'type' => Response::MODEL_METRIC, - 'description' => 'Aggregated stats for users deleted.', - 'default' => [], - 'example' => [], - 'array' => true - ]) - ->addRule('sessionsCreate', [ + + ->addRule('sessionsTotal', [ 'type' => Response::MODEL_METRIC, 'description' => 'Aggregated stats for sessions created.', 'default' => [], 'example' => [], 'array' => true ]) - ->addRule('sessionsProviderCreate', [ - 'type' => Response::MODEL_METRIC, - 'description' => 'Aggregated stats for sessions created for a provider ( email, anonymous or oauth2 ).', - 'default' => [], - 'example' => [], - 'array' => true - ]) - ->addRule('sessionsDelete', [ - 'type' => Response::MODEL_METRIC, - 'description' => 'Aggregated stats for sessions deleted.', - 'default' => [], - 'example' => [], - 'array' => true - ]) ; }