1
0
Fork 0
mirror of synced 2024-06-03 03:14:50 +12:00
appwrite/app/controllers/api/users.php

513 lines
20 KiB
PHP
Raw Normal View History

2019-05-09 18:54:39 +12:00
<?php
2021-05-07 10:31:05 +12:00
use Appwrite\Auth\Auth;
use Appwrite\Auth\Validator\Password;
use Appwrite\Utopia\Response;
2020-06-29 05:31:21 +12:00
use Utopia\App;
2019-05-09 18:54:39 +12:00
use Utopia\Exception;
2021-04-16 08:33:47 +12:00
use Utopia\Validator;
2020-01-20 09:38:00 +13:00
use Utopia\Validator\Assoc;
2019-05-09 18:54:39 +12:00
use Utopia\Validator\WhiteList;
use Appwrite\Network\Validator\Email;
2019-05-09 18:54:39 +12:00
use Utopia\Validator\Text;
use Utopia\Validator\Range;
use Utopia\Audit\Audit;
use Utopia\Audit\Adapters\MySQL as AuditAdapter;
2021-05-07 10:31:05 +12:00
use Utopia\Database\Document;
use Utopia\Database\Exception\Duplicate;
use Utopia\Database\Validator\UID;
2019-05-09 18:54:39 +12:00
use DeviceDetector\DeviceDetector;
2020-06-29 05:31:21 +12:00
App::post('/v1/users')
2020-02-05 19:31:34 +13:00
->desc('Create User')
2020-06-26 06:32:12 +12:00
->groups(['api', 'users'])
2020-10-31 08:53:27 +13:00
->label('event', 'users.create')
2020-02-05 19:31:34 +13:00
->label('scope', 'users.write')
2021-04-16 19:22:17 +12:00
->label('sdk.auth', [APP_AUTH_TYPE_KEY])
2020-02-05 19:31:34 +13:00
->label('sdk.namespace', 'users')
->label('sdk.method', 'create')
->label('sdk.description', '/docs/references/users/create-user.md')
2020-11-12 10:02:24 +13:00
->label('sdk.response.code', Response::STATUS_CODE_CREATED)
->label('sdk.response.type', Response::CONTENT_TYPE_JSON)
->label('sdk.response.model', Response::MODEL_USER)
2020-09-11 02:40:14 +12:00
->param('email', '', new Email(), 'User email.')
->param('password', '', new Password(), 'User password. Must be between 6 to 32 chars.')
->param('name', '', new Text(128), 'User name. Max length: 128 chars.', true)
2020-12-27 05:54:42 +13:00
->inject('response')
2021-05-07 10:31:05 +12:00
->inject('dbForInternal')
->action(function ($email, $password, $name, $response, $dbForInternal) {
2020-10-30 02:50:49 +13:00
/** @var Appwrite\Utopia\Response $response */
2021-05-07 10:31:05 +12:00
/** @var Utopia\Database\Database $dbForInternal */
2020-02-05 19:31:34 +13:00
2020-06-30 23:09:28 +12:00
try {
2021-05-07 10:31:05 +12:00
$userId = $dbForInternal->getId();
$user = $dbForInternal->createDocument('users', new Document([
'$id' => $userId,
'$read' => ['*'],
'$write' => ['user:'.$userId],
2020-06-30 23:09:28 +12:00
'email' => $email,
'emailVerification' => false,
'status' => Auth::USER_STATUS_UNACTIVATED,
'password' => Auth::passwordHash($password),
'passwordUpdate' => \time(),
2020-06-30 23:09:28 +12:00
'registration' => \time(),
'reset' => false,
'name' => $name,
2021-05-07 10:31:05 +12:00
'prefs' => [],
'sessions' => [],
'tokens' => [],
'memberships' => [],
]));
2020-06-30 23:09:28 +12:00
} catch (Duplicate $th) {
throw new Exception('Account already exists', 409);
}
2020-02-05 19:31:34 +13:00
2021-05-07 10:31:05 +12:00
$response->setStatusCode(Response::STATUS_CODE_CREATED);
$response->dynamic2($user, Response::MODEL_USER);
2020-12-27 05:54:42 +13:00
});
2020-02-05 19:31:34 +13:00
2020-06-29 05:31:21 +12:00
App::get('/v1/users')
2019-05-09 18:54:39 +12:00
->desc('List Users')
2020-06-26 06:32:12 +12:00
->groups(['api', 'users'])
2019-05-09 18:54:39 +12:00
->label('scope', 'users.read')
2021-04-16 19:22:17 +12:00
->label('sdk.auth', [APP_AUTH_TYPE_KEY])
2019-05-09 18:54:39 +12:00
->label('sdk.namespace', 'users')
2020-01-31 05:18:46 +13:00
->label('sdk.method', 'list')
2019-10-08 20:09:35 +13:00
->label('sdk.description', '/docs/references/users/list-users.md')
2020-11-12 10:02:24 +13:00
->label('sdk.response.code', Response::STATUS_CODE_OK)
->label('sdk.response.type', Response::CONTENT_TYPE_JSON)
->label('sdk.response.model', Response::MODEL_USER_LIST)
2020-09-11 02:40:14 +12:00
->param('search', '', new Text(256), 'Search term to filter your list results. Max length: 256 chars.', true)
->param('limit', 25, new Range(0, 100), 'Results limit value. By default will return maximum 25 results. Maximum of 100 results allowed per request.', true)
->param('offset', 0, new Range(0, 2000), 'Results offset. The default value is 0. Use this param to manage pagination.', true)
->param('orderType', 'ASC', new WhiteList(['ASC', 'DESC'], true), 'Order result by ASC or DESC order.', true)
2020-12-27 05:54:42 +13:00
->inject('response')
2021-05-07 10:31:05 +12:00
->inject('dbForInternal')
->action(function ($search, $limit, $offset, $orderType, $response, $dbForInternal) {
2020-10-30 02:50:49 +13:00
/** @var Appwrite\Utopia\Response $response */
2021-05-07 10:31:05 +12:00
/** @var Utopia\Database\Database $dbForInternal */
$results = $dbForInternal->find('users', [], $limit, $offset);
2021-05-10 06:37:47 +12:00
$sum = $dbForInternal->count('users', [], APP_LIMIT_COUNT);
2020-06-30 23:09:28 +12:00
2021-05-07 10:31:05 +12:00
$response->dynamic2(new Document([
'sum' => $sum,
2020-10-31 08:53:27 +13:00
'users' => $results
]), Response::MODEL_USER_LIST);
2020-12-27 05:54:42 +13:00
});
2019-05-09 18:54:39 +12:00
2020-06-29 05:31:21 +12:00
App::get('/v1/users/:userId')
2019-05-09 18:54:39 +12:00
->desc('Get User')
->groups(['api', 'users'])
2019-05-09 18:54:39 +12:00
->label('scope', 'users.read')
2021-04-16 19:22:17 +12:00
->label('sdk.auth', [APP_AUTH_TYPE_KEY])
->label('sdk.namespace', 'users')
2020-01-31 05:18:46 +13:00
->label('sdk.method', 'get')
2019-10-08 20:09:35 +13:00
->label('sdk.description', '/docs/references/users/get-user.md')
2020-11-12 10:02:24 +13:00
->label('sdk.response.code', Response::STATUS_CODE_OK)
->label('sdk.response.type', Response::CONTENT_TYPE_JSON)
->label('sdk.response.model', Response::MODEL_USER)
2020-09-11 02:40:14 +12:00
->param('userId', '', new UID(), 'User unique ID.')
2020-12-27 05:54:42 +13:00
->inject('response')
2021-05-07 10:31:05 +12:00
->inject('dbForInternal')
->action(function ($userId, $response, $dbForInternal) {
2020-10-30 02:50:49 +13:00
/** @var Appwrite\Utopia\Response $response */
2021-05-07 10:31:05 +12:00
/** @var Utopia\Database\Database $dbForInternal */
2021-05-07 10:31:05 +12:00
$user = $dbForInternal->getDocument('users', $userId);
2021-05-07 10:31:05 +12:00
if (empty($user->getId())) {
2020-06-30 23:09:28 +12:00
throw new Exception('User not found', 404);
}
2021-05-07 10:31:05 +12:00
$response->dynamic2($user, Response::MODEL_USER);
2020-12-27 05:54:42 +13:00
});
2019-05-09 18:54:39 +12:00
2020-06-29 05:31:21 +12:00
App::get('/v1/users/:userId/prefs')
2020-01-23 19:27:19 +13:00
->desc('Get User Preferences')
2020-06-26 06:32:12 +12:00
->groups(['api', 'users'])
2019-05-09 18:54:39 +12:00
->label('scope', 'users.read')
2021-04-16 19:22:17 +12:00
->label('sdk.auth', [APP_AUTH_TYPE_KEY])
2019-05-09 18:54:39 +12:00
->label('sdk.namespace', 'users')
2020-01-31 05:18:46 +13:00
->label('sdk.method', 'getPrefs')
2019-10-08 20:09:35 +13:00
->label('sdk.description', '/docs/references/users/get-user-prefs.md')
2020-11-13 00:54:16 +13:00
->label('sdk.response.code', Response::STATUS_CODE_OK)
->label('sdk.response.type', Response::CONTENT_TYPE_JSON)
2021-04-22 01:37:51 +12:00
->label('sdk.response.model', Response::MODEL_PREFERENCES)
2020-09-11 02:40:14 +12:00
->param('userId', '', new UID(), 'User unique ID.')
2020-12-27 05:54:42 +13:00
->inject('response')
2021-05-07 10:31:05 +12:00
->inject('dbForInternal')
->action(function ($userId, $response, $dbForInternal) {
2020-10-30 02:50:49 +13:00
/** @var Appwrite\Utopia\Response $response */
2021-05-07 10:31:05 +12:00
/** @var Utopia\Database\Database $dbForInternal */
2019-05-09 18:54:39 +12:00
2021-05-07 10:31:05 +12:00
$user = $dbForInternal->getDocument('users', $userId);
2019-05-09 18:54:39 +12:00
2021-05-07 10:31:05 +12:00
if (empty($user->getId())) {
2020-06-30 23:09:28 +12:00
throw new Exception('User not found', 404);
}
2019-05-09 18:54:39 +12:00
2021-01-11 00:55:59 +13:00
$prefs = $user->getAttribute('prefs', new \stdClass());
2019-05-09 18:54:39 +12:00
2021-05-07 10:31:05 +12:00
$response->dynamic2(new Document($prefs), Response::MODEL_PREFERENCES);
2020-12-27 05:54:42 +13:00
});
2019-05-09 18:54:39 +12:00
2020-06-29 05:31:21 +12:00
App::get('/v1/users/:userId/sessions')
2019-05-09 18:54:39 +12:00
->desc('Get User Sessions')
2020-06-26 06:32:12 +12:00
->groups(['api', 'users'])
2019-05-09 18:54:39 +12:00
->label('scope', 'users.read')
2021-04-16 19:22:17 +12:00
->label('sdk.auth', [APP_AUTH_TYPE_KEY])
2019-05-09 18:54:39 +12:00
->label('sdk.namespace', 'users')
2020-01-31 05:18:46 +13:00
->label('sdk.method', 'getSessions')
2019-10-08 20:09:35 +13:00
->label('sdk.description', '/docs/references/users/get-user-sessions.md')
2020-11-12 10:02:24 +13:00
->label('sdk.response.code', Response::STATUS_CODE_OK)
->label('sdk.response.type', Response::CONTENT_TYPE_JSON)
->label('sdk.response.model', Response::MODEL_SESSION_LIST)
2020-09-11 02:40:14 +12:00
->param('userId', '', new UID(), 'User unique ID.')
2020-12-27 05:54:42 +13:00
->inject('response')
2021-05-07 10:31:05 +12:00
->inject('dbForInternal')
2020-12-27 05:54:42 +13:00
->inject('locale')
2021-05-07 10:31:05 +12:00
->action(function ($userId, $response, $dbForInternal, $locale) {
2020-10-30 02:50:49 +13:00
/** @var Appwrite\Utopia\Response $response */
2021-05-07 10:31:05 +12:00
/** @var Utopia\Database\Database $dbForInternal */
2020-06-30 23:09:28 +12:00
/** @var Utopia\Locale\Locale $locale */
2019-05-09 18:54:39 +12:00
2021-05-07 10:31:05 +12:00
$user = $dbForInternal->getDocument('users', $userId);
2020-06-30 23:09:28 +12:00
2021-05-07 10:31:05 +12:00
if (empty($user->getId())) {
2020-06-30 23:09:28 +12:00
throw new Exception('User not found', 404);
}
2019-05-09 18:54:39 +12:00
2021-02-20 01:12:47 +13:00
$sessions = $user->getAttribute('sessions', []);
2020-06-30 23:09:28 +12:00
$countries = $locale->getText('countries');
2021-02-20 01:12:47 +13:00
foreach ($sessions as $key => $session) {
/** @var Document $session */
2019-05-09 18:54:39 +12:00
$session->setAttribute('countryName', (isset($countries[strtoupper($session->getAttribute('countryCode'))]))
? $countries[strtoupper($session->getAttribute('countryCode'))]
2020-10-31 08:53:27 +13:00
: $locale->getText('locale.country.unknown'));
2021-02-20 01:12:47 +13:00
$session->setAttribute('current', false);
2019-05-09 18:54:39 +12:00
2021-02-20 01:12:47 +13:00
$sessions[$key] = $session;
2019-05-09 18:54:39 +12:00
}
2021-05-07 10:31:05 +12:00
$response->dynamic2(new Document([
2020-10-31 08:53:27 +13:00
'sum' => count($sessions),
'sessions' => $sessions
]), Response::MODEL_SESSION_LIST);
2021-05-07 10:31:05 +12:00
}, ['response', 'dbForInternal', 'locale']);
2019-05-09 18:54:39 +12:00
2020-06-29 05:31:21 +12:00
App::get('/v1/users/:userId/logs')
2019-05-09 18:54:39 +12:00
->desc('Get User Logs')
2020-06-26 06:32:12 +12:00
->groups(['api', 'users'])
2019-05-09 18:54:39 +12:00
->label('scope', 'users.read')
2021-04-16 19:22:17 +12:00
->label('sdk.auth', [APP_AUTH_TYPE_KEY])
2019-05-09 18:54:39 +12:00
->label('sdk.namespace', 'users')
2020-01-31 05:18:46 +13:00
->label('sdk.method', 'getLogs')
2019-10-08 20:09:35 +13:00
->label('sdk.description', '/docs/references/users/get-user-logs.md')
2020-11-12 10:02:24 +13:00
->label('sdk.response.code', Response::STATUS_CODE_OK)
->label('sdk.response.type', Response::CONTENT_TYPE_JSON)
->label('sdk.response.model', Response::MODEL_LOG_LIST)
2020-09-11 02:40:14 +12:00
->param('userId', '', new UID(), 'User unique ID.')
2020-12-27 05:54:42 +13:00
->inject('response')
->inject('register')
->inject('project')
2021-05-07 10:31:05 +12:00
->inject('dbForInternal')
2020-12-27 05:54:42 +13:00
->inject('locale')
->inject('geodb')
2021-05-07 10:31:05 +12:00
->action(function ($userId, $response, $register, $project, $dbForInternal, $locale, $geodb) {
2020-10-30 02:50:49 +13:00
/** @var Appwrite\Utopia\Response $response */
2020-06-30 23:09:28 +12:00
/** @var Utopia\Registry\Registry $register */
/** @var Appwrite\Database\Document $project */
2021-05-07 10:31:05 +12:00
/** @var Utopia\Database\Database $dbForInternal */
2020-06-30 23:09:28 +12:00
/** @var Utopia\Locale\Locale $locale */
2020-10-25 19:15:36 +13:00
/** @var MaxMind\Db\Reader $geodb */
2020-06-30 23:09:28 +12:00
2021-05-07 10:31:05 +12:00
$user = $dbForInternal->getDocument('users', $userId);
2020-06-30 23:09:28 +12:00
2021-05-07 10:31:05 +12:00
if (empty($user->getId())) {
2020-06-30 23:09:28 +12:00
throw new Exception('User not found', 404);
}
2019-05-09 18:54:39 +12:00
2020-06-30 23:09:28 +12:00
$adapter = new AuditAdapter($register->get('db'));
$adapter->setNamespace('app_'.$project->getId());
$audit = new Audit($adapter);
$countries = $locale->getText('countries');
$logs = $audit->getLogsByUserAndActions($user->getId(), [
'account.create',
'account.delete',
'account.update.name',
'account.update.email',
'account.update.password',
'account.update.prefs',
'account.sessions.create',
'account.sessions.delete',
'account.recovery.create',
'account.recovery.update',
'account.verification.create',
'account.verification.update',
'teams.membership.create',
'teams.membership.update',
'teams.membership.delete',
]);
$output = [];
foreach ($logs as $i => &$log) {
$log['userAgent'] = (!empty($log['userAgent'])) ? $log['userAgent'] : 'UNKNOWN';
$dd = new DeviceDetector($log['userAgent']);
$dd->skipBotDetection(); // OPTIONAL: If called, bot detection will completely be skipped (bots will be detected as regular devices then)
$dd->parse();
2020-10-31 08:53:27 +13:00
$os = $dd->getOs();
$osCode = (isset($os['short_name'])) ? $os['short_name'] : '';
$osName = (isset($os['name'])) ? $os['name'] : '';
$osVersion = (isset($os['version'])) ? $os['version'] : '';
$client = $dd->getClient();
$clientType = (isset($client['type'])) ? $client['type'] : '';
$clientCode = (isset($client['short_name'])) ? $client['short_name'] : '';
$clientName = (isset($client['name'])) ? $client['name'] : '';
$clientVersion = (isset($client['version'])) ? $client['version'] : '';
$clientEngine = (isset($client['engine'])) ? $client['engine'] : '';
$clientEngineVersion = (isset($client['engine_version'])) ? $client['engine_version'] : '';
$output[$i] = new Document([
2020-06-30 23:09:28 +12:00
'event' => $log['event'],
'ip' => $log['ip'],
'time' => \strtotime($log['time']),
2020-10-31 08:53:27 +13:00
'osCode' => $osCode,
'osName' => $osName,
'osVersion' => $osVersion,
'clientType' => $clientType,
'clientCode' => $clientCode,
'clientName' => $clientName,
'clientVersion' => $clientVersion,
'clientEngine' => $clientEngine,
'clientEngineVersion' => $clientEngineVersion,
'deviceName' => $dd->getDeviceName(),
'deviceBrand' => $dd->getBrandName(),
'deviceModel' => $dd->getModel(),
]);
$record = $geodb->get($log['ip']);
if ($record) {
$output[$i]['countryCode'] = (isset($countries[$record['country']['iso_code']])) ? \strtolower($record['country']['iso_code']) : '--';
$output[$i]['countryName'] = (isset($countries[$record['country']['iso_code']])) ? $countries[$record['country']['iso_code']] : $locale->getText('locale.country.unknown');
} else {
$output[$i]['countryCode'] = '--';
$output[$i]['countryName'] = $locale->getText('locale.country.unknown');
2019-05-09 18:54:39 +12:00
}
}
2021-05-07 10:31:05 +12:00
$response->dynamic2(new Document(['logs' => $output]), Response::MODEL_LOG_LIST);
2020-12-27 05:54:42 +13:00
});
2019-05-09 18:54:39 +12:00
2020-06-29 05:31:21 +12:00
App::patch('/v1/users/:userId/status')
2019-10-10 16:52:59 +13:00
->desc('Update User Status')
2020-06-26 06:32:12 +12:00
->groups(['api', 'users'])
2020-10-31 08:53:27 +13:00
->label('event', 'users.update.status')
2019-05-09 18:54:39 +12:00
->label('scope', 'users.write')
2021-04-16 19:22:17 +12:00
->label('sdk.auth', [APP_AUTH_TYPE_KEY])
2019-05-09 18:54:39 +12:00
->label('sdk.namespace', 'users')
2020-01-31 05:18:46 +13:00
->label('sdk.method', 'updateStatus')
2019-10-08 20:09:35 +13:00
->label('sdk.description', '/docs/references/users/update-user-status.md')
2020-11-12 10:02:24 +13:00
->label('sdk.response.code', Response::STATUS_CODE_OK)
->label('sdk.response.type', Response::CONTENT_TYPE_JSON)
->label('sdk.response.model', Response::MODEL_USER)
2020-09-11 02:40:14 +12:00
->param('userId', '', new UID(), 'User unique ID.')
2021-04-16 08:33:47 +12:00
->param('status', '', new WhiteList([Auth::USER_STATUS_ACTIVATED, Auth::USER_STATUS_BLOCKED, Auth::USER_STATUS_UNACTIVATED], true, Validator::TYPE_INTEGER), 'User Status code. To activate the user pass '.Auth::USER_STATUS_ACTIVATED.', to block the user pass '.Auth::USER_STATUS_BLOCKED.' and for disabling the user pass '.Auth::USER_STATUS_UNACTIVATED)
2020-12-27 05:54:42 +13:00
->inject('response')
2021-05-07 10:31:05 +12:00
->inject('dbForInternal')
->action(function ($userId, $status, $response, $dbForInternal) {
2020-10-30 02:50:49 +13:00
/** @var Appwrite\Utopia\Response $response */
2021-05-07 10:31:05 +12:00
/** @var Utopia\Database\Database $dbForInternal */
2019-05-09 18:54:39 +12:00
2021-05-07 10:31:05 +12:00
$user = $dbForInternal->getDocument('users', $userId);
2019-05-09 18:54:39 +12:00
2021-05-07 10:31:05 +12:00
if (empty($user->getId())) {
2020-06-30 23:09:28 +12:00
throw new Exception('User not found', 404);
}
2019-05-09 18:54:39 +12:00
2021-05-07 10:31:05 +12:00
$user = $dbForInternal->updateDocument('users', $user->getId(), $user->setAttribute('status', (int)$status));
2019-10-21 19:01:07 +13:00
2021-05-07 10:31:05 +12:00
$response->dynamic2($user, Response::MODEL_USER);
2020-12-27 05:54:42 +13:00
});
2019-05-09 18:54:39 +12:00
2020-06-29 05:31:21 +12:00
App::patch('/v1/users/:userId/prefs')
2020-01-23 19:27:19 +13:00
->desc('Update User Preferences')
2020-06-26 06:32:12 +12:00
->groups(['api', 'users'])
2021-03-05 06:18:50 +13:00
->label('event', 'users.update.prefs')
->label('scope', 'users.write')
2021-04-16 19:22:17 +12:00
->label('sdk.auth', [APP_AUTH_TYPE_KEY])
->label('sdk.namespace', 'users')
2020-01-31 05:18:46 +13:00
->label('sdk.method', 'updatePrefs')
2019-10-08 20:09:35 +13:00
->label('sdk.description', '/docs/references/users/update-user-prefs.md')
2020-11-13 00:54:16 +13:00
->label('sdk.response.code', Response::STATUS_CODE_OK)
->label('sdk.response.type', Response::CONTENT_TYPE_JSON)
2021-04-22 01:37:51 +12:00
->label('sdk.response.model', Response::MODEL_PREFERENCES)
2020-09-11 02:40:14 +12:00
->param('userId', '', new UID(), 'User unique ID.')
->param('prefs', '', new Assoc(), 'Prefs key-value JSON object.')
2020-12-27 05:54:42 +13:00
->inject('response')
2021-05-07 10:31:05 +12:00
->inject('dbForInternal')
->action(function ($userId, $prefs, $response, $dbForInternal) {
2020-10-30 02:50:49 +13:00
/** @var Appwrite\Utopia\Response $response */
2021-05-07 10:31:05 +12:00
/** @var Utopia\Database\Database $dbForInternal */
2021-05-07 10:31:05 +12:00
$user = $dbForInternal->getDocument('users', $userId);
2021-05-07 10:31:05 +12:00
if ($user->isEmpty()) {
2020-06-30 23:09:28 +12:00
throw new Exception('User not found', 404);
}
2020-01-20 09:38:00 +13:00
2021-05-07 10:31:05 +12:00
$user = $dbForInternal->updateDocument('users', $user->getId(), $user->setAttribute('prefs', $prefs));
2019-10-21 19:01:07 +13:00
2021-05-07 10:31:05 +12:00
$response->dynamic2(new Document($prefs), Response::MODEL_PREFERENCES);
2020-12-27 05:54:42 +13:00
});
2020-06-29 05:31:21 +12:00
App::delete('/v1/users/:userId/sessions/:sessionId')
2019-05-09 18:54:39 +12:00
->desc('Delete User Session')
2020-06-26 06:32:12 +12:00
->groups(['api', 'users'])
2020-10-31 08:53:27 +13:00
->label('event', 'users.sessions.delete')
2019-05-09 18:54:39 +12:00
->label('scope', 'users.write')
2021-04-16 19:22:17 +12:00
->label('sdk.auth', [APP_AUTH_TYPE_KEY])
2019-05-09 18:54:39 +12:00
->label('sdk.namespace', 'users')
2020-01-31 05:18:46 +13:00
->label('sdk.method', 'deleteSession')
2019-10-08 20:09:35 +13:00
->label('sdk.description', '/docs/references/users/delete-user-session.md')
2020-11-12 10:02:24 +13:00
->label('sdk.response.code', Response::STATUS_CODE_NOCONTENT)
->label('sdk.response.model', Response::MODEL_NONE)
2020-09-11 02:40:14 +12:00
->param('userId', '', new UID(), 'User unique ID.')
->param('sessionId', null, new UID(), 'User unique session ID.')
2020-12-27 05:54:42 +13:00
->inject('response')
2021-05-07 10:31:05 +12:00
->inject('dbForInternal')
2020-12-27 05:54:42 +13:00
->inject('events')
2021-05-07 10:31:05 +12:00
->action(function ($userId, $sessionId, $response, $dbForInternal, $events) {
2020-10-30 02:50:49 +13:00
/** @var Appwrite\Utopia\Response $response */
2021-05-07 10:31:05 +12:00
/** @var Utopia\Database\Database $dbForInternal */
2020-12-07 11:14:57 +13:00
/** @var Appwrite\Event\Event $events */
2019-05-09 18:54:39 +12:00
2021-05-07 10:31:05 +12:00
$user = $dbForInternal->getDocument('users', $userId);
2019-05-09 18:54:39 +12:00
2021-05-07 10:31:05 +12:00
if (empty($user->getId())) {
2020-06-30 23:09:28 +12:00
throw new Exception('User not found', 404);
}
2019-05-09 18:54:39 +12:00
2021-02-20 02:59:36 +13:00
$sessions = $user->getAttribute('sessions', []);
2021-05-07 10:31:05 +12:00
foreach ($sessions as $key => $session) {
2021-02-20 02:59:36 +13:00
/** @var Document $session */
2019-05-09 18:54:39 +12:00
2021-02-20 02:59:36 +13:00
if ($sessionId == $session->getId()) {
2021-05-07 10:31:05 +12:00
unset($sessions[$key]);
2020-10-31 08:53:27 +13:00
2021-05-07 10:31:05 +12:00
$user->setAttribute('sessions', $sessions);
2020-12-07 11:14:57 +13:00
$events
2021-05-07 10:31:05 +12:00
->setParam('eventData', $response->output2($user, Response::MODEL_USER))
2020-10-31 08:53:27 +13:00
;
2021-05-07 10:31:05 +12:00
$dbForInternal->updateDocument('users', $user->getId(), $user);
2019-05-09 18:54:39 +12:00
}
}
// TODO : Response filter implementation
2020-10-31 08:53:27 +13:00
$response->noContent();
2020-12-27 05:54:42 +13:00
});
2019-05-09 18:54:39 +12:00
2020-06-29 05:31:21 +12:00
App::delete('/v1/users/:userId/sessions')
2019-05-09 18:54:39 +12:00
->desc('Delete User Sessions')
2020-06-26 06:32:12 +12:00
->groups(['api', 'users'])
2020-10-31 08:53:27 +13:00
->label('event', 'users.sessions.delete')
2019-05-09 18:54:39 +12:00
->label('scope', 'users.write')
2021-04-16 19:22:17 +12:00
->label('sdk.auth', [APP_AUTH_TYPE_KEY])
2019-05-09 18:54:39 +12:00
->label('sdk.namespace', 'users')
2020-01-31 05:18:46 +13:00
->label('sdk.method', 'deleteSessions')
2019-10-09 21:31:51 +13:00
->label('sdk.description', '/docs/references/users/delete-user-sessions.md')
2020-11-12 10:02:24 +13:00
->label('sdk.response.code', Response::STATUS_CODE_NOCONTENT)
->label('sdk.response.model', Response::MODEL_NONE)
2020-09-11 02:40:14 +12:00
->param('userId', '', new UID(), 'User unique ID.')
2020-12-27 05:54:42 +13:00
->inject('response')
2021-05-07 10:31:05 +12:00
->inject('dbForInternal')
2020-12-27 05:54:42 +13:00
->inject('events')
2021-05-07 10:31:05 +12:00
->action(function ($userId, $response, $dbForInternal, $events) {
2020-10-30 02:50:49 +13:00
/** @var Appwrite\Utopia\Response $response */
2021-05-07 10:31:05 +12:00
/** @var Utopia\Database\Database $dbForInternal */
2020-12-07 11:14:57 +13:00
/** @var Appwrite\Event\Event $events */
2019-05-09 18:54:39 +12:00
2021-05-07 10:31:05 +12:00
$user = $dbForInternal->getDocument('users', $userId);
2019-05-09 18:54:39 +12:00
2021-05-07 10:31:05 +12:00
if (empty($user->getId())) {
2020-06-30 23:09:28 +12:00
throw new Exception('User not found', 404);
}
2019-05-09 18:54:39 +12:00
2021-02-20 02:59:36 +13:00
$sessions = $user->getAttribute('sessions', []);
2021-05-07 10:31:05 +12:00
$dbForInternal->updateDocument('users', $user->getId(), $user);
2019-05-09 18:54:39 +12:00
2020-12-07 11:14:57 +13:00
$events
2021-05-07 10:31:05 +12:00
->setParam('eventData', $response->output2($user, Response::MODEL_USER))
2020-10-31 08:53:27 +13:00
;
// TODO : Response filter implementation
2020-10-31 08:53:27 +13:00
$response->noContent();
2020-12-27 05:54:42 +13:00
});
App::delete('/v1/users/:userId')
->desc('Delete User')
->groups(['api', 'users'])
2020-10-31 08:53:27 +13:00
->label('event', 'users.delete')
->label('scope', 'users.write')
2021-04-16 19:22:17 +12:00
->label('sdk.auth', [APP_AUTH_TYPE_KEY])
->label('sdk.namespace', 'users')
2021-04-13 23:01:33 +12:00
->label('sdk.method', 'delete')
->label('sdk.description', '/docs/references/users/delete.md')
2020-11-12 10:02:24 +13:00
->label('sdk.response.code', Response::STATUS_CODE_NOCONTENT)
->label('sdk.response.model', Response::MODEL_NONE)
->param('userId', '', function () {return new UID();}, 'User unique ID.')
2020-12-27 05:54:42 +13:00
->inject('response')
2021-05-07 10:31:05 +12:00
->inject('dbForInternal')
2020-12-27 05:54:42 +13:00
->inject('events')
->inject('deletes')
2021-05-07 10:31:05 +12:00
->action(function ($userId, $response, $dbForInternal, $events, $deletes) {
2020-10-30 02:50:49 +13:00
/** @var Appwrite\Utopia\Response $response */
2021-05-07 10:31:05 +12:00
/** @var Utopia\Database\Database $dbForInternal */
2020-12-07 11:14:57 +13:00
/** @var Appwrite\Event\Event $events */
/** @var Appwrite\Event\Event $deletes */
2021-05-07 10:31:05 +12:00
$user = $dbForInternal->getDocument('users', $userId);
2021-05-07 10:31:05 +12:00
if ($user->isEmpty()) {
throw new Exception('User not found', 404);
}
2021-05-07 10:31:05 +12:00
if (!$dbForInternal->deleteDocument('users', $userId)) {
throw new Exception('Failed to remove user from DB', 500);
}
2021-05-07 10:31:05 +12:00
// $dbForInternal->createDocument('users', new Document([
// '$id' => $userId,
// '$read' => ['*'],
// ]));
2020-10-31 08:53:27 +13:00
$deletes
2020-12-19 03:05:15 +13:00
->setParam('type', DELETE_TYPE_DOCUMENT)
2020-10-31 08:53:27 +13:00
->setParam('document', $user)
;
2020-12-07 11:14:57 +13:00
$events
2021-05-07 10:31:05 +12:00
->setParam('eventData', $response->output2($user, Response::MODEL_USER))
2020-10-31 08:53:27 +13:00
;
// TODO : Response filter implementation
$response->noContent();
2020-12-27 05:54:42 +13:00
});