mirror of
https://github.com/Karaka-Management/oms-Exchange.git
synced 2026-01-11 16:48:42 +00:00
impl. logs
This commit is contained in:
parent
87f3afd630
commit
d404e26b90
|
|
@ -19,7 +19,7 @@
|
|||
"type": 3,
|
||||
"subtype": 1,
|
||||
"name": "Dashboard",
|
||||
"uri": "{/prefix}admin/exchange/dashboard?{?}",
|
||||
"uri": "{/prefix}admin/exchange/log/list?{?}",
|
||||
"target": "self",
|
||||
"icon": null,
|
||||
"order": 1,
|
||||
|
|
|
|||
|
|
@ -66,11 +66,23 @@
|
|||
"type": "TINYINT",
|
||||
"null": false
|
||||
},
|
||||
"exchange_log_time": {
|
||||
"name": "exchange_log_time",
|
||||
"exchange_log_subtype": {
|
||||
"name": "exchange_log_subtype",
|
||||
"type": "VARCHAR(100)",
|
||||
"null": false
|
||||
},
|
||||
"exchange_log_created_at": {
|
||||
"name": "exchange_log_created_at",
|
||||
"type": "DATETIME",
|
||||
"null": false
|
||||
},
|
||||
"exchange_log_created_by": {
|
||||
"name": "exchange_log_created_by",
|
||||
"type": "INT",
|
||||
"null": false,
|
||||
"foreignTable": "account",
|
||||
"foreignKey": "account_id"
|
||||
},
|
||||
"exchange_log_exchange": {
|
||||
"name": "exchange_log_exchange",
|
||||
"type": "INT",
|
||||
|
|
|
|||
|
|
@ -50,9 +50,20 @@ return [
|
|||
],
|
||||
],
|
||||
],
|
||||
'^.*/admin/exchange/dashboard.*$' => [
|
||||
'^.*/admin/exchange/log/list.*$' => [
|
||||
[
|
||||
'dest' => '\Modules\Exchange\Controller\BackendController:viewExchangeDashboard',
|
||||
'dest' => '\Modules\Exchange\Controller\BackendController:viewExchangeLogList',
|
||||
'verb' => RouteVerb::GET,
|
||||
'permission' => [
|
||||
'module' => BackendController::MODULE_NAME,
|
||||
'type' => PermissionType::READ,
|
||||
'state' => PermissionState::DASHBOARD,
|
||||
],
|
||||
],
|
||||
],
|
||||
'^.*/admin/exchange/log\?.*$' => [
|
||||
[
|
||||
'dest' => '\Modules\Exchange\Controller\BackendController:viewExchangeLog',
|
||||
'verb' => RouteVerb::GET,
|
||||
'permission' => [
|
||||
'module' => BackendController::MODULE_NAME,
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ declare(strict_types=1);
|
|||
|
||||
namespace Modules\Exchange\Controller;
|
||||
|
||||
use Modules\Exchange\Models\ExchangeLogMapper;
|
||||
use Modules\Exchange\Models\InterfaceManager;
|
||||
use Modules\Exchange\Models\InterfaceManagerMapper;
|
||||
use Modules\Media\Models\UploadFile;
|
||||
|
|
@ -54,7 +55,11 @@ final class ApiController extends Controller
|
|||
$status = NotificationLevel::ERROR;
|
||||
$message = 'Import failed.';
|
||||
|
||||
if ($import) {
|
||||
foreach ($import['logs'] as $log) {
|
||||
$this->createModel($request->header->account, $log, ExchangeLogMapper::class, 'import', $request->getOrigin());
|
||||
}
|
||||
|
||||
if ($import['status']) {
|
||||
$status = NotificationLevel::OK;
|
||||
$message = 'Import succeeded.';
|
||||
}
|
||||
|
|
@ -71,26 +76,18 @@ final class ApiController extends Controller
|
|||
*
|
||||
* @param RequestAbstract $request Request
|
||||
*
|
||||
* @return bool
|
||||
* @return array
|
||||
*
|
||||
* @since 1.0.0
|
||||
*/
|
||||
private function importDataFromRequest(RequestAbstract $request) : bool
|
||||
private function importDataFromRequest(RequestAbstract $request) : array
|
||||
{
|
||||
/** @var \Modules\Exchange\Models\InterfaceManager[] $interfaces */
|
||||
$interfaces = InterfaceManagerMapper::getAll();
|
||||
foreach ($interfaces as $interface) {
|
||||
if ($request->getData('exchange') ?? '' === $interface->getInterfacePath()) {
|
||||
$class = '\\Modules\\Exchange\\Interfaces\\' . $interface->getInterfacePath() . '\\Importer';
|
||||
$importer = new $class($this->app->dbPool->get());
|
||||
/** @var \Modules\Exchange\Models\InterfaceManager $interface */
|
||||
$interface = InterfaceManagerMapper::get($request->getData('id'));
|
||||
$class = '\\Modules\\Exchange\\Interfaces\\' . $interface->getInterfacePath() . '\\Importer';
|
||||
$importer = new $class($this->app->dbPool->get());
|
||||
|
||||
return $importer->importFromRequest($request);
|
||||
}
|
||||
}
|
||||
|
||||
Directory::delete(__DIR__ . '/../tmp/');
|
||||
|
||||
return false;
|
||||
return $importer->importFromRequest($request);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -162,6 +159,10 @@ final class ApiController extends Controller
|
|||
public function apiExchangeExport(RequestAbstract $request, ResponseAbstract $response, $data = null) : void
|
||||
{
|
||||
$export = $this->exportDataFromRequest($request);
|
||||
foreach ($export['logs'] as $log) {
|
||||
$this->createModel($request->header->account, $log, ExchangeLogMapper::class, 'export', $request->getOrigin());
|
||||
}
|
||||
|
||||
if ($export['type'] === 'file') {
|
||||
$file = \explode('.', $export['name']);
|
||||
|
||||
|
|
@ -206,20 +207,12 @@ final class ApiController extends Controller
|
|||
*/
|
||||
private function exportDataFromRequest(RequestAbstract $request) : array
|
||||
{
|
||||
/** @var \Modules\Exchange\Models\InterfaceManager[] $interfaces */
|
||||
$interfaces = InterfaceManagerMapper::getAll();
|
||||
foreach ($interfaces as $interface) {
|
||||
if ($request->getData('exchange') ?? '' === $interface->getInterfacePath()) {
|
||||
$class = '\\Modules\\Exchange\\Interfaces\\' . $interface->getInterfacePath() . '\\Exporter';
|
||||
$exporter = new $class($this->app->dbPool->get());
|
||||
/** @var \Modules\Exchange\Models\InterfaceManager $interface */
|
||||
$interface = InterfaceManagerMapper::get($request->getData('id'));
|
||||
$class = '\\Modules\\Exchange\\Interfaces\\' . $interface->getInterfacePath() . '\\Exporter';
|
||||
$exporter = new $class($this->app->dbPool->get());
|
||||
|
||||
return $exporter->exportFromRequest($request);
|
||||
}
|
||||
}
|
||||
|
||||
Directory::delete(__DIR__ . '/../tmp/');
|
||||
|
||||
return [];
|
||||
return $exporter->exportFromRequest($request);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -19,6 +19,7 @@ use phpOMS\Contract\RenderableInterface;
|
|||
use phpOMS\Message\RequestAbstract;
|
||||
use phpOMS\Message\ResponseAbstract;
|
||||
use phpOMS\Views\View;
|
||||
use Modules\Exchange\Models\ExchangeLogMapper;
|
||||
|
||||
/**
|
||||
* Exchange controller class.
|
||||
|
|
@ -42,12 +43,50 @@ final class BackendController extends Controller
|
|||
* @since 1.0.0
|
||||
* @codeCoverageIgnore
|
||||
*/
|
||||
public function viewExchangeDashboard(RequestAbstract $request, ResponseAbstract $response, $data = null) : RenderableInterface
|
||||
public function viewExchangeLogList(RequestAbstract $request, ResponseAbstract $response, $data = null) : RenderableInterface
|
||||
{
|
||||
$view = new View($this->app->l11nManager, $request, $response);
|
||||
$view->setTemplate('/Modules/Exchange/Theme/Backend/exchange-dashboard');
|
||||
$view->setTemplate('/Modules/Exchange/Theme/Backend/exchange-log-list');
|
||||
$view->addData('nav', $this->app->moduleManager->get('Navigation')->createNavigationMid(1007001001, $request, $response));
|
||||
|
||||
if ($request->getData('ptype') === 'p') {
|
||||
$view->setData('logs',
|
||||
ExchangeLogMapper::getBeforePivot((int) ($request->getData('id') ?? 0), limit: 25, depth: 4)
|
||||
);
|
||||
} elseif ($request->getData('ptype') === 'n') {
|
||||
$view->setData('logs',
|
||||
ExchangeLogMapper::getAfterPivot((int) ($request->getData('id') ?? 0), limit: 25, depth: 4)
|
||||
);
|
||||
} else {
|
||||
$view->setData('logs',
|
||||
ExchangeLogMapper::getAfterPivot(0, limit: 25, depth: 4)
|
||||
);
|
||||
}
|
||||
|
||||
return $view;
|
||||
}
|
||||
|
||||
/**
|
||||
* Routing end-point for application behaviour.
|
||||
*
|
||||
* @param RequestAbstract $request Request
|
||||
* @param ResponseAbstract $response Response
|
||||
* @param mixed $data Generic data
|
||||
*
|
||||
* @return RenderableInterface
|
||||
*
|
||||
* @since 1.0.0
|
||||
* @codeCoverageIgnore
|
||||
*/
|
||||
public function viewExchangeLog(RequestAbstract $request, ResponseAbstract $response, $data = null) : RenderableInterface
|
||||
{
|
||||
$view = new View($this->app->l11nManager, $request, $response);
|
||||
$view->setTemplate('/Modules/Exchange/Theme/Backend/exchange-log');
|
||||
$view->addData('nav', $this->app->moduleManager->get('Navigation')->createNavigationMid(1007001001, $request, $response));
|
||||
|
||||
$log = ExchangeLogMapper::get((int) $request->getData('id'));
|
||||
$view->setData('log', $log);
|
||||
|
||||
return $view;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -14,6 +14,8 @@ declare(strict_types=1);
|
|||
|
||||
namespace Modules\Exchange\Interfaces\OMS;
|
||||
|
||||
use Modules\Exchange\Models\ExchangeLog;
|
||||
use Modules\Exchange\Models\ExchangeType;
|
||||
use phpOMS\DataStorage\Database\Connection\ConnectionAbstract;
|
||||
use phpOMS\DataStorage\Database\Connection\ConnectionFactory;
|
||||
use phpOMS\DataStorage\Database\DatabaseStatus;
|
||||
|
|
@ -84,10 +86,19 @@ final class Exporter extends ExporterAbstract
|
|||
$this->account = $request->header->account;
|
||||
|
||||
if ($request->getData('type') === 'language') {
|
||||
return $this->exportLanguage();
|
||||
$result = $this->exportLanguage();
|
||||
|
||||
$log = new ExchangeLog();
|
||||
$log->createdBy = $this->account;
|
||||
$log->setType(ExchangeType::EXPORT);
|
||||
$log->message = 'Language file exported.'; // @todo: localize!
|
||||
$log->subtype = 'language';
|
||||
$log->exchange = (int) $request->getData('id');
|
||||
|
||||
$result['logs'][] = $log;
|
||||
}
|
||||
|
||||
return [];
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ declare(strict_types=1);
|
|||
|
||||
namespace Modules\Exchange\Interfaces\OMS;
|
||||
|
||||
use Modules\Exchange\Models\ExchangeLog;
|
||||
use phpOMS\DataStorage\Database\Connection\ConnectionAbstract;
|
||||
use phpOMS\DataStorage\Database\Connection\ConnectionFactory;
|
||||
use phpOMS\DataStorage\Database\DatabaseStatus;
|
||||
|
|
@ -25,6 +26,8 @@ use phpOMS\System\File\Local\Directory;
|
|||
use phpOMS\Utils\IO\Zip\Zip;
|
||||
use Modules\Media\Controller\ApiController;
|
||||
use Modules\Exchange\Models\ImporterAbstract;
|
||||
use phpOMS\Message\Http\HttpRequest;
|
||||
use Modules\Exchange\Models\ExchangeType;
|
||||
|
||||
/**
|
||||
* OMS import class
|
||||
|
|
@ -64,7 +67,7 @@ final class Importer extends ImporterAbstract
|
|||
*/
|
||||
public function import(\DateTime $start, \DateTime $end) : void
|
||||
{
|
||||
$this->importLanguage();
|
||||
$this->importLanguage(new HttpRequest());
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -72,11 +75,11 @@ final class Importer extends ImporterAbstract
|
|||
*
|
||||
* @param RequestAbstract $request Request
|
||||
*
|
||||
* @return bool
|
||||
* @return array
|
||||
*
|
||||
* @since 1.0.0
|
||||
*/
|
||||
public function importFromRequest(RequestAbstract $request) : bool
|
||||
public function importFromRequest(RequestAbstract $request) : array
|
||||
{
|
||||
$start = new \DateTime($request->getData('start') ?? 'now');
|
||||
$end = new \DateTime($request->getData('end') ?? 'now');
|
||||
|
|
@ -95,17 +98,27 @@ final class Importer extends ImporterAbstract
|
|||
$this->remote->connect();
|
||||
|
||||
if ($this->remote->getStatus() !== DatabaseStatus::OK) {
|
||||
return false;
|
||||
return ['status' => false];
|
||||
}
|
||||
}
|
||||
|
||||
$this->account = $request->header->account;
|
||||
|
||||
$result = ['status' => true];
|
||||
|
||||
if ($request->getData('type') === 'language') {
|
||||
$this->importLanguage($request);
|
||||
$log = new ExchangeLog();
|
||||
$log->createdBy = $this->account;
|
||||
$log->setType(ExchangeType::IMPORT);
|
||||
$log->message = 'Language file imported.'; // @todo: localize!
|
||||
$log->subtype = 'language';
|
||||
$log->exchange = (int) $request->getData('id');
|
||||
|
||||
$result['logs'][] = $log;
|
||||
}
|
||||
|
||||
return true;
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ $lang = $this->getData('lang');
|
|||
<div class="row">
|
||||
<div class="col-xs-12 col-md-6">
|
||||
<section class="portlet">
|
||||
<form id="fImport" method="POST" action="<?= \phpOMS\Uri\UriFactory::build('{/api}admin/exchange/export/profile?{?}&exchange=OMS&type=language&csrf={$CSRF}'); ?>">
|
||||
<form id="fImport" method="POST" action="<?= \phpOMS\Uri\UriFactory::build('{/api}admin/exchange/export/profile?{?}&id={?id}&type=language&csrf={$CSRF}'); ?>">
|
||||
<div class="portlet-head"><?= $this->printHtml($lang['Language']); ?> - OMS</div>
|
||||
<div class="portlet-body">
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ $lang = $this->getData('lang');
|
|||
<div class="row">
|
||||
<div class="col-xs-12 col-md-6">
|
||||
<section class="portlet">
|
||||
<form id="fImport" method="POST" action="<?= \phpOMS\Uri\UriFactory::build('{/api}admin/exchange/import/profile?{?}&exchange=OMS&type=language&csrf={$CSRF}'); ?>">
|
||||
<form id="fImport" method="POST" action="<?= \phpOMS\Uri\UriFactory::build('{/api}admin/exchange/import/profile?{?}&id={?id}&type=language&csrf={$CSRF}'); ?>">
|
||||
<div class="portlet-head"><?= $this->printHtml($lang['Language']); ?> - OMS</div>
|
||||
<div class="portlet-body">
|
||||
<table class="layout wf-100" style="table-layout: fixed">
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ declare(strict_types=1);
|
|||
|
||||
namespace Modules\Exchange\Models;
|
||||
|
||||
use Modules\Admin\Models\Account;
|
||||
use phpOMS\Contract\ArrayableInterface;
|
||||
|
||||
/**
|
||||
|
|
@ -60,6 +61,14 @@ class ExchangeLog implements \JsonSerializable, ArrayableInterface
|
|||
|
||||
public string $subtype = '';
|
||||
|
||||
/**
|
||||
* Exchange id.
|
||||
*
|
||||
* @var int
|
||||
* @since 1.0.0
|
||||
*/
|
||||
public int|InterfaceManager $exchange = 0;
|
||||
|
||||
/**
|
||||
* Date type.
|
||||
*
|
||||
|
|
@ -68,7 +77,7 @@ class ExchangeLog implements \JsonSerializable, ArrayableInterface
|
|||
*/
|
||||
public \DateTimeImmutable $createdAt;
|
||||
|
||||
public int $createdBy = 0;
|
||||
public int|Account $createdBy = 0;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
|
|
|
|||
|
|
@ -15,6 +15,7 @@ declare(strict_types=1);
|
|||
namespace Modules\Exchange\Models;
|
||||
|
||||
use phpOMS\DataStorage\Database\DataMapperAbstract;
|
||||
use Modules\Admin\Models\AccountMapper;
|
||||
|
||||
/**
|
||||
* Exchange log mapper class.
|
||||
|
|
@ -37,7 +38,10 @@ final class ExchangeLogMapper extends DataMapperAbstract
|
|||
'exchange_log_message' => ['name' => 'exchange_log_message', 'type' => 'string', 'internal' => 'message'],
|
||||
'exchange_log_fields' => ['name' => 'exchange_log_fields', 'type' => 'Json', 'internal' => 'fields'],
|
||||
'exchange_log_type' => ['name' => 'exchange_log_type', 'type' => 'int', 'internal' => 'type'],
|
||||
'exchange_log_time' => ['name' => 'exchange_log_time', 'type' => 'DateTimeImmutable', 'internal' => 'createdAt'],
|
||||
'exchange_log_subtype' => ['name' => 'exchange_log_subtype', 'type' => 'string', 'internal' => 'subtype'],
|
||||
'exchange_log_created_at' => ['name' => 'exchange_log_created_at', 'type' => 'DateTimeImmutable', 'internal' => 'createdAt', 'readonly' => true],
|
||||
'exchange_log_created_by' => ['name' => 'exchange_log_created_by', 'type' => 'int', 'internal' => 'createdBy', 'readonly' => true],
|
||||
'exchange_log_exchange' => ['name' => 'exchange_log_exchange', 'type' => 'int', 'internal' => 'exchange'],
|
||||
];
|
||||
|
||||
/**
|
||||
|
|
@ -63,4 +67,21 @@ final class ExchangeLogMapper extends DataMapperAbstract
|
|||
* @since 1.0.0
|
||||
*/
|
||||
protected static string $primaryField = 'exchange_log_id';
|
||||
|
||||
/**
|
||||
* Belongs to.
|
||||
*
|
||||
* @var array<string, array{mapper:string, external:string}>
|
||||
* @since 1.0.0
|
||||
*/
|
||||
protected static array $belongsTo = [
|
||||
'createdBy' => [
|
||||
'mapper' => AccountMapper::class,
|
||||
'external' => 'exchange_log_created_by',
|
||||
],
|
||||
'exchange' => [
|
||||
'mapper' => InterfaceManagerMapper::class,
|
||||
'external' => 'exchange_log_exchange',
|
||||
],
|
||||
];
|
||||
}
|
||||
|
|
|
|||
|
|
@ -52,9 +52,9 @@ abstract class ImporterAbstract
|
|||
*
|
||||
* @param RequestAbstract $request Request
|
||||
*
|
||||
* @return bool
|
||||
* @return array
|
||||
*
|
||||
* @since 1.0.0
|
||||
*/
|
||||
abstract public function importFromRequest(RequestAbstract $request) : bool;
|
||||
abstract public function importFromRequest(RequestAbstract $request) : array;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,16 +0,0 @@
|
|||
<?php
|
||||
/**
|
||||
* Orange Management
|
||||
*
|
||||
* PHP Version 8.0
|
||||
*
|
||||
* @package Modules\Exchange
|
||||
* @copyright Dennis Eichhorn
|
||||
* @license OMS License 1.0
|
||||
* @version 1.0.0
|
||||
* @link https://orange-management.org
|
||||
*/
|
||||
declare(strict_types=1);
|
||||
|
||||
/** @var \phpOMS\Views\View $this */
|
||||
echo $this->getData('nav')->render();
|
||||
54
Theme/Backend/exchange-log-list.tpl.php
Executable file
54
Theme/Backend/exchange-log-list.tpl.php
Executable file
|
|
@ -0,0 +1,54 @@
|
|||
<?php
|
||||
/**
|
||||
* Orange Management
|
||||
*
|
||||
* PHP Version 8.0
|
||||
*
|
||||
* @package Modules\Exchange
|
||||
* @copyright Dennis Eichhorn
|
||||
* @license OMS License 1.0
|
||||
* @version 1.0.0
|
||||
* @link https://orange-management.org
|
||||
*/
|
||||
declare(strict_types=1);
|
||||
|
||||
use phpOMS\Uri\UriFactory;
|
||||
|
||||
/** @var \phpOMS\Views\View $this */
|
||||
$logs = $this->getData('logs') ?? [];
|
||||
|
||||
echo $this->getData('nav')->render(); ?>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-xs-12">
|
||||
<div class="portlet">
|
||||
<div class="portlet-head"><?= $this->getHtml('Logs'); ?><i class="fa fa-download floatRight download btn"></i></div>
|
||||
<table id="exchangeLogs" class="default">
|
||||
<thead>
|
||||
<tr>
|
||||
<td><?= $this->getHtml('ID', '0', '0'); ?>
|
||||
<td><?= $this->getHtml('Type'); ?>
|
||||
<td><?= $this->getHtml('Subtype'); ?>
|
||||
<td class="wf-100"><?= $this->getHtml('Exchange'); ?>
|
||||
<td><?= $this->getHtml('CreatedBy'); ?>
|
||||
<td><?= $this->getHtml('CreatedAt'); ?>
|
||||
<tbody>
|
||||
<?php $count = 0; foreach ($logs as $key => $value) :
|
||||
++$count;
|
||||
$url = UriFactory::build('{/prefix}admin/exchange/log?{?}&id=' . $value->getId());
|
||||
?>
|
||||
<tr data-href="<?= $url; ?>">
|
||||
<td><a href="<?= $url; ?>"><?= $value->getId(); ?></a>
|
||||
<td><a href="<?= $url; ?>"><?= $value->getType(); ?></a>
|
||||
<td><a href="<?= $url; ?>"><?= $value->subtype; ?></a>
|
||||
<td><a href="<?= $url; ?>"><?= $value->exchange->getName(); ?></a>
|
||||
<td><a href="<?= $url; ?>"><?= $value->createdBy->name1; ?></a>
|
||||
<td><a href="<?= $url; ?>"><?= $value->createdAt->format('Y-m-d'); ?></a>
|
||||
<?php endforeach; ?>
|
||||
<?php if ($count === 0) : ?>
|
||||
<tr><td colspan="9" class="empty"><?= $this->getHtml('Empty', '0', '0'); ?>
|
||||
<?php endif; ?>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
0
Theme/Backend/exchange-log.tpl.php
Normal file
0
Theme/Backend/exchange-log.tpl.php
Normal file
Loading…
Reference in New Issue
Block a user