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