fix(audit): update routes from admin/ to audit/ and fix module namespaces
Routes in nav items, redirects, breadcrumbs, and JS data URLs all pointed to the old admin/ prefix from before the module was restructured. Also corrects use-statements still referencing core Domain\Taxonomy namespace instead of Module\Audit\Domain. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -51,7 +51,7 @@ return [
|
||||
'key' => 'audit-api-audit',
|
||||
'group' => 'admin-logs',
|
||||
'label' => 'API audit',
|
||||
'path' => 'admin/api-audit',
|
||||
'path' => 'audit/api-audit',
|
||||
'permission' => 'audit.api.view',
|
||||
'order' => 200,
|
||||
],
|
||||
@@ -59,7 +59,7 @@ return [
|
||||
'key' => 'audit-system-audit',
|
||||
'group' => 'admin-logs',
|
||||
'label' => 'System audit logs',
|
||||
'path' => 'admin/system-audit',
|
||||
'path' => 'audit/system-audit',
|
||||
'permission' => 'audit.system.view',
|
||||
'order' => 210,
|
||||
],
|
||||
@@ -67,7 +67,7 @@ return [
|
||||
'key' => 'audit-import-audit',
|
||||
'group' => 'admin-logs',
|
||||
'label' => 'Import logs',
|
||||
'path' => 'admin/import-audit',
|
||||
'path' => 'audit/import-audit',
|
||||
'permission' => 'audit.imports.view',
|
||||
'order' => 220,
|
||||
],
|
||||
@@ -75,7 +75,7 @@ return [
|
||||
'key' => 'audit-user-lifecycle-audit',
|
||||
'group' => 'admin-logs',
|
||||
'label' => 'User lifecycle logs',
|
||||
'path' => 'admin/user-lifecycle-audit',
|
||||
'path' => 'audit/user-lifecycle-audit',
|
||||
'permission' => 'audit.user_lifecycle.view',
|
||||
'order' => 230,
|
||||
],
|
||||
|
||||
@@ -24,7 +24,7 @@ ob_start();
|
||||
<?php
|
||||
$listPurgeEnabled = $canPurgeApiAudit;
|
||||
$listPurgeFormId = 'api-audit-purge-form';
|
||||
$listPurgeAction = 'admin/api-audit/purge';
|
||||
$listPurgeAction = 'audit/api-audit/purge';
|
||||
$listPurgeConfirmMessage = t('Purge entries older than 90 days?');
|
||||
$listPurgeButtonLabel = t('Purge API audit logs');
|
||||
require templatePath('partials/app-list-purge-action.phtml');
|
||||
|
||||
@@ -9,15 +9,15 @@ Guard::requireLogin();
|
||||
Guard::requireAbility(\MintyPHP\Service\Access\SettingsAuthorizationPolicy::ABILITY_ADMIN_SETTINGS_UPDATE);
|
||||
|
||||
if (strtoupper((string) (requestInput()->method())) !== 'POST') {
|
||||
Router::redirect('admin/api-audit');
|
||||
Router::redirect('audit/api-audit');
|
||||
}
|
||||
$errorBag = formErrors();
|
||||
if (!Session::checkCsrfToken()) {
|
||||
$errorBag->addGlobal(t('Form expired, please try again'));
|
||||
flashFormErrors($errorBag, 'admin/api-audit', 'api_audit');
|
||||
Router::redirect('admin/api-audit');
|
||||
flashFormErrors($errorBag, 'audit/api-audit', 'api_audit');
|
||||
Router::redirect('audit/api-audit');
|
||||
}
|
||||
|
||||
$deleted = app(\MintyPHP\Module\Audit\Service\ApiAuditService::class)->purgeExpired();
|
||||
Flash::success(sprintf(t('%d API audit entries purged'), $deleted), 'admin/api-audit', 'api_audit_purged');
|
||||
Router::redirect('admin/api-audit');
|
||||
Flash::success(sprintf(t('%d API audit entries purged'), $deleted), 'audit/api-audit', 'api_audit_purged');
|
||||
Router::redirect('audit/api-audit');
|
||||
|
||||
@@ -11,8 +11,8 @@ Guard::requireAbility(\MintyPHP\Module\Audit\AuditAuthorizationPolicy::ABILITY_A
|
||||
$auditId = (int) ($id ?? 0);
|
||||
$auditLog = $auditId > 0 ? app(\MintyPHP\Module\Audit\Service\ApiAuditService::class)->find($auditId) : null;
|
||||
if (!$auditLog) {
|
||||
Flash::error('API audit entry not found', 'admin/api-audit', 'api_audit_not_found');
|
||||
Router::redirect('admin/api-audit');
|
||||
Flash::error('API audit entry not found', 'audit/api-audit', 'api_audit_not_found');
|
||||
Router::redirect('audit/api-audit');
|
||||
}
|
||||
|
||||
Buffer::set('title', t('View API audit entry'));
|
||||
|
||||
@@ -53,14 +53,14 @@ $tokenTenantId = (int) ($auditLog['token_tenant_id'] ?? 0);
|
||||
<?php
|
||||
$breadcrumbs = [
|
||||
['label' => t('Home'), 'path' => 'admin'],
|
||||
['label' => t('API audit logs'), 'path' => 'admin/api-audit'],
|
||||
['label' => t('API audit logs'), 'path' => 'audit/api-audit'],
|
||||
['label' => t('View')],
|
||||
];
|
||||
require templatePath('partials/app-breadcrumb.phtml');
|
||||
|
||||
$titlebar = [
|
||||
'title' => t('View API audit entry'),
|
||||
'backHref' => 'admin/api-audit',
|
||||
'backHref' => 'audit/api-audit',
|
||||
'backTitle' => t('Back'),
|
||||
];
|
||||
require templatePath('partials/app-details-titlebar.phtml');
|
||||
|
||||
@@ -24,7 +24,7 @@ ob_start();
|
||||
<?php
|
||||
$listPurgeEnabled = $canPurgeImportAudit;
|
||||
$listPurgeFormId = 'import-audit-purge-form';
|
||||
$listPurgeAction = 'admin/import-audit/purge';
|
||||
$listPurgeAction = 'audit/import-audit/purge';
|
||||
$listPurgeConfirmMessage = t('Purge entries older than 90 days?');
|
||||
$listPurgeButtonLabel = t('Purge import logs');
|
||||
require templatePath('partials/app-list-purge-action.phtml');
|
||||
|
||||
@@ -10,15 +10,15 @@ Guard::requireLogin();
|
||||
Guard::requireAbility(\MintyPHP\Service\Access\SettingsAuthorizationPolicy::ABILITY_ADMIN_SETTINGS_UPDATE);
|
||||
|
||||
if (strtoupper((string) (requestInput()->method())) !== 'POST') {
|
||||
Router::redirect('admin/import-audit');
|
||||
Router::redirect('audit/import-audit');
|
||||
}
|
||||
$errorBag = formErrors();
|
||||
if (!Session::checkCsrfToken()) {
|
||||
$errorBag->addGlobal(t('Form expired, please try again'));
|
||||
flashFormErrors($errorBag, 'admin/import-audit', 'import_audit');
|
||||
Router::redirect('admin/import-audit');
|
||||
flashFormErrors($errorBag, 'audit/import-audit', 'import_audit');
|
||||
Router::redirect('audit/import-audit');
|
||||
}
|
||||
|
||||
$deleted = app(ImportAuditService::class)->purgeExpired();
|
||||
Flash::success(sprintf(t('%d import audit entries purged'), $deleted), 'admin/import-audit', 'import_audit_purged');
|
||||
Router::redirect('admin/import-audit');
|
||||
Flash::success(sprintf(t('%d import audit entries purged'), $deleted), 'audit/import-audit', 'import_audit_purged');
|
||||
Router::redirect('audit/import-audit');
|
||||
|
||||
@@ -11,8 +11,8 @@ Guard::requireAbility(\MintyPHP\Module\Audit\AuditAuthorizationPolicy::ABILITY_I
|
||||
$runId = (int) ($id ?? 0);
|
||||
$auditRun = $runId > 0 ? app(\MintyPHP\Module\Audit\Service\ImportAuditService::class)->find($runId) : null;
|
||||
if (!$auditRun) {
|
||||
Flash::error(t('Import audit entry not found'), 'admin/import-audit', 'import_audit_not_found');
|
||||
Router::redirect('admin/import-audit');
|
||||
Flash::error(t('Import audit entry not found'), 'audit/import-audit', 'import_audit_not_found');
|
||||
Router::redirect('audit/import-audit');
|
||||
}
|
||||
|
||||
Buffer::set('title', t('View import audit entry'));
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<?php
|
||||
use MintyPHP\Domain\Taxonomy\ImportAuditStatus;
|
||||
use MintyPHP\Module\Audit\Domain\ImportAuditStatus;
|
||||
|
||||
/**
|
||||
* @var array $auditRun
|
||||
@@ -56,14 +56,14 @@ if ($tenantLabel === '') {
|
||||
<?php
|
||||
$breadcrumbs = [
|
||||
['label' => t('Home'), 'path' => 'admin'],
|
||||
['label' => t('Import audit logs'), 'path' => 'admin/import-audit'],
|
||||
['label' => t('Import audit logs'), 'path' => 'audit/import-audit'],
|
||||
['label' => t('View')],
|
||||
];
|
||||
require templatePath('partials/app-breadcrumb.phtml');
|
||||
|
||||
$titlebar = [
|
||||
'title' => t('View import audit entry'),
|
||||
'backHref' => 'admin/import-audit',
|
||||
'backHref' => 'audit/import-audit',
|
||||
'backTitle' => t('Back'),
|
||||
];
|
||||
require templatePath('partials/app-details-titlebar.phtml');
|
||||
|
||||
@@ -25,7 +25,7 @@ ob_start();
|
||||
<?php
|
||||
$listPurgeEnabled = $canPurgeSystemAudit;
|
||||
$listPurgeFormId = 'system-audit-purge-form';
|
||||
$listPurgeAction = 'admin/system-audit/purge';
|
||||
$listPurgeAction = 'audit/system-audit/purge';
|
||||
$listPurgeConfirmMessage = t('Purge expired system audit entries?');
|
||||
$listPurgeButtonLabel = t('Purge system audit logs');
|
||||
require templatePath('partials/app-list-purge-action.phtml');
|
||||
|
||||
@@ -12,14 +12,14 @@ Guard::requireLogin();
|
||||
Guard::requireAbility(AuditAuthorizationPolicy::ABILITY_SYSTEM_AUDIT_PURGE);
|
||||
|
||||
if (strtoupper((string) requestInput()->method()) !== 'POST') {
|
||||
Router::redirect('admin/system-audit');
|
||||
Router::redirect('audit/system-audit');
|
||||
}
|
||||
|
||||
$errorBag = formErrors();
|
||||
if (!Session::checkCsrfToken()) {
|
||||
$errorBag->addGlobal(t('Form expired, please try again'));
|
||||
flashFormErrors($errorBag, 'admin/system-audit', 'system_audit');
|
||||
Router::redirect('admin/system-audit');
|
||||
flashFormErrors($errorBag, 'audit/system-audit', 'system_audit');
|
||||
Router::redirect('audit/system-audit');
|
||||
}
|
||||
|
||||
$service = app(SystemAuditService::class);
|
||||
@@ -28,5 +28,5 @@ $service->record('admin.system_audit.purge', SystemAuditOutcome::Success->value,
|
||||
'metadata' => ['deleted_count' => $deleted],
|
||||
]);
|
||||
|
||||
Flash::success(sprintf(t('%d system audit entries purged'), $deleted), 'admin/system-audit', 'system_audit_purged');
|
||||
Router::redirect('admin/system-audit');
|
||||
Flash::success(sprintf(t('%d system audit entries purged'), $deleted), 'audit/system-audit', 'system_audit_purged');
|
||||
Router::redirect('audit/system-audit');
|
||||
|
||||
@@ -13,8 +13,8 @@ Guard::requireAbility(AuditAuthorizationPolicy::ABILITY_SYSTEM_AUDIT_VIEW);
|
||||
$auditId = (int) ($id ?? 0);
|
||||
$auditLog = $auditId > 0 ? app(SystemAuditService::class)->find($auditId) : null;
|
||||
if (!$auditLog) {
|
||||
Flash::error(t('System audit entry not found'), 'admin/system-audit', 'system_audit_not_found');
|
||||
Router::redirect('admin/system-audit');
|
||||
Flash::error(t('System audit entry not found'), 'audit/system-audit', 'system_audit_not_found');
|
||||
Router::redirect('audit/system-audit');
|
||||
}
|
||||
|
||||
Buffer::set('title', t('View system audit entry'));
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<?php
|
||||
use MintyPHP\Domain\Taxonomy\SystemAuditOutcome;
|
||||
use MintyPHP\Module\Audit\Domain\SystemAuditOutcome;
|
||||
|
||||
/**
|
||||
* @var array $auditLog
|
||||
@@ -49,14 +49,14 @@ if ($tenantLabel === '') {
|
||||
<?php
|
||||
$breadcrumbs = [
|
||||
['label' => t('Home'), 'path' => 'admin'],
|
||||
['label' => t('System audit logs'), 'path' => 'admin/system-audit'],
|
||||
['label' => t('System audit logs'), 'path' => 'audit/system-audit'],
|
||||
['label' => t('View')],
|
||||
];
|
||||
require templatePath('partials/app-breadcrumb.phtml');
|
||||
|
||||
$titlebar = [
|
||||
'title' => t('View system audit entry'),
|
||||
'backHref' => 'admin/system-audit',
|
||||
'backHref' => 'audit/system-audit',
|
||||
'backTitle' => t('Back'),
|
||||
];
|
||||
require templatePath('partials/app-details-titlebar.phtml');
|
||||
|
||||
@@ -24,7 +24,7 @@ ob_start();
|
||||
<?php
|
||||
$listPurgeEnabled = $canPurge;
|
||||
$listPurgeFormId = 'user-lifecycle-audit-purge-form';
|
||||
$listPurgeAction = 'admin/user-lifecycle-audit/purge';
|
||||
$listPurgeAction = 'audit/user-lifecycle-audit/purge';
|
||||
$listPurgeConfirmMessage = t('Purge entries older than 365 days?');
|
||||
$listPurgeButtonLabel = t('Purge user lifecycle logs');
|
||||
require templatePath('partials/app-list-purge-action.phtml');
|
||||
|
||||
@@ -9,19 +9,19 @@ Guard::requireLogin();
|
||||
Guard::requireAbility(\MintyPHP\Service\Access\SettingsAuthorizationPolicy::ABILITY_ADMIN_SETTINGS_UPDATE);
|
||||
|
||||
if (strtoupper((string) (requestInput()->method())) !== 'POST') {
|
||||
Router::redirect('admin/user-lifecycle-audit');
|
||||
Router::redirect('audit/user-lifecycle-audit');
|
||||
}
|
||||
$errorBag = formErrors();
|
||||
if (!Session::checkCsrfToken()) {
|
||||
$errorBag->addGlobal(t('Form expired, please try again'));
|
||||
flashFormErrors($errorBag, 'admin/user-lifecycle-audit', 'user_lifecycle_audit');
|
||||
Router::redirect('admin/user-lifecycle-audit');
|
||||
flashFormErrors($errorBag, 'audit/user-lifecycle-audit', 'user_lifecycle_audit');
|
||||
Router::redirect('audit/user-lifecycle-audit');
|
||||
}
|
||||
|
||||
$deleted = app(\MintyPHP\Module\Audit\Service\UserLifecycleAuditService::class)->purgeExpired();
|
||||
Flash::success(
|
||||
sprintf(t('%d user lifecycle audit entries purged'), $deleted),
|
||||
'admin/user-lifecycle-audit',
|
||||
'audit/user-lifecycle-audit',
|
||||
'user_lifecycle_audit_purged'
|
||||
);
|
||||
Router::redirect('admin/user-lifecycle-audit');
|
||||
Router::redirect('audit/user-lifecycle-audit');
|
||||
|
||||
@@ -14,12 +14,12 @@ $auditId = (int) ($id ?? 0);
|
||||
$errorBag = formErrors();
|
||||
|
||||
if (strtoupper((string) (requestInput()->method())) !== 'POST') {
|
||||
Router::redirect('admin/user-lifecycle-audit');
|
||||
Router::redirect('audit/user-lifecycle-audit');
|
||||
}
|
||||
if (!Session::checkCsrfToken()) {
|
||||
$errorBag->addGlobal(t('Form expired, please try again'));
|
||||
flashFormErrors($errorBag, 'admin/user-lifecycle-audit', 'user_lifecycle_restore');
|
||||
Router::redirect('admin/user-lifecycle-audit');
|
||||
flashFormErrors($errorBag, 'audit/user-lifecycle-audit', 'user_lifecycle_restore');
|
||||
Router::redirect('audit/user-lifecycle-audit');
|
||||
}
|
||||
|
||||
$result = app(\MintyPHP\Service\User\UserLifecycleRestoreService::class)->restoreFromLifecycleAudit(
|
||||
@@ -40,9 +40,9 @@ if (!($result['ok'] ?? false)) {
|
||||
} else {
|
||||
$errorBag->addGlobal(t('User restore failed'));
|
||||
}
|
||||
flashFormErrors($errorBag, "admin/user-lifecycle-audit/view/$auditId", 'user_lifecycle_restore');
|
||||
Router::redirect("admin/user-lifecycle-audit/view/$auditId");
|
||||
flashFormErrors($errorBag, "audit/user-lifecycle-audit/view/$auditId", 'user_lifecycle_restore');
|
||||
Router::redirect("audit/user-lifecycle-audit/view/$auditId");
|
||||
}
|
||||
|
||||
Flash::success(t('User restored'), "admin/user-lifecycle-audit/view/$auditId", 'user_restored');
|
||||
Router::redirect("admin/user-lifecycle-audit/view/$auditId");
|
||||
Flash::success(t('User restored'), "audit/user-lifecycle-audit/view/$auditId", 'user_restored');
|
||||
Router::redirect("audit/user-lifecycle-audit/view/$auditId");
|
||||
|
||||
@@ -17,8 +17,8 @@ $auditId = (int) ($id ?? 0);
|
||||
$auditService = app(\MintyPHP\Module\Audit\Service\UserLifecycleAuditService::class);
|
||||
$auditLog = $auditId > 0 ? $auditService->find($auditId) : null;
|
||||
if (!$auditLog) {
|
||||
Flash::error(t('Lifecycle audit entry not found'), 'admin/user-lifecycle-audit', 'user_lifecycle_audit_not_found');
|
||||
Router::redirect('admin/user-lifecycle-audit');
|
||||
Flash::error(t('Lifecycle audit entry not found'), 'audit/user-lifecycle-audit', 'user_lifecycle_audit_not_found');
|
||||
Router::redirect('audit/user-lifecycle-audit');
|
||||
}
|
||||
|
||||
$snapshot = null;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<?php
|
||||
use MintyPHP\Domain\Taxonomy\UserLifecycleAction;
|
||||
use MintyPHP\Domain\Taxonomy\UserLifecycleStatus;
|
||||
use MintyPHP\Domain\Taxonomy\UserLifecycleTriggerType;
|
||||
use MintyPHP\Module\Audit\Domain\UserLifecycleAction;
|
||||
use MintyPHP\Module\Audit\Domain\UserLifecycleStatus;
|
||||
use MintyPHP\Module\Audit\Domain\UserLifecycleTriggerType;
|
||||
|
||||
/**
|
||||
* @var array $auditLog
|
||||
@@ -31,14 +31,14 @@ $isRestorable = $canRestore
|
||||
<?php
|
||||
$breadcrumbs = [
|
||||
['label' => t('Home'), 'path' => 'admin'],
|
||||
['label' => t('User lifecycle logs'), 'path' => 'admin/user-lifecycle-audit'],
|
||||
['label' => t('User lifecycle logs'), 'path' => 'audit/user-lifecycle-audit'],
|
||||
['label' => t('View')],
|
||||
];
|
||||
require templatePath('partials/app-breadcrumb.phtml');
|
||||
|
||||
$titlebar = [
|
||||
'title' => t('View user lifecycle audit entry'),
|
||||
'backHref' => 'admin/user-lifecycle-audit',
|
||||
'backHref' => 'audit/user-lifecycle-audit',
|
||||
'backTitle' => t('Back'),
|
||||
];
|
||||
require templatePath('partials/app-details-titlebar.phtml');
|
||||
@@ -178,7 +178,7 @@ $isRestorable = $canRestore
|
||||
</div>
|
||||
<?php if ($isRestorable): ?>
|
||||
<hr>
|
||||
<form method="post" action="admin/user-lifecycle-audit/restore/<?php e((string) ($auditLog['id'] ?? 0)); ?>">
|
||||
<form method="post" action="audit/user-lifecycle-audit/restore/<?php e((string) ($auditLog['id'] ?? 0)); ?>">
|
||||
<?php Session::getCsrfInput(); ?>
|
||||
<button type="submit" class="warning" data-confirm-message="<?php e(t('Restore this user from lifecycle snapshot?')); ?>">
|
||||
<?php e(t('Restore user')); ?>
|
||||
|
||||
@@ -15,7 +15,7 @@ if (config) {
|
||||
const gridOptions = {
|
||||
gridjs: window.gridjs,
|
||||
container: '#api-audit-grid',
|
||||
dataUrl: 'admin/api-audit/data',
|
||||
dataUrl: 'audit/api-audit/data',
|
||||
appBase,
|
||||
columns: [
|
||||
{
|
||||
@@ -124,7 +124,7 @@ if (config) {
|
||||
rowDblClick: {
|
||||
getUrl: (rowData) => {
|
||||
const id = rowData?.cells?.[9]?.data;
|
||||
return id ? new URL(`admin/api-audit/view/${id}`, appBase).toString() : '';
|
||||
return id ? new URL(`audit/api-audit/view/${id}`, appBase).toString() : '';
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
@@ -21,7 +21,7 @@ if (config) {
|
||||
const gridOptions = {
|
||||
gridjs: window.gridjs,
|
||||
container: '#import-audit-grid',
|
||||
dataUrl: 'admin/import-audit/data',
|
||||
dataUrl: 'audit/import-audit/data',
|
||||
appBase,
|
||||
columns: [
|
||||
{ name: labels.created || 'Created', sort: true },
|
||||
@@ -84,7 +84,7 @@ if (config) {
|
||||
rowDblClick: {
|
||||
getUrl: (rowData) => {
|
||||
const id = rowData?.cells?.[9]?.data;
|
||||
return id ? new URL(`admin/import-audit/view/${id}`, appBase).toString() : '';
|
||||
return id ? new URL(`audit/import-audit/view/${id}`, appBase).toString() : '';
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
@@ -15,7 +15,7 @@ if (config) {
|
||||
const gridOptions = {
|
||||
gridjs: window.gridjs,
|
||||
container: '#system-audit-grid',
|
||||
dataUrl: 'admin/system-audit/data',
|
||||
dataUrl: 'audit/system-audit/data',
|
||||
appBase,
|
||||
columns: [
|
||||
{ name: labels.created || 'Created', sort: true },
|
||||
@@ -85,7 +85,7 @@ if (config) {
|
||||
rowDblClick: {
|
||||
getUrl: (rowData) => {
|
||||
const id = rowData?.cells?.[8]?.data;
|
||||
return id ? new URL(`admin/system-audit/view/${id}`, appBase).toString() : '';
|
||||
return id ? new URL(`audit/system-audit/view/${id}`, appBase).toString() : '';
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
@@ -14,7 +14,7 @@ if (config) {
|
||||
const gridOptions = {
|
||||
gridjs: window.gridjs,
|
||||
container: '#user-lifecycle-audit-grid',
|
||||
dataUrl: 'admin/user-lifecycle-audit/data',
|
||||
dataUrl: 'audit/user-lifecycle-audit/data',
|
||||
appBase,
|
||||
columns: [
|
||||
{ name: labels.created || 'Created', sort: true },
|
||||
@@ -57,7 +57,7 @@ if (config) {
|
||||
rowDblClick: {
|
||||
getUrl: (rowData) => {
|
||||
const id = rowData?.cells?.[8]?.data;
|
||||
return id ? new URL(`admin/user-lifecycle-audit/view/${id}`, appBase).toString() : '';
|
||||
return id ? new URL(`audit/user-lifecycle-audit/view/${id}`, appBase).toString() : '';
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user