diff --git a/app/controllers/api/account.php b/app/controllers/api/account.php index a0acc542c7..6c3d4924c4 100644 --- a/app/controllers/api/account.php +++ b/app/controllers/api/account.php @@ -739,30 +739,49 @@ App::get('/v1/account/logs') $dd->parse(); + $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] = [ 'event' => $log['event'], 'ip' => $log['ip'], 'time' => \strtotime($log['time']), - 'OS' => $dd->getOs(), - 'client' => $dd->getClient(), - 'device' => $dd->getDevice(), - 'brand' => $dd->getBrand(), - 'model' => $dd->getModel(), - 'geo' => [], + + '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(), ]; try { $record = $geodb->country($log['ip']); - $output[$i]['geo']['isoCode'] = \strtolower($record->country->isoCode); - $output[$i]['geo']['country'] = $record->country->name; - $output[$i]['geo']['country'] = (isset($countries[$record->country->isoCode])) ? $countries[$record->country->isoCode] : $locale->getText('locale.country.unknown'); + $output[$i]['countryCode'] = \strtolower($record->country->isoCode); + $output[$i]['countryName'] = (isset($countries[$record->country->isoCode])) ? $countries[$record->country->isoCode] : $locale->getText('locale.country.unknown'); } catch (\Exception $e) { - $output[$i]['geo']['isoCode'] = '--'; - $output[$i]['geo']['country'] = $locale->getText('locale.country.unknown'); + $output[$i]['countryCode'] = '--'; + $output[$i]['countryName'] = $locale->getText('locale.country.unknown'); } } - $response->json($output); + $response->dynamic(new Document(['logs' => $output]), Response::MODEL_LOG_LIST); }, ['response', 'register', 'project', 'user', 'locale', 'geodb']); App::patch('/v1/account/name') diff --git a/app/controllers/api/locale.php b/app/controllers/api/locale.php index e528cce2f1..e2d4d3c3b1 100644 --- a/app/controllers/api/locale.php +++ b/app/controllers/api/locale.php @@ -77,7 +77,7 @@ App::get('/v1/locale/countries') $list = $locale->getText('countries'); /* @var $list array */ - \asort($list); + \asort($list); // sort by abc per language $response->json($list); }, ['response', 'locale']); @@ -166,9 +166,9 @@ App::get('/v1/locale/currencies') ->action(function ($response) { /** @var Appwrite\Utopia\Response $response */ - $currencies = Config::getParam('locale-currencies'); + $list = Config::getParam('locale-currencies'); - $response->json($currencies); + $response->json($list); }, ['response']); @@ -183,7 +183,7 @@ App::get('/v1/locale/languages') ->action(function ($response) { /** @var Appwrite\Utopia\Response $response */ - $languages = Config::getParam('locale-languages'); + $list = Config::getParam('locale-languages'); - $response->json($languages); + $response->json($list); }, ['response']); \ No newline at end of file diff --git a/app/controllers/api/users.php b/app/controllers/api/users.php index 01fc7d976a..19f1375f57 100644 --- a/app/controllers/api/users.php +++ b/app/controllers/api/users.php @@ -251,30 +251,50 @@ App::get('/v1/users/:userId/logs') $dd->parse(); + $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] = [ 'event' => $log['event'], 'ip' => $log['ip'], 'time' => \strtotime($log['time']), - 'OS' => $dd->getOs(), - 'client' => $dd->getClient(), - 'device' => $dd->getDevice(), - 'brand' => $dd->getBrand(), - 'model' => $dd->getModel(), - 'geo' => [], + + '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(), ]; try { $record = $geodb->country($log['ip']); - $output[$i]['geo']['isoCode'] = \strtolower($record->country->isoCode); - $output[$i]['geo']['country'] = $record->country->name; - $output[$i]['geo']['country'] = (isset($countries[$record->country->isoCode])) ? $countries[$record->country->isoCode] : $locale->getText('locale.country.unknown'); + $output[$i]['countryCode'] = \strtolower($record->country->isoCode); + $output[$i]['countryName'] = (isset($countries[$record->country->isoCode])) ? $countries[$record->country->isoCode] : $locale->getText('locale.country.unknown'); } catch (\Exception $e) { - $output[$i]['geo']['isoCode'] = '--'; - $output[$i]['geo']['country'] = $locale->getText('locale.country.unknown'); + $output[$i]['countryCode'] = '--'; + $output[$i]['countryName'] = $locale->getText('locale.country.unknown'); } } - $response->json($output); + $response->dynamic(new Document(['logs' => $output]), Response::MODEL_LOG_LIST); }, ['response', 'register', 'project', 'projectDB', 'locale', 'geodb']); App::patch('/v1/users/:userId/status') diff --git a/app/views/console/account/index.phtml b/app/views/console/account/index.phtml index 1dbc35683e..f20cb7aef6 100644 --- a/app/views/console/account/index.phtml +++ b/app/views/console/account/index.phtml @@ -289,17 +289,17 @@ IP - + - - + + - - + + diff --git a/app/views/console/users/user.phtml b/app/views/console/users/user.phtml index 4fffe1a887..97c69e54ca 100644 --- a/app/views/console/users/user.phtml +++ b/app/views/console/users/user.phtml @@ -234,18 +234,18 @@ IP - + - - -
Unknown
+ + +
Unknown
- - + + diff --git a/src/Appwrite/Utopia/Response.php b/src/Appwrite/Utopia/Response.php index 7d14c8247e..5cc4af1963 100644 --- a/src/Appwrite/Utopia/Response.php +++ b/src/Appwrite/Utopia/Response.php @@ -29,6 +29,7 @@ class Response extends SwooleResponse { // General const MODEL_LOG = 'log'; // - Missing + const MODEL_LOG_LIST = 'logList'; // - Missing const MODEL_ERROR = 'error'; const MODEL_ERROR_DEV = 'errorDev'; const MODEL_BASE_LIST = 'baseList'; @@ -97,6 +98,7 @@ class Response extends SwooleResponse // Lists ->setModel(new BaseList('Users List', self::MODEL_USER_LIST, 'users', self::MODEL_USER)) ->setModel(new BaseList('Sessions List', self::MODEL_SESSION_LIST, 'sessions', self::MODEL_SESSION)) + ->setModel(new BaseList('Logs List', self::MODEL_LOG_LIST, 'logs', self::MODEL_LOG, false)) ->setModel(new BaseList('Files List', self::MODEL_FILE_LIST, 'files', self::MODEL_FILE)) ->setModel(new BaseList('Teams List', self::MODEL_TEAM_LIST, 'teams', self::MODEL_TEAM)) ->setModel(new BaseList('Memberships List', self::MODEL_MEMBERSHIP_LIST, 'memberships', self::MODEL_MEMBERSHIP)) diff --git a/src/Appwrite/Utopia/Response/Model/BaseList.php b/src/Appwrite/Utopia/Response/Model/BaseList.php index edf0545573..2f30b1838a 100644 --- a/src/Appwrite/Utopia/Response/Model/BaseList.php +++ b/src/Appwrite/Utopia/Response/Model/BaseList.php @@ -17,24 +17,24 @@ class BaseList extends Model */ protected $type = ''; - public function __construct(string $name, string $type, string $key, string $model) + public function __construct(string $name, string $type, string $key, string $model, bool $paging = true) { $this->name = $name; $this->type = $type; - $this - ->addRule('sum', [ + if($paging) { + $this->addRule('sum', [ 'type' => 'integer', 'description' => 'Total sum of items in the list.', 'example' => '5', - ]) - ->addRule($key, [ - 'type' => $model, - 'description' => 'List of '.$key.'.', - 'example' => [], - 'array' => true, - ]) - ; + ]); + } + $this->addRule($key, [ + 'type' => $model, + 'description' => 'List of '.$key.'.', + 'example' => [], + 'array' => true, + ]); } /** diff --git a/src/Appwrite/Utopia/Response/Model/Log.php b/src/Appwrite/Utopia/Response/Model/Log.php index 93e7e88efd..d1a8b3bba0 100644 --- a/src/Appwrite/Utopia/Response/Model/Log.php +++ b/src/Appwrite/Utopia/Response/Model/Log.php @@ -18,7 +18,7 @@ class Log extends Model */ public function getName():string { - return 'Session'; + return 'Log'; } /** @@ -28,6 +28,6 @@ class Log extends Model */ public function getType():string { - return Response::MODEL_LOCALE; + return Response::MODEL_LOG; } } \ No newline at end of file diff --git a/tests/e2e/Services/Account/AccountBase.php b/tests/e2e/Services/Account/AccountBase.php index 539fb4a743..1d09a524a9 100644 --- a/tests/e2e/Services/Account/AccountBase.php +++ b/tests/e2e/Services/Account/AccountBase.php @@ -291,59 +291,53 @@ trait AccountBase ])); $this->assertEquals($response['headers']['status-code'], 200); - $this->assertIsArray($response['body']); - $this->assertNotEmpty($response['body']); - $this->assertCount(2, $response['body']); + $this->assertIsArray($response['body']['logs']); + $this->assertNotEmpty($response['body']['logs']); + $this->assertCount(2, $response['body']['logs']); - $this->assertEquals('account.sessions.create', $response['body'][0]['event']); - $this->assertEquals($response['body'][0]['ip'], filter_var($response['body'][0]['ip'], FILTER_VALIDATE_IP)); - $this->assertIsNumeric($response['body'][0]['time']); + $this->assertEquals('account.sessions.create', $response['body']['logs'][0]['event']); + $this->assertEquals($response['body']['logs'][0]['ip'], filter_var($response['body']['logs'][0]['ip'], FILTER_VALIDATE_IP)); + $this->assertIsNumeric($response['body']['logs'][0]['time']); - $this->assertIsArray($response['body'][0]['OS']); - $this->assertEquals('Windows', $response['body'][0]['OS']['name']); - $this->assertEquals('WIN', $response['body'][0]['OS']['short_name']); - $this->assertEquals('10', $response['body'][0]['OS']['version']); - $this->assertEquals('x64', $response['body'][0]['OS']['platform']); + $this->assertEquals('Windows', $response['body']['logs'][0]['osName']); + $this->assertEquals('WIN', $response['body']['logs'][0]['osCode']); + $this->assertEquals('10', $response['body']['logs'][0]['osVersion']); - $this->assertIsArray($response['body'][0]['client']); - $this->assertEquals('browser', $response['body'][0]['client']['type']); - $this->assertEquals('Chrome', $response['body'][0]['client']['name']); - $this->assertEquals('CH', $response['body'][0]['client']['short_name']); // FIXME (v1) key name should be camelcase - $this->assertEquals('70.0', $response['body'][0]['client']['version']); - $this->assertEquals('Blink', $response['body'][0]['client']['engine']); - $this->assertEquals(0, $response['body'][0]['device']); - $this->assertEquals('', $response['body'][0]['brand']); - $this->assertEquals('', $response['body'][0]['model']); - $this->assertEquals($response['body'][0]['ip'], filter_var($response['body'][0]['ip'], FILTER_VALIDATE_IP)); + $this->assertEquals('browser', $response['body']['logs'][0]['clientType']); + $this->assertEquals('Chrome', $response['body']['logs'][0]['clientName']); + $this->assertEquals('CH', $response['body']['logs'][0]['clientCode']); // FIXME (v1) key name should be camelcase + $this->assertEquals('70.0', $response['body']['logs'][0]['clientVersion']); + $this->assertEquals('Blink', $response['body']['logs'][0]['clientEngine']); + + $this->assertEquals('desktop', $response['body']['logs'][0]['deviceName']); + $this->assertEquals('', $response['body']['logs'][0]['deviceBrand']); + $this->assertEquals('', $response['body']['logs'][0]['deviceModel']); + $this->assertEquals($response['body']['logs'][0]['ip'], filter_var($response['body']['logs'][0]['ip'], FILTER_VALIDATE_IP)); - $this->assertIsArray($response['body'][0]['geo']); - $this->assertEquals('--', $response['body'][0]['geo']['isoCode']); - $this->assertEquals('Unknown', $response['body'][0]['geo']['country']); + $this->assertEquals('--', $response['body']['logs'][0]['countryCode']); + $this->assertEquals('Unknown', $response['body']['logs'][0]['countryName']); - $this->assertEquals('account.create', $response['body'][1]['event']); - $this->assertEquals($response['body'][1]['ip'], filter_var($response['body'][0]['ip'], FILTER_VALIDATE_IP)); - $this->assertIsNumeric($response['body'][1]['time']); + $this->assertEquals('account.create', $response['body']['logs'][1]['event']); + $this->assertEquals($response['body']['logs'][1]['ip'], filter_var($response['body']['logs'][1]['ip'], FILTER_VALIDATE_IP)); + $this->assertIsNumeric($response['body']['logs'][1]['time']); - $this->assertIsArray($response['body'][1]['OS']); - $this->assertEquals('Windows', $response['body'][1]['OS']['name']); - $this->assertEquals('WIN', $response['body'][1]['OS']['short_name']); - $this->assertEquals('10', $response['body'][1]['OS']['version']); - $this->assertEquals('x64', $response['body'][1]['OS']['platform']); + $this->assertEquals('Windows', $response['body']['logs'][1]['osName']); + $this->assertEquals('WIN', $response['body']['logs'][1]['osCode']); + $this->assertEquals('10', $response['body']['logs'][1]['osVersion']); - $this->assertIsArray($response['body'][1]['client']); - $this->assertEquals('browser', $response['body'][1]['client']['type']); - $this->assertEquals('Chrome', $response['body'][1]['client']['name']); - $this->assertEquals('CH', $response['body'][1]['client']['short_name']); // FIXME (v1) key name should be camelcase - $this->assertEquals('70.0', $response['body'][1]['client']['version']); - $this->assertEquals('Blink', $response['body'][1]['client']['engine']); - $this->assertEquals(0, $response['body'][1]['device']); - $this->assertEquals('', $response['body'][1]['brand']); - $this->assertEquals('', $response['body'][1]['model']); - $this->assertEquals($response['body'][1]['ip'], filter_var($response['body'][0]['ip'], FILTER_VALIDATE_IP)); + $this->assertEquals('browser', $response['body']['logs'][1]['clientType']); + $this->assertEquals('Chrome', $response['body']['logs'][1]['clientName']); + $this->assertEquals('CH', $response['body']['logs'][1]['clientCode']); // FIXME (v1) key name should be camelcase + $this->assertEquals('70.0', $response['body']['logs'][1]['clientVersion']); + $this->assertEquals('Blink', $response['body']['logs'][1]['clientEngine']); + + $this->assertEquals('desktop', $response['body']['logs'][1]['deviceName']); + $this->assertEquals('', $response['body']['logs'][1]['deviceBrand']); + $this->assertEquals('', $response['body']['logs'][1]['deviceModel']); + $this->assertEquals($response['body']['logs'][1]['ip'], filter_var($response['body']['logs'][1]['ip'], FILTER_VALIDATE_IP)); - $this->assertIsArray($response['body'][1]['geo']); - $this->assertEquals('--', $response['body'][1]['geo']['isoCode']); - $this->assertEquals('Unknown', $response['body'][1]['geo']['country']); + $this->assertEquals('--', $response['body']['logs'][1]['countryCode']); + $this->assertEquals('Unknown', $response['body']['logs'][1]['countryName']); /** * Test for FAILURE