Quick backup before crash

This commit is contained in:
Dennis Eichhorn 2023-06-13 18:55:51 +00:00
parent 1e5b0336bc
commit 9834a132de
16 changed files with 178 additions and 107 deletions

View File

@ -12,7 +12,8 @@
*/ */
declare(strict_types=1); declare(strict_types=1);
$data = $this->getData('data') ?? []; /** @var \phpOMS\Views\View $this */
$data = $this->data['data'] ?? [];
$out = \fopen('php://output', 'w'); $out = \fopen('php://output', 'w');
if ($out !== false) { if ($out !== false) {

View File

@ -18,6 +18,11 @@ use PhpOffice\PhpSpreadsheet\Worksheet\PageSetup;
class DefaultExcel extends \PhpOffice\PhpSpreadsheet\Spreadsheet class DefaultExcel extends \PhpOffice\PhpSpreadsheet\Spreadsheet
{ {
/**
* Constructor.
*
* @since 1.0.0
*/
public function __construct() public function __construct()
{ {
parent::__construct(); parent::__construct();

View File

@ -35,13 +35,14 @@ foreach ($data as $i => $row) {
} }
$file = \tempnam(\sys_get_temp_dir(), 'oms_'); $file = \tempnam(\sys_get_temp_dir(), 'oms_');
if ($file !== false) {
$writer = IOFactory::createWriter($excel, 'Xlsx');
$writer->save($file);
$writer = IOFactory::createWriter($excel, 'Xlsx'); $content = \file_get_contents($file);
$writer->save($file); if ($content !== false) {
echo $content;
}
$content = \file_get_contents($file); \unlink($file);
if ($content !== false) {
echo $content;
} }
\unlink($file);

View File

@ -15,12 +15,14 @@ declare(strict_types=1);
/** /**
* Default PDF class. * Default PDF class.
* *
* The TCPDF class must be included previously in the parent code.
*
* @package Modules\Media * @package Modules\Media
* @license OMS License 2.0 * @license OMS License 2.0
* @link https://jingga.app * @link https://jingga.app
* @since 1.0.0 * @since 1.0.0
* *
* @phpstan-import-type TCPDF from ../../../../../Resources/tcpdf/tcpdf.php * @link ../../../../../../Resources/tcpdf/tcpdf.php
*/ */
class DefaultPdf extends TCPDF class DefaultPdf extends TCPDF
{ {

View File

@ -38,8 +38,20 @@ class DefaultWord extends \PhpOffice\PhpWord\PhpWord
*/ */
public int $fontSize = 8; public int $fontSize = 8;
/**
* Doc language
*
* @var string
* @since 1.0.0
*/
public string $language = 'en'; public string $language = 'en';
/**
* Localization
*
* @var array
* @since 1.0.0
*/
public array $lang = [ public array $lang = [
'en' => [ 'en' => [
'Page' => 'Page', 'Page' => 'Page',
@ -59,6 +71,12 @@ class DefaultWord extends \PhpOffice\PhpWord\PhpWord
], ],
]; ];
/**
* Attributes
*
* @var string[]
* @since 1.0.0
*/
public array $attributes = [ public array $attributes = [
'logo' => __DIR__ . '/../Web/Backend/img/logo.png', 'logo' => __DIR__ . '/../Web/Backend/img/logo.png',
'title_name' => 'Jingga', 'title_name' => 'Jingga',
@ -91,6 +109,13 @@ class DefaultWord extends \PhpOffice\PhpWord\PhpWord
$this->addTableStyle('FooterTableStyle', $generalTableStyle); $this->addTableStyle('FooterTableStyle', $generalTableStyle);
} }
/**
* Create the first page
*
* @return \PhpOffice\PhpWord\Element\Section
*
* @since 1.0.0
*/
public function createFirstPage() public function createFirstPage()
{ {
$section = $this->addSection([ $section = $this->addSection([
@ -167,6 +192,13 @@ class DefaultWord extends \PhpOffice\PhpWord\PhpWord
return $section; return $section;
} }
/**
* Create second page
*
* @return \PhpOffice\PhpWord\Element\Section
*
* @since 1.0.0
*/
public function createSecondPage() public function createSecondPage()
{ {
$section = $this->addSection([ $section = $this->addSection([

View File

@ -30,9 +30,11 @@ $section = $word->createFirstPage();
$file = \tempnam(\sys_get_temp_dir(), 'oms_'); $file = \tempnam(\sys_get_temp_dir(), 'oms_');
//$writer->save($file); //$writer->save($file);
$content = \file_get_contents($file); if ($file !== false) {
if ($content !== false) { $content = \file_get_contents($file);
echo $content; if ($content !== false) {
} echo $content;
}
\unlink($file); \unlink($file);
}

View File

@ -52,6 +52,10 @@ $tbl .= '</table>';
\PhpOffice\PhpWord\Shared\Html::addHtml($section, $tbl, false, false); \PhpOffice\PhpWord\Shared\Html::addHtml($section, $tbl, false, false);
$file = \tempnam(\sys_get_temp_dir(), 'oms_'); $file = \tempnam(\sys_get_temp_dir(), 'oms_');
if ($file === false) {
return '';
}
$writer->save($file); $writer->save($file);
echo \file_get_contents($file); echo \file_get_contents($file);

View File

@ -35,6 +35,6 @@ if ($file !== false) {
if ($content !== false) { if ($content !== false) {
echo $content; echo $content;
} }
}
\unlink($file); \unlink($file);
}

View File

@ -800,7 +800,7 @@ final class ApiController extends Controller
->execute(); ->execute();
if (($request->getData('localization_load') ?? '-1') !== '-1') { if (($request->getData('localization_load') ?? '-1') !== '-1') {
$locale = \explode('_', $request->getData('localization_load')); $locale = \explode('_', $request->getData('localization_load') ?? '');
$old = clone $account->l11n; $old = clone $account->l11n;
$account->l11n->loadFromLanguage($locale[0], $locale[1]); $account->l11n->loadFromLanguage($locale[0], $locale[1]);
@ -1458,7 +1458,12 @@ final class ApiController extends Controller
); );
if (!empty($defaultGroupSettings)) { if (!empty($defaultGroupSettings)) {
$defaultGroupIds = \array_merge($defaultGroupIds, \json_decode($defaultGroupSettings->content, true)); $temp = \json_decode($defaultGroupSettings->content, true);
if (!\is_array($temp)) {
$temp = [];
}
$defaultGroupIds = \array_merge($defaultGroupIds, $temp);
} }
} }
@ -1471,7 +1476,12 @@ final class ApiController extends Controller
); );
if (!empty($defaultGroupSettings)) { if (!empty($defaultGroupSettings)) {
$defaultGroupIds = \array_merge($defaultGroupIds, \json_decode($defaultGroupSettings->content, true)); $temp = \json_decode($defaultGroupSettings->content, true);
if (!\is_array($temp)) {
$temp = [];
}
$defaultGroupIds = \array_merge($defaultGroupIds, $temp);
} }
} }
@ -1668,9 +1678,14 @@ final class ApiController extends Controller
); );
if (!empty($defaultGroupSettings)) { if (!empty($defaultGroupSettings)) {
$temp = \json_decode($defaultGroupSettings->content, true);
if (!\is_array($temp)) {
$temp = [];
}
$defaultGroupIds = \array_merge( $defaultGroupIds = \array_merge(
$defaultGroupIds, $defaultGroupIds,
\json_decode($defaultGroupSettings->content, true) $temp
); );
} }
} }
@ -1684,9 +1699,14 @@ final class ApiController extends Controller
); );
if (!empty($defaultGroupSettings)) { if (!empty($defaultGroupSettings)) {
$temp = \json_decode($defaultGroupSettings->content, true);
if (!\is_array($temp)) {
$temp = [];
}
$defaultGroupIds = \array_merge( $defaultGroupIds = \array_merge(
$defaultGroupIds, $defaultGroupIds,
\json_decode($defaultGroupSettings->content, true) $temp
); );
} }
} }
@ -1736,7 +1756,7 @@ final class ApiController extends Controller
$request->setData('create_profile', (string) true); $request->setData('create_profile', (string) true);
$request->setData('name1', !$request->hasData('name1') $request->setData('name1', !$request->hasData('name1')
? (!$request->hasData('user') ? (!$request->hasData('user')
? \explode('@', $request->getDataString('email'))[0] ? \explode('@', $request->getDataString('email') ?? '')[0]
: $request->getDataString('user') : $request->getDataString('user')
) )
: $request->getDataString('name1') : $request->getDataString('name1')
@ -1768,6 +1788,61 @@ final class ApiController extends Controller
++$tries; ++$tries;
} while ($dataChange->id === 0 && $tries < 5); } while ($dataChange->id === 0 && $tries < 5);
$handler = $this->setUpServerMailHandler();
/** @var \Model\Setting[] $emailSettings */
$emailSettings = $this->app->appSettings->get(
names: [SettingsEnum::MAIL_SERVER_ADDR, SettingsEnum::LOGIN_MAIL_REGISTRATION_TEMPLATE],
module: 'Admin'
);
/** @var \Modules\Messages\Models\Email $mail */
$mail = EmailMapper::get()
->with('l11n')
->where('id', (int) $emailSettings[SettingsEnum::LOGIN_MAIL_REGISTRATION_TEMPLATE]->content)
->where('l11n/language', $response->header->l11n->language)
->execute();
$mail->setFrom($emailSettings[SettingsEnum::MAIL_SERVER_ADDR]->content);
$mail->addTo((string) $request->getData('email'));
// @todo: load default l11n if no translation is available
$mailL11n = $mail->getL11nByLanguage($response->header->l11n->language);
$mail->subject = $mailL11n->subject;
// @todo: improve, the /tld link could be api.myurl.com which of course is not the url of the respective app.
// Maybe store the uri in the $app model? or store all urls in the config file
$mail->body = \str_replace(
[
'{confirmation_link}',
'{user_name}',
],
[
UriFactory::hasQuery('/' . \strtolower($app->name))
? UriFactory::build('{/' . \strtolower($app->name) . '}/' . \strtolower($app->name) . '/signup/confirmation?hash=' . $dataChange->getHash())
: UriFactory::build('{/tld}/{/lang}/' . \strtolower($app->name) . '/signup/confirmation?hash=' . $dataChange->getHash()),
$account->login,
],
$mailL11n->body
);
$mail->bodyAlt = \str_replace(
[
'{confirmation_link}',
'{user_name}',
],
[
UriFactory::hasQuery('/' . \strtolower($app->name))
? UriFactory::build('{/' . \strtolower($app->name) . '}/' . \strtolower($app->name) . '/signup/confirmation?hash=' . $dataChange->getHash())
: UriFactory::build('{/tld}/{/lang}/' . \strtolower($app->name) . '/signup/confirmation?hash=' . $dataChange->getHash()),
$account->login,
],
$mailL11n->bodyAlt
);
$handler->send($mail);
} }
// Create client // Create client
@ -1794,60 +1869,6 @@ final class ApiController extends Controller
} }
} }
$handler = $this->setUpServerMailHandler();
$emailSettings = $this->app->appSettings->get(
names: [SettingsEnum::MAIL_SERVER_ADDR, SettingsEnum::LOGIN_MAIL_REGISTRATION_TEMPLATE],
module: 'Admin'
);
/** @var \Modules\Messages\Models\Email $mail */
$mail = EmailMapper::get()
->with('l11n')
->where('id', (int) $emailSettings[SettingsEnum::LOGIN_MAIL_REGISTRATION_TEMPLATE]->content)
->where('l11n/language', $response->header->l11n->language)
->execute();
$mail->setFrom($emailSettings[SettingsEnum::MAIL_SERVER_ADDR]->content);
$mail->addTo((string) $request->getData('email'));
// @todo: load default l11n if no translation is available
$mailL11n = $mail->getL11nByLanguage($response->header->l11n->language);
$mail->subject = $mailL11n->subject;
// @todo: improve, the /tld link could be api.myurl.com which of course is not the url of the respective app.
// Maybe store the uri in the $app model? or store all urls in the config file
$mail->body = \str_replace(
[
'{confirmation_link}',
'{user_name}',
],
[
UriFactory::hasQuery('/' . \strtolower($app->name))
? UriFactory::build('{/' . \strtolower($app->name) . '}/' . \strtolower($app->name) . '/signup/confirmation?hash=' . $dataChange->getHash())
: UriFactory::build('{/tld}/{/lang}/' . \strtolower($app->name) . '/signup/confirmation?hash=' . $dataChange->getHash()),
$account->login,
],
$mailL11n->body
);
$mail->bodyAlt = \str_replace(
[
'{confirmation_link}',
'{user_name}',
],
[
UriFactory::hasQuery('/' . \strtolower($app->name))
? UriFactory::build('{/' . \strtolower($app->name) . '}/' . \strtolower($app->name) . '/signup/confirmation?hash=' . $dataChange->getHash())
: UriFactory::build('{/tld}/{/lang}/' . \strtolower($app->name) . '/signup/confirmation?hash=' . $dataChange->getHash()),
$account->login,
],
$mailL11n->bodyAlt
);
$handler->send($mail);
$this->fillJsonResponse( $this->fillJsonResponse(
$request, $request,
$response, $response,
@ -2029,7 +2050,7 @@ final class ApiController extends Controller
$account->l11n $account->l11n
->loadFromLanguage( ->loadFromLanguage(
$locale[0] ?? $this->app->l11nServer->language, $locale[0] ?? $this->app->l11nServer->language,
$locale[1] ?? $this->app->l11nServer->getCountry() $locale[1] ?? $this->app->l11nServer->country
); );
} }
@ -2527,12 +2548,12 @@ final class ApiController extends Controller
? new GroupPermission((int) $request->getData('permissionref')) ? new GroupPermission((int) $request->getData('permissionref'))
: new AccountPermission((int) $request->getData('permissionref')); : new AccountPermission((int) $request->getData('permissionref'));
$permission->setUnit($request->getDataInt('permissionunit')); $permission->unit = $request->getDataInt('permissionunit');
$permission->setApp($request->getDataInt('permissionapp')); $permission->app = $request->getDataInt('permissionapp');
$permission->setModule($request->getDataString('permissionmodule')); $permission->module = $request->getDataString('permissionmodule');
$permission->setCategory($request->getDataInt('permissioncategory')); $permission->category = $request->getDataInt('permissioncategory');
$permission->setElement($request->getDataInt('permissionelement')); $permission->element = $request->getDataInt('permissionelement');
$permission->setComponent($request->getDataInt('permissioncomponent')); $permission->component = $request->getDataInt('permissioncomponent');
$permission->setPermission( $permission->setPermission(
($request->getDataInt('permissionread') ?? 0) ($request->getDataInt('permissionread') ?? 0)
| ($request->getDataInt('permissioncreate') ?? 0) | ($request->getDataInt('permissioncreate') ?? 0)
@ -2613,12 +2634,12 @@ final class ApiController extends Controller
*/ */
private function updatePermissionFromRequest(RequestAbstract $request, PermissionAbstract $permission) : PermissionAbstract private function updatePermissionFromRequest(RequestAbstract $request, PermissionAbstract $permission) : PermissionAbstract
{ {
$permission->setUnit($request->getDataInt('permissionunit') ?? $permission->getUnit()); $permission->unit = $request->getDataInt('permissionunit') ?? $permission->unit;
$permission->setApp($request->getDataInt('permissionapp') ?? $permission->getApp()); $permission->app = $request->getDataInt('permissionapp') ?? $permission->app;
$permission->setModule($request->getDataString('permissionmodule') ?? $permission->getModule()); $permission->module = $request->getDataString('permissionmodule') ?? $permission->module;
$permission->setCategory($request->getDataInt('permissioncategory') ?? $permission->getCategory()); $permission->category = $request->getDataInt('permissioncategory') ?? $permission->category;
$permission->setElement($request->getDataInt('permissionelement') ?? $permission->getElement()); $permission->element = $request->getDataInt('permissionelement') ?? $permission->element;
$permission->setComponent($request->getDataInt('permissioncomponent') ?? $permission->getComponent()); $permission->component = $request->getDataInt('permissioncomponent') ?? $permission->component;
$permission->setPermission(($request->getDataInt('permissioncreate') ?? 0) $permission->setPermission(($request->getDataInt('permissioncreate') ?? 0)
| ($request->getDataInt('permissionread') ?? 0) | ($request->getDataInt('permissionread') ?? 0)
| ($request->getDataInt('permissionupdate') ?? 0) | ($request->getDataInt('permissionupdate') ?? 0)

View File

@ -694,10 +694,10 @@ final class BackendController extends Controller
$id = $request->getDataString('id') ?? ''; $id = $request->getDataString('id') ?? '';
/** @var null|\Model\NullSetting|\Model\Setting[] $settings */ /** @var \Model\Setting[] $settings */
$settings = SettingMapper::getAll()->where('module', $id)->execute(); $settings = SettingMapper::getAll()->where('module', $id)->execute();
if ($settings->id > 0) { if (empty($settings)) {
$view->data['settings'] = \is_array($settings) ? $settings : [$settings]; $view->data['settings'] = $settings;
} }
$class = '\\Modules\\' . $request->getData('id') . '\\Models\\SettingsEnum'; $class = '\\Modules\\' . $request->getData('id') . '\\Models\\SettingsEnum';

View File

@ -21,6 +21,9 @@ namespace Modules\Admin\Models;
* @license OMS License 2.0 * @license OMS License 2.0
* @link https://jingga.app * @link https://jingga.app
* @since 1.0.0 * @since 1.0.0
*
* @template T of Account
* @extends AccountMapper<T>
*/ */
final class AccountCredentialMapper extends AccountMapper final class AccountCredentialMapper extends AccountMapper
{ {

View File

@ -46,7 +46,7 @@ class AccountExternal
* @var int * @var int
* @since 1.0.0 * @since 1.0.0
*/ */
private int $subtype = AccountExternalSubtype::STRIPE; public int $subtype = AccountExternalSubtype::STRIPE;
/** /**
* External status. * External status.

View File

@ -24,7 +24,7 @@ use phpOMS\DataStorage\Database\Mapper\DataMapperFactory;
* @link https://jingga.app * @link https://jingga.app
* @since 1.0.0 * @since 1.0.0
* *
* @template T of AccoutExternal * @template T of AccountExternal
* @extends DataMapperFactory<T> * @extends DataMapperFactory<T>
*/ */
class AccountExternalMapper extends DataMapperFactory class AccountExternalMapper extends DataMapperFactory

View File

@ -25,7 +25,7 @@ use phpOMS\DataStorage\Database\Mapper\DataMapperFactory;
* @link https://jingga.app * @link https://jingga.app
* @since 1.0.0 * @since 1.0.0
* *
* @template T of PermissionAbstract * @template T of \phpOMS\Account\PermissionAbstract
* @extends DataMapperFactory<T> * @extends DataMapperFactory<T>
*/ */
final class PermissionAbstractMapper extends DataMapperFactory final class PermissionAbstractMapper extends DataMapperFactory

View File

@ -318,12 +318,12 @@ echo $this->data['nav']->render(); ?>
<td><a href="#"><i class="fa fa-times"></i></a> <td><a href="#"><i class="fa fa-times"></i></a>
<td><a href="#"><i class="fa fa-cogs"></i></a> <td><a href="#"><i class="fa fa-cogs"></i></a>
<td><?= $value->id; ?> <td><?= $value->id; ?>
<td><?= $value->getUnit(); ?> <td><?= $this->printHtml($value->unit); ?>
<td><?= $value->getApp(); ?> <td><?= $this->printHtml($value->app); ?>
<td><?= $value->getModule(); ?> <td><?= $this->printHtml($value->module); ?>
<td><?= $value->getCategory(); ?> <td><?= $this->printHtml($value->category); ?>
<td><?= $value->getElement(); ?> <td><?= $this->printHtml($value->element); ?>
<td><?= $value->getComponent(); ?> <td><?= $this->printHtml($value->component); ?>
<td> <td>
<?= (PermissionType::CREATE | $permission) === $permission ? 'C' : ''; ?> <?= (PermissionType::CREATE | $permission) === $permission ? 'C' : ''; ?>
<?= (PermissionType::READ | $permission) === $permission ? 'R' : ''; ?> <?= (PermissionType::READ | $permission) === $permission ? 'R' : ''; ?>

View File

@ -269,12 +269,12 @@ echo $this->data['nav']->render(); ?>
<td><a href="#"><i class="fa fa-times"></i></a> <td><a href="#"><i class="fa fa-times"></i></a>
<td><i class="fa fa-cogs update btn"></i> <td><i class="fa fa-cogs update btn"></i>
<td><?= $value->id; ?> <td><?= $value->id; ?>
<td data-tpl-text="/unit" data-tpl-value="/unit"><?= $value->getUnit(); ?> <td data-tpl-text="/unit" data-tpl-value="/unit"><?= $this->printHtml($value->unit); ?>
<td data-tpl-text="/app" data-tpl-value="/app"><?= $value->getApp(); ?> <td data-tpl-text="/app" data-tpl-value="/app"><?= $this->printHtml($value->app); ?>
<td data-tpl-text="/module" data-tpl-value="/module"><?= $value->getModule(); ?> <td data-tpl-text="/module" data-tpl-value="/module"><?= $this->printHtml($value->module); ?>
<td data-tpl-text="/type" data-tpl-value="/type"><?= $value->getCategory(); ?> <td data-tpl-text="/type" data-tpl-value="/type"><?= $this->printHtml($value->category); ?>
<td data-tpl-text="/ele" data-tpl-value="/ele"><?= $value->getElement(); ?> <td data-tpl-text="/ele" data-tpl-value="/ele"><?= $this->printHtml($value->element); ?>
<td data-tpl-text="/comp" data-tpl-value="/comp"><?= $value->getComponent(); ?> <td data-tpl-text="/comp" data-tpl-value="/comp"><?= $this->printHtml($value->component); ?>
<td> <td>
<?php if ((PermissionType::CREATE | $permission) === $permission) : ?> <?php if ((PermissionType::CREATE | $permission) === $permission) : ?>
<span data-tpl-text="/perm/c" data-tpl-value="/perm/c" data-value="<?= PermissionType::CREATE; ?>">C</span> <span data-tpl-text="/perm/c" data-tpl-value="/perm/c" data-value="<?= PermissionType::CREATE; ?>">C</span>