From c7dec3762b2bc85be3973adbdca586322af4dba5 Mon Sep 17 00:00:00 2001 From: prateek banga Date: Wed, 16 Aug 2023 20:13:38 +0530 Subject: [PATCH] Adds getTarget and list targets controller to user and account --- app/config/errors.php | 5 ++ app/controllers/api/account.php | 50 +++++++++++++++ app/controllers/api/users.php | 62 +++++++++++++++++++ src/Appwrite/Extend/Exception.php | 1 + .../Utopia/Response/Model/BaseList.php | 2 +- 5 files changed, 119 insertions(+), 1 deletion(-) diff --git a/app/config/errors.php b/app/config/errors.php index ed1a9f0aa2..5006df0e89 100644 --- a/app/config/errors.php +++ b/app/config/errors.php @@ -230,6 +230,11 @@ return [ 'description' => 'OAuth2 provider returned some error.', 'code' => 424, ], + Exception::USER_TARGET_NOT_FOUND => [ + 'name' => Exception::USER_TARGET_NOT_FOUND, + 'description' => 'The current user target could not be found.', + 'code' => 404, + ], /** Teams */ Exception::TEAM_NOT_FOUND => [ diff --git a/app/controllers/api/account.php b/app/controllers/api/account.php index ce06a807fb..0e69ccdcd9 100644 --- a/app/controllers/api/account.php +++ b/app/controllers/api/account.php @@ -1653,6 +1653,29 @@ App::get('/v1/account/logs') ]), Response::MODEL_LOG_LIST); }); +App::get('/v1/account/targets') + ->desc('List Account Targets') + ->groups(['api', 'account']) + ->label('scope', 'account') + ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_JWT]) + ->label('sdk.namespace', 'account') + ->label('sdk.method', 'listTargets') + ->label('sdk.description', '/docs/references/account/list-targets.md') + ->label('sdk.response.code', Response::STATUS_CODE_OK) + ->label('sdk.response.type', Response::CONTENT_TYPE_JSON) + ->label('sdk.response.model', Response::MODEL_TARGET_LIST) + ->inject('response') + ->inject('user') + ->action(function (Response $response, Document $user) { + + $targets = $user->getAttribute('targets', []); + + $response->dynamic(new Document([ + 'targets' => $targets, + 'total' => count($targets), + ]), Response::MODEL_TARGET_LIST); + }); + App::get('/v1/account/sessions/:sessionId') ->desc('Get Session') ->groups(['api', 'account']) @@ -1697,6 +1720,33 @@ App::get('/v1/account/sessions/:sessionId') throw new Exception(Exception::USER_SESSION_NOT_FOUND); }); +App::get('/v1/account/targets/:targetId') + ->desc('Get Target') + ->groups(['api', 'account']) + ->label('scope', 'account') + ->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_JWT]) + ->label('sdk.namespace', 'account') + ->label('sdk.method', 'getTarget') + ->label('sdk.description', '/docs/references/account/get-Target.md') + ->label('sdk.response.code', Response::STATUS_CODE_OK) + ->label('sdk.response.type', Response::CONTENT_TYPE_JSON) + ->label('sdk.response.model', Response::MODEL_SESSION) + ->label('sdk.offline.model', '/account/targets') + ->label('sdk.offline.key', '{targetId}') + ->param('targetId', '', new UID(), 'Target ID.') + ->inject('response') + ->inject('user') + ->action(function (string $targetId, Response $response, Document $user) { + + $target = $user->find('$id', $targetId, 'targets'); + + if (empty($target)) { + throw new Exception(Exception::USER_TARGET_NOT_FOUND); + } + + $response->dynamic($target, Response::MODEL_TARGET); + }); + App::patch('/v1/account/name') ->desc('Update Name') ->groups(['api', 'account']) diff --git a/app/controllers/api/users.php b/app/controllers/api/users.php index c3129d41eb..adc02a3b02 100644 --- a/app/controllers/api/users.php +++ b/app/controllers/api/users.php @@ -461,6 +461,38 @@ App::get('/v1/users/:userId/prefs') $response->dynamic(new Document($prefs), Response::MODEL_PREFERENCES); }); +App::get('/v1/users/:userId/targets/:targetId') + ->desc('Get User Target') + ->groups(['api', 'users']) + ->label('scope', 'users.read') + ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) + ->label('sdk.namespace', 'users') + ->label('sdk.method', 'getTarget') + ->label('sdk.description', '/docs/references/users/get-user-target.md') + ->label('sdk.response.code', Response::STATUS_CODE_OK) + ->label('sdk.response.type', Response::CONTENT_TYPE_JSON) + ->label('sdk.response.model', Response::MODEL_TARGET) + ->param('userId', '', new UID(), 'User ID.') + ->param('targetId', '', new UID(), 'Target ID.') + ->inject('response') + ->inject('dbForProject') + ->action(function (string $userId, string $targetId, Response $response, Database $dbForProject) { + + $user = $dbForProject->getDocument('users', $userId); + + if ($user->isEmpty()) { + throw new Exception(Exception::USER_NOT_FOUND); + } + + $target = $user->find('$id', $targetId, 'targets'); + + if (empty($target)) { + throw new Exception(Exception::USER_TARGET_NOT_FOUND); + } + + $response->dynamic($target, Response::MODEL_TARGET); + }); + App::get('/v1/users/:userId/sessions') ->desc('List User Sessions') ->groups(['api', 'users']) @@ -622,6 +654,36 @@ App::get('/v1/users/:userId/logs') ]), Response::MODEL_LOG_LIST); }); +App::get('/v1/users/:userId/targets') + ->desc('List User Targets') + ->groups(['api', 'users']) + ->label('scope', 'users.read') + ->label('sdk.auth', [APP_AUTH_TYPE_KEY]) + ->label('sdk.namespace', 'users') + ->label('sdk.method', 'listTargets') + ->label('sdk.description', '/docs/references/users/list-user-targets.md') + ->label('sdk.response.code', Response::STATUS_CODE_OK) + ->label('sdk.response.type', Response::CONTENT_TYPE_JSON) + ->label('sdk.response.model', Response::MODEL_TARGET_LIST) + ->param('userId', '', new UID(), 'User ID.') + ->inject('response') + ->inject('dbForProject') + ->action(function (string $userId, Response $response, Database $dbForProject) { + + $user = $dbForProject->getDocument('users', $userId); + + if ($user->isEmpty()) { + throw new Exception(Exception::USER_NOT_FOUND); + } + + $targets = $user->getAttribute('targets', []); + var_dump($user); + $response->dynamic(new Document([ + 'targets' => $targets, + 'total' => count($targets), + ]), Response::MODEL_TARGET_LIST); + }); + App::patch('/v1/users/:userId/status') ->desc('Update User Status') ->groups(['api', 'users']) diff --git a/src/Appwrite/Extend/Exception.php b/src/Appwrite/Extend/Exception.php index 6b448db8ec..1392faaed6 100644 --- a/src/Appwrite/Extend/Exception.php +++ b/src/Appwrite/Extend/Exception.php @@ -81,6 +81,7 @@ class Exception extends \Exception public const USER_OAUTH2_BAD_REQUEST = 'user_oauth2_bad_request'; public const USER_OAUTH2_UNAUTHORIZED = 'user_oauth2_unauthorized'; public const USER_OAUTH2_PROVIDER_ERROR = 'user_oauth2_provider_error'; + public const USER_TARGET_NOT_FOUND = 'user_target_not_found'; /** Teams */ public const TEAM_NOT_FOUND = 'team_not_found'; diff --git a/src/Appwrite/Utopia/Response/Model/BaseList.php b/src/Appwrite/Utopia/Response/Model/BaseList.php index 06a5249388..0c2cc072f3 100644 --- a/src/Appwrite/Utopia/Response/Model/BaseList.php +++ b/src/Appwrite/Utopia/Response/Model/BaseList.php @@ -34,7 +34,7 @@ class BaseList extends Model $namesWithCap = [ 'documents', 'collections', 'users', 'files', 'buckets', 'functions', 'deployments', 'executions', 'projects', 'webhooks', 'keys', - 'platforms', 'domains', 'memberships', 'teams' + 'platforms', 'domains', 'memberships', 'teams', 'targets' ]; if (\in_array($name, $namesWithCap)) {