2019-05-09 18:54:39 +12:00
< ? php
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 ;
2021-03-25 06:47:43 +13:00
use Appwrite\Network\Validator\Email ;
2019-05-09 18:54:39 +12:00
use Utopia\Validator\Text ;
use Utopia\Validator\Range ;
2021-05-30 19:03:51 +12:00
use Utopia\Validator\Boolean ;
2019-12-29 22:47:55 +13:00
use Utopia\Audit\Audit ;
use Utopia\Audit\Adapters\MySQL as AuditAdapter ;
2020-03-25 06:56:32 +13:00
use Appwrite\Auth\Auth ;
use Appwrite\Auth\Validator\Password ;
use Appwrite\Database\Database ;
2020-10-31 08:53:27 +13:00
use Appwrite\Database\Document ;
2020-03-25 06:56:32 +13:00
use Appwrite\Database\Exception\Duplicate ;
use Appwrite\Database\Validator\UID ;
2020-06-23 06:38:14 +12:00
use Appwrite\Utopia\Response ;
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' )
-> inject ( 'projectDB' )
2020-06-30 23:09:28 +12:00
-> action ( function ( $email , $password , $name , $response , $projectDB ) {
2020-10-30 02:50:49 +13:00
/** @var Appwrite\Utopia\Response $response */
2020-06-30 23:09:28 +12:00
/** @var Appwrite\Database\Database $projectDB */
2021-06-04 01:03:51 +12:00
$email = \strtolower ( $email );
2020-06-30 23:09:28 +12:00
$profile = $projectDB -> getCollectionFirst ([ // Get user by email address
'limit' => 1 ,
'filters' => [
'$collection=' . Database :: SYSTEM_COLLECTION_USERS ,
'email=' . $email ,
],
]);
if ( ! empty ( $profile )) {
throw new Exception ( 'User already registered' , 409 );
}
2020-02-05 19:31:34 +13:00
2020-06-30 23:09:28 +12:00
try {
$user = $projectDB -> createDocument ([
'$collection' => Database :: SYSTEM_COLLECTION_USERS ,
'$permissions' => [
'read' => [ '*' ],
'write' => [ 'user:{self}' ],
2020-02-05 19:31:34 +13:00
],
2020-06-30 23:09:28 +12:00
'email' => $email ,
'emailVerification' => false ,
'status' => Auth :: USER_STATUS_UNACTIVATED ,
'password' => Auth :: passwordHash ( $password ),
2021-01-15 01:04:16 +13:00
'passwordUpdate' => \time (),
2020-06-30 23:09:28 +12:00
'registration' => \time (),
'reset' => false ,
'name' => $name ,
], [ 'email' => $email ]);
} catch ( Duplicate $th ) {
throw new Exception ( 'Account already exists' , 409 );
}
2020-02-05 19:31:34 +13:00
2020-10-31 21:42:41 +13:00
$response
-> setStatusCode ( Response :: STATUS_CODE_CREATED )
-> 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 ( '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' )
-> inject ( 'projectDB' )
2020-06-30 23:09:28 +12:00
-> action ( function ( $search , $limit , $offset , $orderType , $response , $projectDB ) {
2020-10-30 02:50:49 +13:00
/** @var Appwrite\Utopia\Response $response */
2020-06-30 23:09:28 +12:00
/** @var Appwrite\Database\Database $projectDB */
$results = $projectDB -> getCollection ([
'limit' => $limit ,
'offset' => $offset ,
'orderType' => $orderType ,
'search' => $search ,
'filters' => [
'$collection=' . Database :: SYSTEM_COLLECTION_USERS ,
],
]);
2020-10-31 08:53:27 +13:00
$response -> dynamic ( new Document ([
'sum' => $projectDB -> getSum (),
'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' )
2020-06-29 00:18:16 +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 ])
2020-06-29 00:18:16 +12:00
-> 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' )
-> inject ( 'projectDB' )
2020-06-30 23:09:28 +12:00
-> action ( function ( $userId , $response , $projectDB ) {
2020-10-30 02:50:49 +13:00
/** @var Appwrite\Utopia\Response $response */
2020-06-30 23:09:28 +12:00
/** @var Appwrite\Database\Database $projectDB */
2020-06-29 00:18:16 +12:00
2020-06-30 23:09:28 +12:00
$user = $projectDB -> getDocument ( $userId );
2020-07-03 09:48:37 +12:00
2020-06-30 23:09:28 +12:00
if ( empty ( $user -> getId ()) || Database :: SYSTEM_COLLECTION_USERS != $user -> getCollection ()) {
throw new Exception ( 'User not found' , 404 );
}
2020-07-03 09:48:37 +12:00
2020-10-31 08:53:27 +13: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' )
-> inject ( 'projectDB' )
2020-06-30 23:09:28 +12:00
-> action ( function ( $userId , $response , $projectDB ) {
2020-10-30 02:50:49 +13:00
/** @var Appwrite\Utopia\Response $response */
2020-06-30 23:09:28 +12:00
/** @var Appwrite\Database\Database $projectDB */
2019-05-09 18:54:39 +12:00
2020-06-30 23:09:28 +12:00
$user = $projectDB -> getDocument ( $userId );
2019-05-09 18:54:39 +12:00
2020-06-30 23:09:28 +12:00
if ( empty ( $user -> getId ()) || Database :: SYSTEM_COLLECTION_USERS != $user -> getCollection ()) {
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-04-22 01:37:51 +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' )
-> inject ( 'projectDB' )
-> inject ( 'locale' )
2020-10-31 08:53:27 +13:00
-> action ( function ( $userId , $response , $projectDB , $locale ) {
2020-10-30 02:50:49 +13:00
/** @var Appwrite\Utopia\Response $response */
2020-06-30 23:09:28 +12:00
/** @var Appwrite\Database\Database $projectDB */
/** @var Utopia\Locale\Locale $locale */
2019-05-09 18:54:39 +12:00
2020-06-30 23:09:28 +12:00
$user = $projectDB -> getDocument ( $userId );
if ( empty ( $user -> getId ()) || Database :: SYSTEM_COLLECTION_USERS != $user -> getCollection ()) {
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
2021-03-29 22:07:18 +13: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
}
2020-10-31 08:53:27 +13:00
$response -> dynamic ( new Document ([
'sum' => count ( $sessions ),
'sessions' => $sessions
]), Response :: MODEL_SESSION_LIST );
}, [ 'response' , 'projectDB' , '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' )
-> inject ( 'projectDB' )
-> inject ( 'locale' )
-> inject ( 'geodb' )
2020-07-03 08:24:14 +12:00
-> action ( function ( $userId , $response , $register , $project , $projectDB , $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 */
/** @var Appwrite\Database\Database $projectDB */
/** @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
$user = $projectDB -> getDocument ( $userId );
if ( empty ( $user -> getId ()) || Database :: SYSTEM_COLLECTION_USERS != $user -> getCollection ()) {
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
}
}
2020-10-31 08:53:27 +13: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.' )
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' )
-> inject ( 'projectDB' )
2020-06-30 23:09:28 +12:00
-> action ( function ( $userId , $status , $response , $projectDB ) {
2020-10-30 02:50:49 +13:00
/** @var Appwrite\Utopia\Response $response */
2020-06-30 23:09:28 +12:00
/** @var Appwrite\Database\Database $projectDB */
2019-05-09 18:54:39 +12:00
2020-06-30 23:09:28 +12:00
$user = $projectDB -> getDocument ( $userId );
2019-05-09 18:54:39 +12:00
2020-06-30 23:09:28 +12:00
if ( empty ( $user -> getId ()) || Database :: SYSTEM_COLLECTION_USERS != $user -> getCollection ()) {
throw new Exception ( 'User not found' , 404 );
}
2019-05-09 18:54:39 +12:00
2020-06-30 23:09:28 +12:00
$user = $projectDB -> updateDocument ( \array_merge ( $user -> getArrayCopy (), [
'status' => ( int ) $status ,
]));
2019-10-21 19:01:07 +13:00
2021-05-30 19:03:51 +12:00
if ( false === $user ) {
throw new Exception ( 'Failed saving user to DB' , 500 );
}
$response -> dynamic ( $user , Response :: MODEL_USER );
});
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.' )
2021-05-30 19:03:51 +12:00
-> inject ( 'response' )
-> inject ( 'projectDB' )
2021-05-31 17:50:43 +12:00
-> action ( function ( $userId , $emailVerification , $response , $projectDB ) {
2021-05-30 19:03:51 +12:00
/** @var Appwrite\Utopia\Response $response */
/** @var Appwrite\Database\Database $projectDB */
$user = $projectDB -> getDocument ( $userId );
if ( empty ( $user -> getId ()) || Database :: SYSTEM_COLLECTION_USERS != $user -> getCollection ()) {
throw new Exception ( 'User not found' , 404 );
}
$user = $projectDB -> updateDocument ( \array_merge ( $user -> getArrayCopy (), [
2021-05-31 17:50:43 +12:00
'emailVerification' => $emailVerification ,
2021-05-30 19:03:51 +12:00
]));
2020-06-30 23:09:28 +12:00
if ( false === $user ) {
throw new Exception ( 'Failed saving user to DB' , 500 );
}
2019-05-09 18:54:39 +12:00
2020-10-31 08:53:27 +13: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' )
2019-10-05 10:04:49 +13:00
-> label ( 'scope' , 'users.write' )
2021-04-16 19:22:17 +12:00
-> label ( 'sdk.auth' , [ APP_AUTH_TYPE_KEY ])
2019-10-05 10:04:49 +13:00
-> 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' )
-> inject ( 'projectDB' )
2020-06-30 23:09:28 +12:00
-> action ( function ( $userId , $prefs , $response , $projectDB ) {
2020-10-30 02:50:49 +13:00
/** @var Appwrite\Utopia\Response $response */
2020-06-30 23:09:28 +12:00
/** @var Appwrite\Database\Database $projectDB */
2019-10-05 10:04:49 +13:00
2020-06-30 23:09:28 +12:00
$user = $projectDB -> getDocument ( $userId );
2019-10-05 10:04:49 +13:00
2020-06-30 23:09:28 +12:00
if ( empty ( $user -> getId ()) || Database :: SYSTEM_COLLECTION_USERS != $user -> getCollection ()) {
throw new Exception ( 'User not found' , 404 );
}
2020-01-20 09:38:00 +13:00
2020-06-30 23:09:28 +12:00
$user = $projectDB -> updateDocument ( \array_merge ( $user -> getArrayCopy (), [
2020-10-31 08:53:27 +13:00
'prefs' => $prefs ,
2020-06-30 23:09:28 +12:00
]));
2019-10-05 10:04:49 +13:00
2020-06-30 23:09:28 +12:00
if ( false === $user ) {
throw new Exception ( 'Failed saving user to DB' , 500 );
}
2019-10-21 19:01:07 +13:00
2021-04-22 01:37:51 +12:00
$response -> dynamic ( new Document ( $prefs ), Response :: MODEL_PREFERENCES );
2020-12-27 05:54:42 +13:00
});
2019-10-05 10:04:49 +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' )
-> inject ( 'projectDB' )
-> inject ( 'events' )
2020-12-07 11:14:57 +13:00
-> action ( function ( $userId , $sessionId , $response , $projectDB , $events ) {
2020-10-30 02:50:49 +13:00
/** @var Appwrite\Utopia\Response $response */
2020-06-30 23:09:28 +12:00
/** @var Appwrite\Database\Database $projectDB */
2020-12-07 11:14:57 +13:00
/** @var Appwrite\Event\Event $events */
2019-05-09 18:54:39 +12:00
2020-06-30 23:09:28 +12:00
$user = $projectDB -> getDocument ( $userId );
2019-05-09 18:54:39 +12:00
2020-06-30 23:09:28 +12:00
if ( empty ( $user -> getId ()) || Database :: SYSTEM_COLLECTION_USERS != $user -> getCollection ()) {
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' , []);
foreach ( $sessions as $session ) {
/** @var Document $session */
2019-05-09 18:54:39 +12:00
2021-02-20 02:59:36 +13:00
if ( $sessionId == $session -> getId ()) {
if ( ! $projectDB -> deleteDocument ( $session -> getId ())) {
2020-06-30 23:09:28 +12:00
throw new Exception ( 'Failed to remove token from DB' , 500 );
2019-05-09 18:54:39 +12:00
}
2020-10-31 08:53:27 +13:00
2020-12-07 11:14:57 +13:00
$events
2021-03-30 07:00:10 +13:00
-> setParam ( 'eventData' , $response -> output ( $user , Response :: MODEL_USER ))
2020-10-31 08:53:27 +13:00
;
2019-05-09 18:54:39 +12:00
}
}
2020-12-28 22:51:45 +13: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' )
-> inject ( 'projectDB' )
-> inject ( 'events' )
2020-12-07 11:14:57 +13:00
-> action ( function ( $userId , $response , $projectDB , $events ) {
2020-10-30 02:50:49 +13:00
/** @var Appwrite\Utopia\Response $response */
2020-06-30 23:09:28 +12:00
/** @var Appwrite\Database\Database $projectDB */
2020-12-07 11:14:57 +13:00
/** @var Appwrite\Event\Event $events */
2019-05-09 18:54:39 +12:00
2020-06-30 23:09:28 +12:00
$user = $projectDB -> getDocument ( $userId );
2019-05-09 18:54:39 +12:00
2020-06-30 23:09:28 +12:00
if ( empty ( $user -> getId ()) || Database :: SYSTEM_COLLECTION_USERS != $user -> getCollection ()) {
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' , []);
foreach ( $sessions as $session ) {
/** @var Document $session */
2019-05-09 18:54:39 +12:00
2021-02-20 02:59:36 +13:00
if ( ! $projectDB -> deleteDocument ( $session -> getId ())) {
2020-06-30 23:09:28 +12:00
throw new Exception ( 'Failed to remove token from DB' , 500 );
2019-05-09 18:54:39 +12:00
}
}
2020-12-07 11:14:57 +13:00
$events
2021-03-30 07:00:10 +13:00
-> setParam ( 'eventData' , $response -> output ( $user , Response :: MODEL_USER ))
2020-10-31 08:53:27 +13:00
;
2020-12-28 22:51:45 +13:00
// TODO : Response filter implementation
2020-10-31 08:53:27 +13:00
$response -> noContent ();
2020-12-27 05:54:42 +13:00
});
2020-08-30 08:40:40 +12:00
App :: delete ( '/v1/users/:userId' )
-> desc ( 'Delete User' )
-> groups ([ 'api' , 'users' ])
2020-10-31 08:53:27 +13:00
-> label ( 'event' , 'users.delete' )
2020-08-30 08:40:40 +12:00
-> label ( 'scope' , 'users.write' )
2021-04-16 19:22:17 +12:00
-> label ( 'sdk.auth' , [ APP_AUTH_TYPE_KEY ])
2020-08-30 08:40:40 +12:00
-> 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 )
2020-08-30 08:40:40 +12:00
-> param ( 'userId' , '' , function () { return new UID ();}, 'User unique ID.' )
2020-12-27 05:54:42 +13:00
-> inject ( 'response' )
-> inject ( 'projectDB' )
-> inject ( 'events' )
-> inject ( 'deletes' )
2020-12-07 11:14:57 +13:00
-> action ( function ( $userId , $response , $projectDB , $events , $deletes ) {
2020-10-30 02:50:49 +13:00
/** @var Appwrite\Utopia\Response $response */
2020-08-30 08:40:40 +12:00
/** @var Appwrite\Database\Database $projectDB */
2020-12-07 11:14:57 +13:00
/** @var Appwrite\Event\Event $events */
2020-08-30 08:40:40 +12:00
/** @var Appwrite\Event\Event $deletes */
$user = $projectDB -> getDocument ( $userId );
if ( empty ( $user -> getId ()) || Database :: SYSTEM_COLLECTION_USERS != $user -> getCollection ()) {
throw new Exception ( 'User not found' , 404 );
}
if ( ! $projectDB -> deleteDocument ( $userId )) {
throw new Exception ( 'Failed to remove user from DB' , 500 );
}
if ( ! $projectDB -> deleteUniqueKey ( md5 ( 'users:email=' . $user -> getAttribute ( 'email' , null )))) {
throw new Exception ( 'Failed to remove unique key from DB' , 500 );
}
$reservedId = $projectDB -> createDocument ([
'$collection' => Database :: SYSTEM_COLLECTION_RESERVED ,
'$id' => $userId ,
'$permissions' => [
'read' => [ '*' ],
],
]);
if ( false === $reservedId ) {
throw new Exception ( 'Failed saving reserved id to DB' , 500 );
2019-05-09 18:54:39 +12:00
}
2020-08-30 08:40:40 +12:00
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-03-30 07:00:10 +13:00
-> setParam ( 'eventData' , $response -> output ( $user , Response :: MODEL_USER ))
2020-10-31 08:53:27 +13:00
;
2020-08-30 08:40:40 +12:00
2020-12-28 22:51:45 +13:00
// TODO : Response filter implementation
2020-08-30 08:40:40 +12:00
$response -> noContent ();
2020-12-27 05:54:42 +13:00
});