<?php
namespace Lagdo\Polr\Admin\App;
use Valitron\Validator;
use Jaxon\Sentry\Armada as JaxonClass;
class User extends JaxonClass
{
public function selectEndpoint($endpoint)
{
$endpoint = trim($endpoint);
// Validate the new endpoint
if(!$this->validator->validateEndpoint($endpoint))
{
$this->notify->error('The endpoint id is not valid.', 'Error');
return $this->response;
}
$this->session()->set('polr.endpoint', $endpoint);
$this->polr->reload($this->response);
return $this->response;
}
public function generateNewKey($userId, $fromDev)
{
if(!$this->validator->validateId($userId))
{
$this->notify->error('Invalid or missing parameters.', 'Error');
return $this->response;
}
// Generate the new key on the Polr instance
$apiResponse = $this->apiClient->post('users/' . $userId . '/api',
['query' => ['key' => $this->apiKey]]);
$jsonResponse = json_decode($apiResponse->getBody()->getContents());
$user = $jsonResponse->result;
if(($fromDev))
{
// Show the new API key in the form
$this->response->assign('api-key-value', 'value', $user->api_key);
// Show a confirmation message
$this->notify->info("New API key successfully generated.", 'Success');
}
else
{
// Update the dialog with the new status
$this->jq('#edit-user-api-key .status-display')->html($user->api_key);
// Show a confirmation message
$this->notify->info("New API key for user {$user->username} successfully generated.", 'Success');
}
return $this->response;
}
public function showAPIInfo($userId)
{
if(!$this->validator->validateId($userId))
{
$this->notify->error('Invalid or missing parameters.', 'Error');
return $this->response;
}
// Get the user on the Polr instance
$apiResponse = $this->apiClient->get('users/' . $userId,
['query' => ['key' => $this->apiKey]]);
$jsonResponse = json_decode($apiResponse->getBody()->getContents());
$user = $jsonResponse->result;
if(!$user->active)
{
$this->notify->error('User not active.', 'Error');
return $this->response;
}
$title = 'Edit User API Settings';
$content = $this->view()->render('polr_admin::snippets.edit_user_api_info', ['user' => $user]);
$buttons = [
[
'title' => 'Close',
'class' => 'btn btn-danger btn-sm',
'click' => 'close',
]
];
$this->dialog->show($title, $content, $buttons);
// Set event handlers on buttons
$this->jq('#edit-user-api-active a.btn')->click($this->rq()->toggleAPIActive($user->id));
$this->jq('#edit-user-api-key a.btn')->click($this->rq()->generateNewKey($user->id, false));
$this->jq('#edit-user-api-quota a.btn')->click($this->rq()->editAPIQuota($user->id,
jq('#edit-user-api-quota input.api-quota')->val()));
return $this->response;
}
public function toggleAPIActive($userId)
{
if(!$this->validator->validateId($userId))
{
$this->notify->error('Invalid or missing parameters.', 'Error');
return $this->response;
}
// Toogle the user API status on the Polr instance
$apiResponse = $this->apiClient->put('users/' . $userId . '/api',
['query' => ['key' => $this->apiKey, 'status' => 'toggle']]);
$jsonResponse = json_decode($apiResponse->getBody()->getContents());
$user = $jsonResponse->result;
// Update the dialog with the new status
$this->jq('#edit-user-api-active .status-display')->html(($user->api_active == 1) ? 'True' : 'False');
// Show a confirmation message
$status = ($user->api_active == 1) ? 'active' : 'inactive';
$this->notify->info("API status of user {$user->username} successfully changed to $status.", 'Success');
return $this->response;
}
public function editAPIQuota($userId, $newQuota)
{
$values = ['id' => $userId, 'quota' => $newQuota];
if(!$this->validator->validateUserQuota($values))
{
$this->notify->error('Invalid or missing parameters.', 'Error');
return $this->response;
}
// Change the user API quota on the Polr instance
$apiResponse = $this->apiClient->put('users/' . $userId . '/api',
['query' => ['key' => $this->apiKey, 'quota' => $newQuota]]);
$jsonResponse = json_decode($apiResponse->getBody()->getContents());
$user = $jsonResponse->result;
// Show a confirmation message
$this->notify->info("Quota of user {$user->username} successfully changed to {$user->api_quota}.", 'Success');
return $this->response;
}
public function setUserStatus($userId, $status)
{
$values = ['id' => $userId, 'status' => $status];
if(!$this->validator->validateUserStatus($values))
{
$this->notify->error('Invalid or missing parameters.', 'Error');
return $this->response;
}
// Change the user status on the Polr instance
$status = ($status == 1) ? 'enable' : 'disable';
$apiResponse = $this->apiClient->put('users/' . $userId,
['query' => ['key' => $this->apiKey, 'status' => $status]]);
$jsonResponse = json_decode($apiResponse->getBody()->getContents());
$user = $jsonResponse->result;
// Reload the datatable
$status = ($user->active == 1) ? 'active' : 'inactive';
$this->response->script("polr.home.reloadUserTables()");
// Show a confirmation message
$this->notify->info("Status of user {$user->username} successfully changed to $status.", 'Success');
return $this->response;
}
public function changeUserRole($userId, $role)
{
$values = ['id' => $userId, 'role' => $role];
if(!$this->validator->validateUserRole($values))
{
$this->notify->error('Invalid or missing parameters.', 'Error');
return $this->response;
}
// Change the user role on the Polr instance
$apiResponse = $this->apiClient->put('users/' . $userId,
['query' => ['key' => $this->apiKey, 'role' => $role]]);
$jsonResponse = json_decode($apiResponse->getBody()->getContents());
$user = $jsonResponse->result;
// Reload the datatable
$this->response->script("polr.home.reloadUserTables()");
// Show a confirmation message
$role = ($user->role) ? : 'default';
$this->notify->info("Role of user {$user->username} successfully changed to $role.", 'Success');
return $this->response;
}
protected function datatableParameters($parameters)
{
// The boolean parameters sent by Guzzle in a HTTP request are not recognized
// by Datatables. So we need to convert them to strings "true" or "false".
foreach($parameters['columns'] as &$column)
{
$column['searchable'] = ($column['searchable']) ? 'true' : 'false';
$column['orderable'] = ($column['orderable']) ? 'true' : 'false';
$column['search']['regex'] = ($column['search']['regex']) ? 'true' : 'false';
}
// Set the "key" parameter
$parameters['key'] = $this->apiKey;
return $parameters;
}
public function getUsers($parameters)
{
// Fetch the users from the Polr instance
$apiResponse = $this->apiClient->get('users', [
'query' => $this->datatableParameters($parameters)
]);
$jsonResponse = json_decode($apiResponse->getBody()->getContents());
$this->dtRenderer->settings = $jsonResponse->settings;
// Fill user roles dropdown
$this->response->html('user-roles', $this->view()->render('polr_admin::snippets.select-roles',
['roles' => $jsonResponse->settings->roles]));
$this->response->datatables->make($jsonResponse->result->data,
$jsonResponse->result->recordsTotal, $jsonResponse->result->draw)
->add('api_action', [$this->dtRenderer, 'renderAdminApiActionCell'])
->add('toggle_active', [$this->dtRenderer, 'renderToggleUserActiveCell'])
->add('change_role', [$this->dtRenderer, 'renderChangeUserRoleCell'])
->add('delete', [$this->dtRenderer, 'renderDeleteUserCell'])
->escape(['username', 'email'])
->attr([
'data-id' => 'id',
'data-name' => 'username',
]);
return $this->response;
}
}
|