From cb369dd326564e65d0359e70fd28993632057b2d Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Wed, 10 Aug 2022 08:45:10 +0000 Subject: [PATCH] update account routes usage labels --- app/controllers/api/account.php | 165 +++++++++++--------------------- app/controllers/shared/api.php | 3 + src/Appwrite/Usage/Stats.php | 1 + 3 files changed, 59 insertions(+), 110 deletions(-) diff --git a/app/controllers/api/account.php b/app/controllers/api/account.php index 04ce515296..834d91d887 100644 --- a/app/controllers/api/account.php +++ b/app/controllers/api/account.php @@ -48,6 +48,7 @@ App::post('/v1/account') ->label('scope', 'public') ->label('auth.type', 'emailPassword') ->label('audits.resource', 'user/{response.$id}') + ->label('usage.metric', 'users.{scope}.requests.create') ->label('sdk.auth', []) ->label('sdk.namespace', 'account') ->label('sdk.method', 'create') @@ -64,9 +65,8 @@ App::post('/v1/account') ->inject('response') ->inject('project') ->inject('dbForProject') - ->inject('usage') ->inject('events') - ->action(function (string $userId, string $email, string $password, string $name, Request $request, Response $response, Document $project, Database $dbForProject, Stats $usage, Event $events) { + ->action(function (string $userId, string $email, string $password, string $name, Request $request, Response $response, Document $project, Database $dbForProject, Event $events) { $email = \strtolower($email); if ('console' === $project->getId()) { @@ -120,7 +120,6 @@ App::post('/v1/account') Authorization::setRole('user:' . $user->getId()); Authorization::setRole('role:' . Auth::USER_ROLE_MEMBER); - $usage->setParam('users.create', 1); $events->setParam('userId', $user->getId()); $response->setStatusCode(Response::STATUS_CODE_CREATED); @@ -134,6 +133,8 @@ App::post('/v1/account/sessions/email') ->label('event', 'users.[userId].sessions.[sessionId].create') ->label('scope', 'public') ->label('auth.type', 'emailPassword') + ->label('usage.metric', 'sessions.{scope}.requests.create') + ->label('usage.params', ['provider' => 'value.email']) ->label('sdk.auth', []) ->label('sdk.namespace', 'account') ->label('sdk.method', 'createEmailSession') @@ -151,9 +152,8 @@ App::post('/v1/account/sessions/email') ->inject('locale') ->inject('geodb') ->inject('audits') - ->inject('usage') ->inject('events') - ->action(function (string $email, string $password, Request $request, Response $response, Database $dbForProject, Locale $locale, Reader $geodb, Audit $audits, Stats $usage, Event $events) { + ->action(function (string $email, string $password, Request $request, Response $response, Database $dbForProject, Locale $locale, Reader $geodb, Audit $audits, Event $events) { $email = \strtolower($email); $protocol = $request->getProtocol(); @@ -223,12 +223,6 @@ App::post('/v1/account/sessions/email') ->setAttribute('countryName', $countryName) ; - $usage - ->setParam('users.update', 1) - ->setParam('users.sessions.create', 1) - ->setParam('provider', 'email') - ; - $events ->setParam('userId', $profile->getId()) ->setParam('sessionId', $session->getId()) @@ -355,6 +349,8 @@ App::get('/v1/account/sessions/oauth2/:provider/redirect') ->label('abuse-key', 'ip:{ip}') ->label('docs', false) ->label('audits.resource', 'user/{response.$id}') + ->label('usage.metric', 'sessions.{scope}.requests.create') + ->label('usage.params', ['provider' => 'request.provider']) ->param('provider', '', new WhiteList(\array_keys(Config::getParam('providers')), true), 'OAuth2 provider.') ->param('code', '', new Text(2048), 'OAuth2 code.') ->param('state', '', new Text(2048), 'OAuth2 state params.', true) @@ -365,8 +361,7 @@ App::get('/v1/account/sessions/oauth2/:provider/redirect') ->inject('dbForProject') ->inject('geodb') ->inject('events') - ->inject('usage') - ->action(function (string $provider, string $code, string $state, Request $request, Response $response, Document $project, Document $user, Database $dbForProject, Reader $geodb, Event $events, Stats $usage) use ($oauthDefaultSuccess) { + ->action(function (string $provider, string $code, string $state, Request $request, Response $response, Document $project, Document $user, Database $dbForProject, Reader $geodb, Event $events) use ($oauthDefaultSuccess) { $protocol = $request->getProtocol(); $callback = $protocol . '://' . $request->getHostname() . '/v1/account/sessions/oauth2/callback/' . $provider . '/' . $project->getId(); @@ -543,12 +538,6 @@ App::get('/v1/account/sessions/oauth2/:provider/redirect') $dbForProject->deleteCachedDocument('users', $user->getId()); - $usage - ->setParam('users.sessions.create', 1) - ->setParam('projectId', $project->getId()) - ->setParam('provider', 'oauth2-' . $provider) - ; - $events ->setParam('userId', $user->getId()) ->setParam('sessionId', $session->getId()) @@ -711,6 +700,8 @@ App::put('/v1/account/sessions/magic-url') ->label('scope', 'public') ->label('event', 'users.[userId].sessions.[sessionId].create') ->label('audits.resource', 'user/{response.$id}') + ->label('usage.metric', 'sessions.{scope}.requests.create') + ->label('usage.params', ['provider' => 'value.magic-url']) ->label('sdk.auth', []) ->label('sdk.namespace', 'account') ->label('sdk.method', 'updateMagicURLSession') @@ -936,6 +927,8 @@ App::put('/v1/account/sessions/phone') ->label('scope', 'public') ->label('event', 'users.[userId].sessions.[sessionId].create') ->label('audits.resource', 'user/{response.$id}') + ->label('usage.metric', 'sessions.{scope}.requests.create') + ->label('usage.params', ['provider' => 'value.phone']) ->label('sdk.auth', []) ->label('sdk.namespace', 'account') ->label('sdk.method', 'updatePhoneSession') @@ -1045,6 +1038,8 @@ App::post('/v1/account/sessions/anonymous') ->label('scope', 'public') ->label('auth.type', 'anonymous') ->label('audits.resource', 'user/{response.$id}') + ->label('usage.metric', 'sessions.{scope}.requests.create') + ->label('usage.params', ['provider' => 'value.anonymous']) ->label('sdk.auth', []) ->label('sdk.namespace', 'account') ->label('sdk.method', 'createAnonymousSession') @@ -1061,9 +1056,8 @@ App::post('/v1/account/sessions/anonymous') ->inject('project') ->inject('dbForProject') ->inject('geodb') - ->inject('usage') ->inject('events') - ->action(function (Request $request, Response $response, Locale $locale, Document $user, Document $project, Database $dbForProject, Reader $geodb, Stats $usage, Event $events) { + ->action(function (Request $request, Response $response, Locale $locale, Document $user, Document $project, Database $dbForProject, Reader $geodb, Event $events) { $protocol = $request->getProtocol(); @@ -1136,11 +1130,6 @@ App::post('/v1/account/sessions/anonymous') $dbForProject->deleteCachedDocument('users', $user->getId()); - $usage - ->setParam('users.sessions.create', 1) - ->setParam('provider', 'anonymous') - ; - $events ->setParam('userId', $user->getId()) ->setParam('sessionId', $session->getId()) @@ -1216,6 +1205,7 @@ App::get('/v1/account') ->desc('Get Account') ->groups(['api', 'account']) ->label('scope', 'account') + ->label('usage.metric', 'users.{scope}.requests.read') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_JWT]) ->label('sdk.namespace', 'account') ->label('sdk.method', 'get') @@ -1225,10 +1215,7 @@ App::get('/v1/account') ->label('sdk.response.model', Response::MODEL_USER) ->inject('response') ->inject('user') - ->inject('usage') - ->action(function (Response $response, Document $user, Stats $usage) { - - $usage->setParam('users.read', 1); + ->action(function (Response $response, Document $user) { $response->dynamic($user, Response::MODEL_USER); }); @@ -1237,6 +1224,7 @@ App::get('/v1/account/prefs') ->desc('Get Account Preferences') ->groups(['api', 'account']) ->label('scope', 'account') + ->label('usage.metric', 'users.{scope}.requests.read') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_JWT]) ->label('sdk.namespace', 'account') ->label('sdk.method', 'getPrefs') @@ -1246,13 +1234,10 @@ App::get('/v1/account/prefs') ->label('sdk.response.model', Response::MODEL_PREFERENCES) ->inject('response') ->inject('user') - ->inject('usage') - ->action(function (Response $response, Document $user, Stats $usage) { + ->action(function (Response $response, Document $user) { $prefs = $user->getAttribute('prefs', new \stdClass()); - $usage->setParam('users.read', 1); - $response->dynamic(new Document($prefs), Response::MODEL_PREFERENCES); }); @@ -1260,6 +1245,7 @@ App::get('/v1/account/sessions') ->desc('Get Account Sessions') ->groups(['api', 'account']) ->label('scope', 'account') + ->label('usage.metric', 'users.{scope}.requests.read') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_JWT]) ->label('sdk.namespace', 'account') ->label('sdk.method', 'getSessions') @@ -1270,8 +1256,7 @@ App::get('/v1/account/sessions') ->inject('response') ->inject('user') ->inject('locale') - ->inject('usage') - ->action(function (Response $response, Document $user, Locale $locale, Stats $usage) { + ->action(function (Response $response, Document $user, Locale $locale) { $sessions = $user->getAttribute('sessions', []); $current = Auth::sessionVerify($sessions, Auth::$secret); @@ -1285,8 +1270,6 @@ App::get('/v1/account/sessions') $sessions[$key] = $session; } - $usage->setParam('users.read', 1); - $response->dynamic(new Document([ 'sessions' => $sessions, 'total' => count($sessions), @@ -1297,6 +1280,7 @@ App::get('/v1/account/logs') ->desc('Get Account Logs') ->groups(['api', 'account']) ->label('scope', 'account') + ->label('usage.metric', 'users.{scope}.requests.read') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_JWT]) ->label('sdk.namespace', 'account') ->label('sdk.method', 'getLogs') @@ -1311,8 +1295,7 @@ App::get('/v1/account/logs') ->inject('locale') ->inject('geodb') ->inject('dbForProject') - ->inject('usage') - ->action(function (int $limit, int $offset, Response $response, Document $user, Locale $locale, Reader $geodb, Database $dbForProject, Stats $usage) { + ->action(function (int $limit, int $offset, Response $response, Document $user, Locale $locale, Reader $geodb, Database $dbForProject) { $audit = new EventAudit($dbForProject); @@ -1344,8 +1327,6 @@ App::get('/v1/account/logs') } } - $usage->setParam('users.read', 1); - $response->dynamic(new Document([ 'total' => $audit->countLogsByUser($user->getId()), 'logs' => $output, @@ -1356,6 +1337,7 @@ App::get('/v1/account/sessions/:sessionId') ->desc('Get Session By ID') ->groups(['api', 'account']) ->label('scope', 'account') + ->label('usage.metric', 'users.{scope}.requests.read') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_JWT]) ->label('sdk.namespace', 'account') ->label('sdk.method', 'getSession') @@ -1368,8 +1350,7 @@ App::get('/v1/account/sessions/:sessionId') ->inject('user') ->inject('locale') ->inject('dbForProject') - ->inject('usage') - ->action(function (?string $sessionId, Response $response, Document $user, Locale $locale, Database $dbForProject, Stats $usage) { + ->action(function (?string $sessionId, Response $response, Document $user, Locale $locale, Database $dbForProject) { $sessions = $user->getAttribute('sessions', []); $sessionId = ($sessionId === 'current') @@ -1385,8 +1366,6 @@ App::get('/v1/account/sessions/:sessionId') ->setAttribute('countryName', $countryName) ; - $usage->setParam('users.read', 1); - return $response->dynamic($session, Response::MODEL_SESSION); } } @@ -1400,6 +1379,7 @@ App::patch('/v1/account/name') ->label('event', 'users.[userId].update.name') ->label('scope', 'account') ->label('audits.resource', 'user/{response.$id}') + ->label('usage.metric', 'users.{scope}.requests.update') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_JWT]) ->label('sdk.namespace', 'account') ->label('sdk.method', 'updateName') @@ -1411,15 +1391,13 @@ App::patch('/v1/account/name') ->inject('response') ->inject('user') ->inject('dbForProject') - ->inject('usage') ->inject('events') - ->action(function (string $name, Response $response, Document $user, Database $dbForProject, Stats $usage, Event $events) { + ->action(function (string $name, Response $response, Document $user, Database $dbForProject, Event $events) { $user = $dbForProject->updateDocument('users', $user->getId(), $user ->setAttribute('name', $name) ->setAttribute('search', implode(' ', [$user->getId(), $name, $user->getAttribute('email')]))); - $usage->setParam('users.update', 1); $events->setParam('userId', $user->getId()); $response->dynamic($user, Response::MODEL_USER); @@ -1431,6 +1409,7 @@ App::patch('/v1/account/password') ->label('event', 'users.[userId].update.password') ->label('scope', 'account') ->label('audits.resource', 'user/{response.$id}') + ->label('usage.metric', 'users.{scope}.requests.update') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_JWT]) ->label('sdk.namespace', 'account') ->label('sdk.method', 'updatePassword') @@ -1443,9 +1422,8 @@ App::patch('/v1/account/password') ->inject('response') ->inject('user') ->inject('dbForProject') - ->inject('usage') ->inject('events') - ->action(function (string $password, string $oldPassword, Response $response, Document $user, Database $dbForProject, Stats $usage, Event $events) { + ->action(function (string $password, string $oldPassword, Response $response, Document $user, Database $dbForProject, Event $events) { // Check old password only if its an existing user. if ($user->getAttribute('passwordUpdate') !== 0 && !Auth::passwordVerify($oldPassword, $user->getAttribute('password'))) { // Double check user password @@ -1460,7 +1438,6 @@ App::patch('/v1/account/password') ->setAttribute('passwordUpdate', \time()) ); - $usage->setParam('users.update', 1); $events->setParam('userId', $user->getId()); $response->dynamic($user, Response::MODEL_USER); @@ -1472,6 +1449,7 @@ App::patch('/v1/account/email') ->label('event', 'users.[userId].update.email') ->label('scope', 'account') ->label('audits.resource', 'user/{response.$id}') + ->label('usage.metric', 'users.{scope}.requests.update') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_JWT]) ->label('sdk.namespace', 'account') ->label('sdk.method', 'updateEmail') @@ -1484,9 +1462,8 @@ App::patch('/v1/account/email') ->inject('response') ->inject('user') ->inject('dbForProject') - ->inject('usage') ->inject('events') - ->action(function (string $email, string $password, Response $response, Document $user, Database $dbForProject, Stats $usage, Event $events) { + ->action(function (string $email, string $password, Response $response, Document $user, Database $dbForProject, Event $events) { $isAnonymousUser = Auth::isAnonymousUser($user); // Check if request is from an anonymous account for converting @@ -1511,7 +1488,6 @@ App::patch('/v1/account/email') throw new Exception('Email already exists', 409, Exception::USER_EMAIL_ALREADY_EXISTS); } - $usage->setParam('users.update', 1); $events->setParam('userId', $user->getId()); $response->dynamic($user, Response::MODEL_USER); @@ -1523,6 +1499,7 @@ App::patch('/v1/account/phone') ->label('event', 'users.[userId].update.phone') ->label('scope', 'account') ->label('audits.resource', 'user/{response.$id}') + ->label('usage.metric', 'users.{scope}.requests.update') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_JWT]) ->label('sdk.namespace', 'account') ->label('sdk.method', 'updatePhone') @@ -1535,9 +1512,8 @@ App::patch('/v1/account/phone') ->inject('response') ->inject('user') ->inject('dbForProject') - ->inject('usage') ->inject('events') - ->action(function (string $phone, string $password, Response $response, Document $user, Database $dbForProject, Stats $usage, Event $events) { + ->action(function (string $phone, string $password, Response $response, Document $user, Database $dbForProject, Event $events) { $isAnonymousUser = Auth::isAnonymousUser($user); // Check if request is from an anonymous account for converting @@ -1559,7 +1535,6 @@ App::patch('/v1/account/phone') throw new Exception('Phone number already exists', 409, Exception::USER_PHONE_ALREADY_EXISTS); } - $usage->setParam('users.update', 1); $events->setParam('userId', $user->getId()); $response->dynamic($user, Response::MODEL_USER); @@ -1571,6 +1546,7 @@ App::patch('/v1/account/prefs') ->label('event', 'users.[userId].update.prefs') ->label('scope', 'account') ->label('audits.resource', 'user/{response.$id}') + ->label('usage.metric', 'users.{scope}.requests.update') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_JWT]) ->label('sdk.namespace', 'account') ->label('sdk.method', 'updatePrefs') @@ -1582,13 +1558,11 @@ App::patch('/v1/account/prefs') ->inject('response') ->inject('user') ->inject('dbForProject') - ->inject('usage') ->inject('events') - ->action(function (array $prefs, Response $response, Document $user, Database $dbForProject, Stats $usage, Event $events) { + ->action(function (array $prefs, Response $response, Document $user, Database $dbForProject, Event $events) { $user = $dbForProject->updateDocument('users', $user->getId(), $user->setAttribute('prefs', $prefs)); - $usage->setParam('users.update', 1); $events->setParam('userId', $user->getId()); $response->dynamic($user, Response::MODEL_USER); @@ -1600,6 +1574,7 @@ App::patch('/v1/account/status') ->label('event', 'users.[userId].update.status') ->label('scope', 'account') ->label('audits.resource', 'user/{response.$id}') + ->label('usage.metric', 'users.{scope}.requests.delete') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_JWT]) ->label('sdk.namespace', 'account') ->label('sdk.method', 'updateStatus') @@ -1612,8 +1587,7 @@ App::patch('/v1/account/status') ->inject('user') ->inject('dbForProject') ->inject('events') - ->inject('usage') - ->action(function (Request $request, Response $response, Document $user, Database $dbForProject, Event $events, Stats $usage) { + ->action(function (Request $request, Response $response, Document $user, Database $dbForProject, Event $events) { $user = $dbForProject->updateDocument('users', $user->getId(), $user->setAttribute('status', false)); @@ -1625,8 +1599,6 @@ App::patch('/v1/account/status') $response->addHeader('X-Fallback-Cookies', \json_encode([])); } - $usage->setParam('users.delete', 1); - $response->dynamic($user, Response::MODEL_USER); }); @@ -1635,6 +1607,7 @@ App::delete('/v1/account/sessions/:sessionId') ->groups(['api', 'account']) ->label('scope', 'account') ->label('event', 'users.[userId].sessions.[sessionId].delete') + ->label('usage.metric', 'sessions.{scope}.requests.delete') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_JWT]) ->label('sdk.namespace', 'account') ->label('sdk.method', 'deleteSession') @@ -1650,8 +1623,7 @@ App::delete('/v1/account/sessions/:sessionId') ->inject('locale') ->inject('audits') ->inject('events') - ->inject('usage') - ->action(function (?string $sessionId, Request $request, Response $response, Document $user, Database $dbForProject, Locale $locale, Audit $audits, Event $events, Stats $usage) { + ->action(function (?string $sessionId, Request $request, Response $response, Document $user, Database $dbForProject, Locale $locale, Audit $audits, Event $events) { $protocol = $request->getProtocol(); $sessionId = ($sessionId === 'current') @@ -1695,11 +1667,6 @@ App::delete('/v1/account/sessions/:sessionId') ->setParam('sessionId', $session->getId()) ->setPayload($response->output($session, Response::MODEL_SESSION)) ; - - $usage - ->setParam('users.sessions.delete', 1) - ->setParam('users.update', 1) - ; return $response->noContent(); } } @@ -1713,6 +1680,7 @@ App::patch('/v1/account/sessions/:sessionId') ->label('scope', 'account') ->label('event', 'users.[userId].sessions.[sessionId].update') ->label('audits.resource', 'user/{response.$id}') + ->label('usage.metric', 'sessions.{scope}.requests.update') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_JWT]) ->label('sdk.namespace', 'account') ->label('sdk.method', 'updateSession') @@ -1729,8 +1697,7 @@ App::patch('/v1/account/sessions/:sessionId') ->inject('project') ->inject('locale') ->inject('events') - ->inject('usage') - ->action(function (?string $sessionId, Request $request, Response $response, Document $user, Database $dbForProject, Document $project, Locale $locale, Event $events, Stats $usage) { + ->action(function (?string $sessionId, Request $request, Response $response, Document $user, Database $dbForProject, Document $project, Locale $locale, Event $events) { $sessionId = ($sessionId === 'current') ? Auth::sessionVerify($user->getAttribute('sessions'), Auth::$secret) @@ -1780,11 +1747,6 @@ App::patch('/v1/account/sessions/:sessionId') ->setPayload($response->output($session, Response::MODEL_SESSION)) ; - $usage - ->setParam('users.sessions.update', 1) - ->setParam('users.update', 1) - ; - return $response->dynamic($session, Response::MODEL_SESSION); } } @@ -1797,6 +1759,7 @@ App::delete('/v1/account/sessions') ->groups(['api', 'account']) ->label('scope', 'account') ->label('event', 'users.[userId].sessions.[sessionId].delete') + ->label('usage.metric', 'sessions.{scope}.requests.delete') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_JWT]) ->label('sdk.namespace', 'account') ->label('sdk.method', 'deleteSessions') @@ -1811,8 +1774,7 @@ App::delete('/v1/account/sessions') ->inject('locale') ->inject('audits') ->inject('events') - ->inject('usage') - ->action(function (Request $request, Response $response, Document $user, Database $dbForProject, Locale $locale, Audit $audits, Event $events, Stats $usage) { + ->action(function (Request $request, Response $response, Document $user, Database $dbForProject, Locale $locale, Audit $audits, Event $events) { $protocol = $request->getProtocol(); $sessions = $user->getAttribute('sessions', []); @@ -1852,11 +1814,6 @@ App::delete('/v1/account/sessions') ->setParam('userId', $user->getId()) ->setParam('sessionId', $session->getId()); - $usage - ->setParam('users.sessions.delete', $numOfSessions) - ->setParam('users.update', 1) - ; - $response->noContent(); }); @@ -1866,6 +1823,7 @@ App::post('/v1/account/recovery') ->label('scope', 'public') ->label('event', 'users.[userId].recovery.[tokenId].create') ->label('audits.resource', 'user/{response.$id}') + ->label('usage.metric', 'users.{scope}.requests.update') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_JWT]) ->label('sdk.namespace', 'account') ->label('sdk.method', 'createRecovery') @@ -1884,8 +1842,7 @@ App::post('/v1/account/recovery') ->inject('locale') ->inject('mails') ->inject('events') - ->inject('usage') - ->action(function (string $email, string $url, Request $request, Response $response, Database $dbForProject, Document $project, Locale $locale, Mail $mails, Event $events, Stats $usage) { + ->action(function (string $email, string $url, Request $request, Response $response, Database $dbForProject, Document $project, Locale $locale, Mail $mails, Event $events) { if (empty(App::getEnv('_APP_SMTP_HOST'))) { throw new Exception('SMTP Disabled', 503, Exception::GENERAL_SMTP_DISABLED); @@ -1957,8 +1914,6 @@ App::post('/v1/account/recovery') // Hide secret for clients $recovery->setAttribute('secret', ($isPrivilegedUser || $isAppUser) ? $secret : ''); - $usage->setParam('users.update', 1); - $response->setStatusCode(Response::STATUS_CODE_CREATED); $response->dynamic($recovery, Response::MODEL_TOKEN); }); @@ -1969,6 +1924,7 @@ App::put('/v1/account/recovery') ->label('scope', 'public') ->label('event', 'users.[userId].recovery.[tokenId].update') ->label('audits.resource', 'user/{response.$id}') + ->label('usage.metric', 'users.{scope}.requests.update') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_JWT]) ->label('sdk.namespace', 'account') ->label('sdk.method', 'updateRecovery') @@ -1984,9 +1940,8 @@ App::put('/v1/account/recovery') ->param('passwordAgain', '', new Password(), 'Repeat new user password. Must be at least 8 chars.') ->inject('response') ->inject('dbForProject') - ->inject('usage') ->inject('events') - ->action(function (string $userId, string $secret, string $password, string $passwordAgain, Response $response, Database $dbForProject, Stats $usage, Event $events) { + ->action(function (string $userId, string $secret, string $password, string $passwordAgain, Response $response, Database $dbForProject, Event $events) { if ($password !== $passwordAgain) { throw new Exception('Passwords must match', 400, Exception::USER_PASSWORD_MISMATCH); @@ -2021,8 +1976,6 @@ App::put('/v1/account/recovery') $dbForProject->deleteDocument('tokens', $recovery); $dbForProject->deleteCachedDocument('users', $profile->getId()); - $usage->setParam('users.update', 1); - $events ->setParam('userId', $profile->getId()) ->setParam('tokenId', $recoveryDocument->getId()) @@ -2037,6 +1990,7 @@ App::post('/v1/account/verification') ->label('scope', 'account') ->label('event', 'users.[userId].verification.[tokenId].create') ->label('audits.resource', 'user/{response.$id}') + ->label('usage.metric', 'users.{scope}.requests.update') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_JWT]) ->label('sdk.namespace', 'account') ->label('sdk.method', 'createVerification') @@ -2055,8 +2009,7 @@ App::post('/v1/account/verification') ->inject('locale') ->inject('events') ->inject('mails') - ->inject('usage') - ->action(function (string $url, Request $request, Response $response, Document $project, Document $user, Database $dbForProject, Locale $locale, Event $events, Mail $mails, Stats $usage) { + ->action(function (string $url, Request $request, Response $response, Document $project, Document $user, Database $dbForProject, Locale $locale, Event $events, Mail $mails) { if (empty(App::getEnv('_APP_SMTP_HOST'))) { throw new Exception('SMTP Disabled', 503, Exception::GENERAL_SMTP_DISABLED); @@ -2114,8 +2067,6 @@ App::post('/v1/account/verification') // Hide secret for clients $verification->setAttribute('secret', ($isPrivilegedUser || $isAppUser) ? $verificationSecret : ''); - $usage->setParam('users.update', 1); - $response->setStatusCode(Response::STATUS_CODE_CREATED); $response->dynamic($verification, Response::MODEL_TOKEN); }); @@ -2126,6 +2077,7 @@ App::put('/v1/account/verification') ->label('scope', 'public') ->label('event', 'users.[userId].verification.[tokenId].update') ->label('audits.resource', 'user/{response.$id}') + ->label('usage.metric', 'users.{scope}.requests.update') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_JWT]) ->label('sdk.namespace', 'account') ->label('sdk.method', 'updateVerification') @@ -2140,9 +2092,8 @@ App::put('/v1/account/verification') ->inject('response') ->inject('user') ->inject('dbForProject') - ->inject('usage') ->inject('events') - ->action(function (string $userId, string $secret, Response $response, Document $user, Database $dbForProject, Stats $usage, Event $events) { + ->action(function (string $userId, string $secret, Response $response, Document $user, Database $dbForProject, Event $events) { $profile = Authorization::skip(fn() => $dbForProject->getDocument('users', $userId)); @@ -2170,8 +2121,6 @@ App::put('/v1/account/verification') $dbForProject->deleteDocument('tokens', $verification); $dbForProject->deleteCachedDocument('users', $profile->getId()); - $usage->setParam('users.update', 1); - $events ->setParam('userId', $user->getId()) ->setParam('tokenId', $verificationDocument->getId()) @@ -2186,6 +2135,7 @@ App::post('/v1/account/verification/phone') ->label('scope', 'account') ->label('event', 'users.[userId].verification.[tokenId].create') ->label('audits.resource', 'user/{response.$id}') + ->label('usage.metric', 'users.{scope}.requests.update') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_JWT]) ->label('sdk.namespace', 'account') ->label('sdk.method', 'createPhoneVerification') @@ -2201,9 +2151,8 @@ App::post('/v1/account/verification/phone') ->inject('user') ->inject('dbForProject') ->inject('events') - ->inject('usage') ->inject('messaging') - ->action(function (Request $request, Response $response, Phone $phone, Document $user, Database $dbForProject, Event $events, Stats $usage, EventPhone $messaging) { + ->action(function (Request $request, Response $response, Phone $phone, Document $user, Database $dbForProject, Event $events, EventPhone $messaging) { if (empty(App::getEnv('_APP_PHONE_PROVIDER'))) { throw new Exception('Phone provider not configured', 503, Exception::GENERAL_PHONE_DISABLED); @@ -2259,8 +2208,6 @@ App::post('/v1/account/verification/phone') // Hide secret for clients $verification->setAttribute('secret', ($isPrivilegedUser || $isAppUser) ? $verificationSecret : ''); - $usage->setParam('users.update', 1); - $response->setStatusCode(Response::STATUS_CODE_CREATED); $response->dynamic($verification, Response::MODEL_TOKEN); }); @@ -2271,6 +2218,7 @@ App::put('/v1/account/verification/phone') ->label('scope', 'public') ->label('event', 'users.[userId].verification.[tokenId].update') ->label('audits.resource', 'user/{response.$id}') + ->label('usage.metric', 'users.{scope}.requests.update') ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_JWT]) ->label('sdk.namespace', 'account') ->label('sdk.method', 'updatePhoneVerification') @@ -2285,9 +2233,8 @@ App::put('/v1/account/verification/phone') ->inject('response') ->inject('user') ->inject('dbForProject') - ->inject('usage') ->inject('events') - ->action(function (string $userId, string $secret, Response $response, Document $user, Database $dbForProject, Stats $usage, Event $events) { + ->action(function (string $userId, string $secret, Response $response, Document $user, Database $dbForProject, Event $events) { $profile = Authorization::skip(fn() => $dbForProject->getDocument('users', $userId)); @@ -2313,8 +2260,6 @@ App::put('/v1/account/verification/phone') $dbForProject->deleteDocument('tokens', $verification); $dbForProject->deleteCachedDocument('users', $profile->getId()); - $usage->setParam('users.update', 1); - $events ->setParam('userId', $user->getId()) ->setParam('tokenId', $verificationDocument->getId()) diff --git a/app/controllers/shared/api.php b/app/controllers/shared/api.php index 98e00afa14..8652853f99 100644 --- a/app/controllers/shared/api.php +++ b/app/controllers/shared/api.php @@ -364,6 +364,9 @@ App::shutdown() case 'request': $params = $getRequestParams(); break; + case 'value': + $usage->setParam($param, $key); + break; default: $params = $responsePayload; } diff --git a/src/Appwrite/Usage/Stats.php b/src/Appwrite/Usage/Stats.php index 7c5649fdd8..5d63494215 100644 --- a/src/Appwrite/Usage/Stats.php +++ b/src/Appwrite/Usage/Stats.php @@ -168,6 +168,7 @@ class Stats $sessionsMetrics = [ 'sessions.{scope}.requests.create', + 'sessions.{scope}.requests.update', 'sessions.{scope}.requests.delete', ];