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

608 lines
23 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;
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\Validator\Boolean;
use Utopia\Audit\Audit;
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;
2021-07-05 23:35:15 +12:00
use Appwrite\Database\Validator\CustomId;
2019-05-09 18:54:39 +12:00
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)
->param('userId', '', new CustomId(), 'Unique Id. Choose your own unique ID or pass the string `unique()` to auto generate it. Valid chars are a-z, A-Z, 0-9, period, hyphen, and underscore. Can\'t start with a special char. Max length is 36 chars.')
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')
2021-08-16 19:56:18 +12:00
->inject('usage')
->action(function ($userId, $email, $password, $name, $response, $dbForInternal, $usage) {
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-08-16 19:56:18 +12:00
/** @var Appwrite\Stats\Stats $usage */
2020-02-05 19:31:34 +13:00
$email = \strtolower($email);
2020-02-05 19:31:34 +13:00
2020-06-30 23:09:28 +12:00
try {
2021-07-06 18:23:33 +12:00
$userId = $userId == 'unique()' ? $dbForInternal->getId() : $userId;
2021-05-07 10:31:05 +12:00
$user = $dbForInternal->createDocument('users', new Document([
'$id' => $userId,
2021-06-12 06:23:16 +12:00
'$read' => ['role:all'],
2021-05-07 10:31:05 +12:00
'$write' => ['user:'.$userId],
2020-06-30 23:09:28 +12:00
'email' => $email,
'emailVerification' => false,
'status' => true,
2020-06-30 23:09:28 +12:00
'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-08-16 19:56:18 +12:00
$usage
->setParam('users.create', 1)
;
2021-05-07 10:31:05 +12:00
$response->setStatusCode(Response::STATUS_CODE_CREATED);
2021-07-26 02:47:18 +12:00
$response->dynamic($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('after', '', new UID(), 'ID of the user used as the starting point for the query, excluding the user itself. Should be used for efficient pagination when working with large sets of data.', true)
2020-09-11 02:40:14 +12:00
->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')
2021-08-16 19:56:18 +12:00
->inject('usage')
->action(function ($search, $limit, $offset, $after, $orderType, $response, $dbForInternal, $usage) {
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-08-16 19:56:18 +12:00
/** @var Appwrite\Stats\Stats $usage */
2021-05-07 10:31:05 +12:00
2021-08-07 00:36:48 +12:00
if (!empty($after)) {
$afterUser = $dbForInternal->getDocument('users', $after);
if ($afterUser->isEmpty()) {
throw new Exception('User for after not found', 400);
}
}
$results = $dbForInternal->find('users', [], $limit, $offset, [], [$orderType], $afterUser ?? null);
2021-05-10 06:37:47 +12:00
$sum = $dbForInternal->count('users', [], APP_LIMIT_COUNT);
2021-08-16 19:56:18 +12:00
$usage
->setParam('users.read', 1)
;
2020-06-30 23:09:28 +12:00
2021-07-26 02:47:18 +12:00
$response->dynamic(new Document([
2021-05-27 22:09:14 +12:00
'users' => $results,
2021-05-07 10:31:05 +12:00
'sum' => $sum,
2020-10-31 08:53:27 +13:00
]), 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')
2021-08-16 19:56:18 +12:00
->inject('usage')
->action(function ($userId, $response, $dbForInternal, $usage) {
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-08-16 19:56:18 +12:00
/** @var Appwrite\Stats\Stats $usage */
2021-05-07 10:31:05 +12:00
$user = $dbForInternal->getDocument('users', $userId);
2021-06-21 01:59:36 +12:00
if ($user->isEmpty()) {
2020-06-30 23:09:28 +12:00
throw new Exception('User not found', 404);
}
2021-08-16 19:56:18 +12:00
$usage
->setParam('users.read', 1)
;
2021-07-26 02:47:18 +12:00
$response->dynamic($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')
2021-08-16 19:56:18 +12:00
->inject('usage')
->action(function ($userId, $response, $dbForInternal, $usage) {
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-08-16 19:56:18 +12:00
/** @var Appwrite\Stats\Stats $usage */
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-06-21 01:59:36 +12:00
if ($user->isEmpty()) {
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-08-16 19:56:18 +12:00
$usage
->setParam('users.read', 1)
;
2021-07-26 02:47:18 +12:00
$response->dynamic(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-08-16 19:56:18 +12:00
->inject('usage')
->action(function ($userId, $response, $dbForInternal, $locale, $usage) {
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 */
2021-08-16 19:56:18 +12:00
/** @var Appwrite\Stats\Stats $usage */
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-06-21 01:59:36 +12:00
if ($user->isEmpty()) {
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
2021-02-20 01:12:47 +13:00
foreach ($sessions as $key => $session) {
/** @var Document $session */
2019-05-09 18:54:39 +12:00
2021-07-23 08:15:01 +12:00
$countryName = $locale->getText('countries.'.strtolower($session->getAttribute('countryCode')), $locale->getText('locale.country.unknown'));
$session->setAttribute('countryName', $countryName);
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-08-16 19:56:18 +12:00
$usage
->setParam('users.read', 1)
;
2021-07-26 02:47:18 +12:00
$response->dynamic(new Document([
2021-05-27 22:09:14 +12:00
'sessions' => $sessions,
2020-10-31 08:53:27 +13:00
'sum' => count($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')
2021-05-07 10:31:05 +12:00
->inject('dbForInternal')
2020-12-27 05:54:42 +13:00
->inject('locale')
->inject('geodb')
2021-08-16 19:56:18 +12:00
->inject('usage')
->action(function ($userId, $response, $dbForInternal, $locale, $geodb, $usage) {
2020-10-30 02:50:49 +13:00
/** @var Appwrite\Utopia\Response $response */
2021-07-26 02:47:18 +12:00
/** @var Utopia\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 */
2021-08-16 19:56:18 +12:00
/** @var Appwrite\Stats\Stats $usage */
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-06-21 01:59:36 +12:00
if ($user->isEmpty()) {
2020-06-30 23:09:28 +12:00
throw new Exception('User not found', 404);
}
2019-05-09 18:54:39 +12:00
2021-06-07 17:17:29 +12:00
$audit = new Audit($dbForInternal);
2020-06-30 23:09:28 +12:00
2021-06-18 06:21:22 +12:00
$logs = $audit->getLogsByUserAndEvents($user->getId(), [
2020-06-30 23:09:28 +12:00
'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'],
2021-06-13 06:39:59 +12:00
'time' => $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) {
2021-07-26 19:05:08 +12:00
$output[$i]['countryCode'] = $locale->getText('countries.'.strtolower($record['country']['iso_code']), false) ? \strtolower($record['country']['iso_code']) : '--';
2021-07-23 08:15:01 +12:00
$output[$i]['countryName'] = $locale->getText('countries.'.strtolower($record['country']['iso_code']), $locale->getText('locale.country.unknown'));
2020-10-31 08:53:27 +13:00
} else {
$output[$i]['countryCode'] = '--';
$output[$i]['countryName'] = $locale->getText('locale.country.unknown');
2019-05-09 18:54:39 +12:00
}
}
2021-08-16 19:56:18 +12:00
$usage
->setParam('users.read', 1)
;
2021-07-26 02:47:18 +12:00
$response->dynamic(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.')
->param('status', null, new Boolean(true), 'User Status. To activate the user pass `true` and to block the user pass `false`')
2020-12-27 05:54:42 +13:00
->inject('response')
2021-05-07 10:31:05 +12:00
->inject('dbForInternal')
2021-08-16 19:56:18 +12:00
->inject('usage')
->action(function ($userId, $status, $response, $dbForInternal, $usage) {
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-08-16 19:56:18 +12:00
/** @var Appwrite\Stats\Stats $usage */
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-06-21 01:59:36 +12:00
if ($user->isEmpty()) {
2020-06-30 23:09:28 +12:00
throw new Exception('User not found', 404);
}
2019-05-09 18:54:39 +12:00
$user = $dbForInternal->updateDocument('users', $user->getId(), $user->setAttribute('status', (bool) $status));
2019-10-21 19:01:07 +13:00
2021-08-16 19:56:18 +12:00
$usage
->setParam('users.update', 1)
;
2021-07-26 02:47:18 +12:00
$response->dynamic($user, Response::MODEL_USER);
2020-12-27 05:54:42 +13:00
});
2019-05-09 18:54:39 +12:00
App::patch('/v1/users/:userId/verification')
->desc('Update Email Verification')
->groups(['api', 'users'])
->label('event', 'users.update.verification')
->label('scope', 'users.write')
->label('sdk.auth', [APP_AUTH_TYPE_KEY])
->label('sdk.namespace', 'users')
->label('sdk.method', 'updateVerification')
->label('sdk.description', '/docs/references/users/update-user-verification.md')
->label('sdk.response.code', Response::STATUS_CODE_OK)
->label('sdk.response.type', Response::CONTENT_TYPE_JSON)
->label('sdk.response.model', Response::MODEL_USER)
->param('userId', '', new UID(), 'User unique ID.')
2021-05-31 17:50:43 +12:00
->param('emailVerification', false, new Boolean(), 'User Email Verification Status.')
->inject('response')
2021-06-12 06:23:16 +12:00
->inject('dbForInternal')
2021-08-16 19:56:18 +12:00
->inject('usage')
->action(function ($userId, $emailVerification, $response, $dbForInternal, $usage) {
/** @var Appwrite\Utopia\Response $response */
/** @var Utopia\Database\Database $dbForInternal */
2021-08-16 19:56:18 +12:00
/** @var Appwrite\Stats\Stats $usage */
$user = $dbForInternal->getDocument('users', $userId);
if ($user->isEmpty()) {
throw new Exception('User not found', 404);
}
$user = $dbForInternal->updateDocument('users', $user->getId(), $user->setAttribute('emailVerification', $emailVerification));
2019-05-09 18:54:39 +12:00
2021-08-16 19:56:18 +12:00
$usage
->setParam('users.update', 1)
;
2021-07-26 02:47:18 +12:00
$response->dynamic($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')
2021-08-16 19:56:18 +12:00
->inject('usage')
->action(function ($userId, $prefs, $response, $dbForInternal, $usage) {
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-08-16 19:56:18 +12:00
/** @var Appwrite\Stats\Stats $usage */
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-08-16 19:56:18 +12:00
$usage
->setParam('users.update', 1)
;
2021-07-26 02:47:18 +12:00
$response->dynamic(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-08-16 19:56:18 +12:00
->inject('usage')
->action(function ($userId, $sessionId, $response, $dbForInternal, $events, $usage) {
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 */
2021-08-16 19:56:18 +12:00
/** @var Appwrite\Stats\Stats $usage */
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-06-21 01:59:36 +12:00
if ($user->isEmpty()) {
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-07-17 22:04:43 +12:00
foreach ($sessions as $key => $session) { /** @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-07-17 22:04:43 +12:00
$dbForInternal->deleteDocument('sessions', $session->getId());
2021-05-07 10:31:05 +12:00
$user->setAttribute('sessions', $sessions);
2020-12-07 11:14:57 +13:00
$events
2021-07-26 02:47:18 +12:00
->setParam('eventData', $response->output($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
}
}
2021-08-16 19:56:18 +12:00
$usage
->setParam('users.update', 1)
->setParam('users.sessions.delete', 1)
;
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-08-16 19:56:18 +12:00
->inject('usage')
->action(function ($userId, $response, $dbForInternal, $events, $usage) {
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 */
2021-08-16 19:56:18 +12:00
/** @var Appwrite\Stats\Stats $usage */
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-06-21 01:59:36 +12:00
if ($user->isEmpty()) {
2020-06-30 23:09:28 +12:00
throw new Exception('User not found', 404);
}
2019-05-09 18:54:39 +12:00
2021-07-17 22:04:43 +12:00
$sessions = $user->getAttribute('sessions', []);
foreach ($sessions as $key => $session) { /** @var Document $session */
$dbForInternal->deleteDocument('sessions', $session->getId());
}
2021-05-16 21:18:34 +12:00
$dbForInternal->updateDocument('users', $user->getId(), $user->getAttribute('sessions', []));
2019-05-09 18:54:39 +12:00
2020-12-07 11:14:57 +13:00
$events
2021-07-26 02:47:18 +12:00
->setParam('eventData', $response->output($user, Response::MODEL_USER))
2020-10-31 08:53:27 +13:00
;
2021-08-16 19:56:18 +12:00
$usage
->setParam('users.update', 1)
->setParam('users.sessions.delete', 1)
;
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-08-16 20:53:34 +12:00
->inject('usage')
2021-08-16 19:56:18 +12:00
->action(function ($userId, $response, $dbForInternal, $events, $deletes, $usage) {
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-08-16 19:56:18 +12:00
/** @var Appwrite\Stats\Stats $usage */
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);
}
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-07-26 02:47:18 +12:00
->setParam('eventData', $response->output($user, Response::MODEL_USER))
2020-10-31 08:53:27 +13:00
;
2021-08-16 19:56:18 +12:00
$usage
->setParam('users.delete', 1)
;
$response->noContent();
2020-12-27 05:54:42 +13:00
});