Went through todos

This commit is contained in:
Dennis Eichhorn 2024-05-02 22:54:37 +00:00
parent 7e719d7c29
commit 3934e32c78
7 changed files with 77 additions and 32 deletions

View File

@ -117,7 +117,7 @@ return [
],
],
'^.*/admin/group$' => [
'^.*/admin/group(\?.*|$)$' => [
[
'dest' => '\Modules\Admin\Controller\ApiController:apiGroupCreate',
'verb' => RouteVerb::PUT,
@ -164,7 +164,7 @@ return [
],
],
'^.*/admin/find/account(\?.*|$)' => [
'^.*/admin/account/find(\?.*|$)' => [
[
'dest' => '\Modules\Admin\Controller\ApiController:apiAccountFind',
'verb' => RouteVerb::GET,
@ -177,7 +177,7 @@ return [
],
],
],
'^.*/admin/find/group(\?.*$|$)' => [
'^.*/admin/group/find(\?.*$|$)' => [
[
'dest' => '\Modules\Admin\Controller\ApiController:apiGroupFind',
'verb' => RouteVerb::GET,
@ -450,7 +450,7 @@ return [
],
],
],
'^.*/account/address$' => [
'^.*/account/address(\?.*|$)$' => [
[
'dest' => '\Modules\Admin\Controller\ApiController:apiAddressCreate',
'verb' => RouteVerb::PUT,
@ -485,7 +485,7 @@ return [
],
],
],
'^.*/account/contact$' => [
'^.*/account/contact(\?.*|$)$' => [
[
'dest' => '\Modules\Admin\Controller\ApiController:apiContactCreate',
'verb' => RouteVerb::PUT,

View File

@ -72,7 +72,6 @@ use phpOMS\Message\NotificationLevel;
use phpOMS\Message\RequestAbstract;
use phpOMS\Message\ResponseAbstract;
use phpOMS\Model\Message\FormValidation;
use phpOMS\Model\Message\Reload;
use phpOMS\Module\ModuleInfo;
use phpOMS\Module\ModuleStatus;
use phpOMS\Security\EncryptionHelper;
@ -88,8 +87,6 @@ use phpOMS\Utils\Parser\Php\ArrayParser;
use phpOMS\Utils\RnG\StringUtils as StringRng;
use phpOMS\Utils\StringUtils;
use phpOMS\Validation\Network\Email as EmailValidator;
use phpOMS\Version\Version;
use Modules\Media\Models\UploadStatus;
/**
* Admin controller class.
@ -106,6 +103,12 @@ use Modules\Media\Models\UploadStatus;
*
* @todo Split up the ApiController, it is doing way to much in one file.
* Consider to create one for: accounts+groups+permissions and one for general stuff like address+settings etc.
*
* @todo Create api key/token permissions for api interactions through tokens
* Maybe we need to assign tokens to users but sometimes users want to give tokens limited permissions
* https://github.com/Karaka-Management/oms-Admin/issues/24
* https://github.com/Karaka-Management/oms-Admin/issues/25
* https://github.com/Karaka-Management/oms-Admin/issues/26
*/
final class ApiController extends Controller
{
@ -133,7 +136,7 @@ final class ApiController extends Controller
if ($login > LoginReturnType::OK) {
$this->app->sessionManager->set('UID', $login, true);
$response->set($request->uri->__toString(), new Reload());
$response->set($request->uri->__toString(), new \phpOMS\Model\Message\Redirect());
} elseif ($login === LoginReturnType::NOT_ACTIVATED) {
$response->header->status = RequestStatusCode::R_401;
$this->fillJsonResponse(
@ -372,7 +375,7 @@ final class ApiController extends Controller
]);
}
$token = (string) \random_bytes(64);
$token = (string) \bin2hex(\random_bytes(32));
$handler = $this->setUpServerMailHandler();
$resetLink = UriFactory::build('{/base}/reset?user=' . $account->id . '&token=' . $token);
@ -1143,7 +1146,7 @@ final class ApiController extends Controller
$upload->outputDir = __DIR__ . '/../../../Web/Backend/img';
$status = $upload->upload($request->files, ['logo.png'], true);
if ($status[0]['status'] !== UploadStatus::OK) {
if ($status[0]['status'] !== \Modules\Media\Models\UploadStatus::OK) {
$response->header->status = RequestStatusCode::R_400;
$this->createInvalidUpdateResponse($request, $response, []);
@ -1521,6 +1524,7 @@ final class ApiController extends Controller
/** @var \Modules\Admin\Models\Group[] $groups */
$groups = GroupMapper::getAll()
->where('name', '%' . ($request->getDataString('search') ?? '') . '%', 'LIKE')
->limit($request->getDataInt('limit') ?? 50)
->executeGetArray();
$response->header->set('Content-Type', MimeType::M_JSON, true);
@ -1648,7 +1652,8 @@ final class ApiController extends Controller
private function validateAccountCreate(RequestAbstract $request) : array
{
$val = [];
if (($val['name1'] = !$request->hasData('name1'))
if (($val['user'] = !$request->hasData('user'))
|| ($val['name1'] = !$request->hasData('name1'))
|| ($val['type'] = !AccountType::isValidValue((int) $request->getData('type')))
|| ($val['status'] = !AccountStatus::isValidValue((int) $request->getData('status')))
|| ($val['email'] = $request->hasData('email') && !EmailValidator::isValid((string) $request->getData('email')))
@ -1749,7 +1754,7 @@ final class ApiController extends Controller
'',
\str_replace(
'{url}',
UriFactory::build('{/base}/admin/account/settings?{?}&id=' . $account->id),
UriFactory::build('{/base}/admin/account/view?{?}&id=' . $account->id),
$this->app->l11nManager->getText($response->header->l11n->language, '0', '0', 'SuccessfulCreate'
)),
$account
@ -3126,6 +3131,9 @@ final class ApiController extends Controller
*
* @api
*
* @todo Create update logic for application, resources, modules
* https://github.com/Karaka-Management/oms-Admin/issues/17
*
* @since 1.0.0
*/
public function apiCheckForUpdates(RequestAbstract $request, ResponseAbstract $response, array $data = []) : void
@ -3157,10 +3165,10 @@ final class ApiController extends Controller
$currentVersion = '';
$remoteVersion = \substr($file[1], 0, -5);
if (Version::compare($currentVersion, $remoteVersion) < 0) {
if (\phpOMS\Version\Version::compare($currentVersion, $remoteVersion) < 0) {
$toUpdate[$name[0]][$remoteVersion] = $file;
\uksort($toUpdate[$name[0]], [Version::class, 'compare']);
\uksort($toUpdate[$name[0]], [\phpOMS\Version\Version::class, 'compare']);
}
}
@ -3961,6 +3969,9 @@ final class ApiController extends Controller
*
* @api
*
* @todo Find a way to hide some contact/address information for some modules
* https://github.com/Karaka-Management/oms-Profile/issues/3
*
* @since 1.0.0
*/
public function apiAddressCreate(RequestAbstract $request, ResponseAbstract $response, array $data = []) : void

View File

@ -24,6 +24,7 @@ use Modules\Admin\Models\ModuleMapper;
use Modules\Admin\Models\SettingsEnum;
use Modules\Auditor\Models\AuditMapper;
use Modules\Organization\Models\UnitMapper;
use Modules\Profile\Models\ProfileMapper;
use phpOMS\Autoloader;
use phpOMS\Contract\RenderableInterface;
use phpOMS\DataStorage\Database\Query\OrderType;
@ -45,6 +46,9 @@ use Web\Backend\Views\TableView;
* @link https://jingga.app
* @since 1.0.0
* @codeCoverageIgnore
*
* @todo Create a view where it's possible to create/activate, change and delete/deactivate hooks for events.
* https://github.com/Karaka-Management/oms-Admin/issues/12
*/
final class BackendController extends Controller
{
@ -199,6 +203,10 @@ final class BackendController extends Controller
$view->data['account'] = $account;
$view->data['profile'] = ProfileMapper::get()
->where('account', $account->id)
->execute();
/** @var \Modules\Admin\Models\AccountPermission[] $permissions */
$permissions = AccountPermissionMapper::getAll()
->where('account', (int) $request->getData('id'))
@ -605,6 +613,10 @@ final class BackendController extends Controller
*
* @return RenderableInterface Response can be rendered
*
* @todo Disable routing for front end. This way only the functionality is available (api)
* This can be easily achieved by setting the route `active => false`
* https://github.com/Karaka-Management/oms-Admin/issues/18
*
* @since 1.0.0
*/
public function viewModuleRouteList(RequestAbstract $request, ResponseAbstract $response, array $data = []) : RenderableInterface

View File

@ -22,7 +22,10 @@ echo $this->data['nav']->render(); ?>
<div class="row">
<div class="col-xs-12 col-md-6">
<section class="portlet">
<form id="fAccount" action="<?= UriFactory::build('{/api}admin/account?csrf={$CSRF}'); ?>" method="put">
<form id="fAccount"
action="<?= UriFactory::build('{/api}admin/account?csrf={$CSRF}'); ?>"
method="put"
data-redirect="<?= UriFactory::build('{/base}/admin/account/view'); ?>?id={/0/response/id}">
<div class="portlet-head"><?= $this->getHtml('Account'); ?></div>
<div class="portlet-body">
<div class="form-group">
@ -47,7 +50,7 @@ echo $this->data['nav']->render(); ?>
<label for="iUsername"><?= $this->getHtml('Username'); ?></label>
<span class="input">
<button class="inactive" type="button"><i class="g-icon">person</i></button>
<input id="iUsername" name="name" type="text" autocomplete="off" spellcheck="false">
<input id="iUsername" name="user" type="text" autocomplete="off" spellcheck="false" required>
</span>
</div>

View File

@ -12,6 +12,7 @@
*/
declare(strict_types=1);
use Modules\Admin\Models\NullAccount;
use phpOMS\Account\AccountStatus;
use phpOMS\Account\AccountType;
use phpOMS\Account\PermissionOwner;
@ -21,7 +22,9 @@ use phpOMS\Uri\UriFactory;
/**
* @var \phpOMS\Views\View $this
*/
$account = $this->data['account'];
$account = $this->data['account'] ?? new NullAccount();
$isNew = $account->id === 0;
$permissions = $this->data['permissions'];
$l11n = $account->l11n;
@ -29,7 +32,7 @@ $audits = $this->data['audits'] ?? [];
$tableView = $this->data['tableView'];
$tableView->id = 'auditList';
$tableView->baseUri = '{/base}/admin/account/settings?id=' . $account->id;
$tableView->baseUri = '{/base}/admin/account/view?id=' . $account->id;
$tableView->exportUri = '{/api}auditor/list/export?csrf={$CSRF}';
$tableView->setObjects($audits);
@ -89,7 +92,7 @@ echo $this->data['nav']->render(); ?>
<label for="iUsername"><?= $this->getHtml('Username'); ?></label>
<span class="input">
<button class="inactive" type="button"><i class="g-icon">person</i></button>
<input id="iUsername" name="name" type="text" autocomplete="off" spellcheck="false" value="<?= $this->printHtml($account->login); ?>">
<input id="iUsername" name="user" type="text" autocomplete="off" spellcheck="false" value="<?= $this->printHtml($account->login); ?>" required>
</span>
</div>
<div class="form-group">
@ -135,16 +138,19 @@ echo $this->data['nav']->render(); ?>
</div>
<div class="portlet-foot">
<input id="account-edit-submit" name="editSubmit" type="submit" value="<?= $this->getHtml('Save', '0', '0'); ?>">
<?php if ($account->id !== 0 && $this->data['profile']->id === 0) : ?>
<button id="account-profile-create" data-action='[
{
"key": 1, "listener": "click", "action": [
{"key": 1, "type": "event.prevent"},
{"key": 2, "type": "dom.getvalue", "base": "", "selector": "#iId"},
{"key": 3, "type": "message.request", "uri": "{/base}/{/lang}/api/view", "method": "PUT", "request_type": "json"},
{"key": 4, "type": "message.log"}
{"key": 2, "type": "dom.get", "base": "", "selector": "#iId"},
{"key": 3, "type": "message.request", "uri": "<?= UriFactory::build('{/api}profile?csrf={$CSRF}') ?>", "method": "PUT", "request_type": "json"},
{"key": 4, "type": "message.log"},
{"key": 5, "type": "redirect", "uri": "{%}", "target": "self"}
]
}
]'><?= $this->getHtml('CreateProfile'); ?></button>
<?php endif; ?>
</div>
</form>
</section>
@ -162,7 +168,20 @@ echo $this->data['nav']->render(); ?>
<div class="portlet-body">
<div class="form-group">
<label for="iGroup"><?= $this->getHtml('Name'); ?></label>
<?= $this->getData('grpSelector')->render('iGroup', true); ?>
<div id="iGroupSelector" class="smart-input-wrapper" data-src="<?= UriFactory::build('{/api}admin/group/find?csrf={$CSRF}'); ?>">
<div
data-value=""
data-name="search"
data-limit="10"
data-container=""
class="input-div"
contenteditable="true"></div>
<template class="input-data-tpl">
<div data-value="" data-tpl-value="/id" data-tpl-text="/name"></div>
</template>
<div class="input-datalist input-datalist-body vh" data-active="true">
</div>
</div>
</div>
</div>
<div class="portlet-foot">
@ -187,7 +206,7 @@ echo $this->data['nav']->render(); ?>
$c = 0;
$groups = $account->getGroups();
foreach ($groups as $key => $value) : ++$c;
$url = UriFactory::build('{/base}/admin/group/settings?{?}&id=' . $value->id);
$url = UriFactory::build('{/base}/admin/group/view?{?}&id=' . $value->id);
?>
<tr data-href="<?= $url; ?>">
<td><a href="#"><i class="g-icon">close</i></a>
@ -459,7 +478,7 @@ echo $this->data['nav']->render(); ?>
<?php endif; ?>
<td><?= $this->printHtml((string) $audit->type); ?>
<td><?= $this->printHtml($audit->trigger); ?>
<td><a class="content" href="<?= UriFactory::build('{/base}/admin/account/settings?id=' . $audit->createdBy->id); ?>"><?= $this->printHtml(
<td><a class="content" href="<?= UriFactory::build('{/base}/admin/account/view?id=' . $audit->createdBy->id); ?>"><?= $this->printHtml(
$this->renderUserName('%3$s %2$s %1$s', [$audit->createdBy->name1, $audit->createdBy->name2, $audit->createdBy->name3, $audit->createdBy->login])
); ?></a>
<td><?= $this->printHtml((string) $audit->ref); ?>

View File

@ -27,11 +27,11 @@ $accounts = $group->getAccounts();
$audits = $this->data['auditlogs'] ?? [];
$previous = empty($audits)
? HttpHeader::getAllHeaders()['Referer'] ?? 'admin/group/settings?id={?id}#{\#}'
: 'admin/group/settings?{?}&audit=' . \reset($audits)->id . '&ptype=p#{\#}';
? HttpHeader::getAllHeaders()['Referer'] ?? 'admin/group/view?id={?id}#{\#}'
: 'admin/group/view?{?}&audit=' . \reset($audits)->id . '&ptype=p#{\#}';
$next = empty($audits)
? HttpHeader::getAllHeaders()['Referer'] ?? 'admin/group/settings?id={?id}#{\#}'
: 'admin/group/settings?{?}&audit=' . \end($audits)->id . '&ptype=n#{\#}';
? HttpHeader::getAllHeaders()['Referer'] ?? 'admin/group/view?id={?id}#{\#}'
: 'admin/group/view?{?}&audit=' . \end($audits)->id . '&ptype=n#{\#}';
echo $this->data['nav']->render(); ?>
@ -149,7 +149,7 @@ echo $this->data['nav']->render(); ?>
<?php
$c = 0;
foreach ($accounts as $key => $value) : ++$c;
$url = UriFactory::build('{/base}/admin/account/settings?{?}&id=' . $value->id); ?>
$url = UriFactory::build('{/base}/admin/account/view?{?}&id=' . $value->id); ?>
<tr data-id="<?= $value->id; ?>">
<td><input id="accountTable-remove-<?= $value->id; ?>" type="checkbox" class="vh">
<label for="accountTable-remove-<?= $value->id; ?>" class="checked-visibility-alt"><i class="g-icon btn form-action">close</i></label>

View File

@ -90,7 +90,7 @@ echo $this->data['nav']->render(); ?>
</label>
<tbody>
<?php $c = 0; foreach ($accounts as $key => $value) : ++$c;
$url = UriFactory::build('{/base}/admin/account/settings?{?}&id=' . $value->id);
$url = UriFactory::build('{/base}/admin/account/view?{?}&id=' . $value->id);
$color = 'darkred';
if ($value->status === AccountStatus::ACTIVE) { $color = 'green'; }
elseif ($value->status === AccountStatus::INACTIVE) { $color = 'darkblue'; }