1
0
Fork 0
mirror of synced 2024-09-29 08:51:28 +13:00

Added log response model

This commit is contained in:
Eldad Fux 2020-09-05 22:04:35 +03:00
parent 3f77152b9a
commit 4f629b80bd
9 changed files with 133 additions and 98 deletions

View file

@ -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')

View file

@ -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']);

View file

@ -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')

View file

@ -289,17 +289,17 @@
<th width="90">IP</th>
</tr>
</thead>
<tbody data-ls-loop="securityLogs" data-ls-as="log">
<tbody data-ls-loop="securityLogs.logs" data-ls-as="log">
<tr>
<td data-title="Date: "><span data-ls-bind="{{log.time|dateTime}}"></span></td>
<td data-title="Event: "><span data-ls-bind="{{log.event}}"></span></td>
<td data-title="Client: ">
<img data-ls-attrs="src={{env.API}}/avatars/browsers/{{log.client.short_name|lowercase}}?width=80&height=80&project={{env.PROJECT}},title={{log.client.name}},alt={{log.client.name}}" class="avatar xxs inline margin-end-small" />
<span data-ls-bind="{{log.client.name}} {{log.client.version}} on {{log.model}} {{log.OS.name}} {{log.OS.version}}"></span>
<img data-ls-attrs="src={{env.API}}/avatars/browsers/{{log.clientCode|lowercase}}?width=80&height=80&project={{env.PROJECT}},title={{log.clientName}},alt={{log.clientName}}" class="avatar xxs inline margin-end-small" />
<span data-ls-bind="{{log.clientName}} {{log.clientVersion}} on {{log.model}} {{log.osName}} {{log.osVersion}}"></span>
</td>
<td data-title="Location: ">
<img data-ls-if="{{session.countryCode}} !== '--'" data-ls-attrs="src={{env.API}}/avatars/flags/{{log.geo.isoCode}}?width=80&height=80&project={{env.PROJECT}}" class="avatar xxs inline" style="margin-top: 10px;" />
<span data-ls-bind="{{log.geo.country}}"></span>
<img data-ls-if="{{log.countryCode}} !== '--'" data-ls-attrs="src={{env.API}}/avatars/flags/{{log.countryCode}}?width=80&height=80&project={{env.PROJECT}}" class="avatar xxs inline" style="margin-top: 10px;" />
<span data-ls-bind="{{log.countryName}}"></span>
</td>
<td data-title="IP: "><span data-ls-bind="{{log.ip}}"></span></td>
</tr>

View file

@ -234,18 +234,18 @@
<th width="90">IP</th>
</tr>
</thead>
<tbody data-ls-loop="logs" data-ls-as="log">
<tbody data-ls-loop="logs.logs" data-ls-as="log">
<tr>
<td data-title="Date: "><span data-ls-bind="{{log.time|dateTime}}"></span></td>
<td data-title="Event: "><span data-ls-bind="{{log.event}}"></span></td>
<td data-title="Client: ">
<img data-ls-if="({{log.client.short_name}})" data-ls-attrs="src={{env.API}}/avatars/browsers/{{log.client.short_name|lowercase}}?width=80&height=80&project={{env.PROJECT}},title={{log.client.name}},alt={{log.client.name}}" class="avatar xxs inline margin-end-small" />
<span data-ls-if="({{log.client.name}})" data-ls-bind="{{log.client.name}} {{log.client.version}} on {{log.model}} {{log.OS.name}} {{log.OS.version}}"></span>
<div data-ls-if="(!{{log.client.name}})" class="text-align-center text-fade">Unknown</div>
<img data-ls-if="({{log.clientCode}})" data-ls-attrs="src={{env.API}}/avatars/browsers/{{log.clientCode|lowercase}}?width=80&height=80&project={{env.PROJECT}},title={{log.clientName}},alt={{log.clientName}}" class="avatar xxs inline margin-end-small" />
<span data-ls-if="({{log.clientName}})" data-ls-bind="{{log.clientName}} {{log.clientVersion}} on {{log.model}} {{log.osName}} {{log.osVersion}}"></span>
<div data-ls-if="(!{{log.clientName}})" class="text-align-center text-fade">Unknown</div>
</td>
<td data-title="Location: ">
<img data-ls-if="{{session.countryCode}} !== '--'" data-ls-attrs="src={{env.API}}/avatars/flags/{{log.geo.isoCode}}?width=80&height=80&project={{env.PROJECT}}" class="avatar xxs inline margin-end-small" />
<span data-ls-bind="{{log.geo.country}}"></span>
<img data-ls-if="{{log.countryCode}} !== '--'" data-ls-attrs="src={{env.API}}/avatars/flags/{{log.countryCode}}?width=80&height=80&project={{env.PROJECT}}" class="avatar xxs inline margin-end-small" />
<span data-ls-bind="{{log.countryName}}"></span>
</td>
<td data-title="IP: "><span data-ls-bind="{{log.ip}}"></span></td>
</tr>

View file

@ -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))

View file

@ -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,
]);
}
/**

View file

@ -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;
}
}

View file

@ -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