From 707f2243f071577369399fa6e0067191e91363fb Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Sat, 6 May 2023 11:42:06 +0000 Subject: [PATCH] make id public, organigram impl. media password/encryption, settings bug fix, Money->FloatInt change, ... --- Admin/Install/db.json | 41 +++++++++ Admin/Installer.php | 19 +++- Controller/ApiController.php | 86 +++++++++++++++-- Models/Email.php | 15 ++- Models/EmailL11n.php | 133 +++++++++++++++++++++++++++ Models/EmailL11nMapper.php | 62 +++++++++++++ Models/EmailMapper.php | 6 ++ Models/NullEmailL11n.php | 46 +++++++++ Theme/Backend/mail-dashboard.tpl.php | 4 +- 9 files changed, 400 insertions(+), 12 deletions(-) create mode 100644 Models/EmailL11n.php create mode 100644 Models/EmailL11nMapper.php create mode 100644 Models/NullEmailL11n.php diff --git a/Admin/Install/db.json b/Admin/Install/db.json index d7e537b..dbf8541 100755 --- a/Admin/Install/db.json +++ b/Admin/Install/db.json @@ -147,6 +147,47 @@ } } }, + "messages_mail_l11n": { + "name": "messages_mail_l11n", + "fields": { + "messages_mail_l11n_id": { + "name": "messages_mail_l11n_id", + "type": "INT", + "null": false, + "primary": true, + "autoincrement": true + }, + "messages_mail_l11n_subject": { + "name": "messages_mail_l11n_subject", + "type": "TEXT", + "null": false + }, + "messages_mail_l11n_body": { + "name": "messages_mail_l11n_body", + "type": "TEXT", + "null": false + }, + "messages_mail_l11n_bodyalt": { + "name": "messages_mail_l11n_bodyalt", + "type": "TEXT", + "null": false + }, + "messages_mail_l11n_message": { + "name": "messages_mail_l11n_message", + "type": "INT(11)", + "null": false, + "foreignTable": "messages_mail", + "foreignKey": "messages_mail_id" + }, + "messages_mail_l11n_lang": { + "name": "messages_mail_l11n_lang", + "type": "VARCHAR(2)", + "null": false, + "foreignTable": "language", + "foreignKey": "language_639_1" + } + } + }, "messages_channel": { "description": "Only for internal purposes, can be a server or group chat or 1v1 chat", "name": "messages_channel", diff --git a/Admin/Installer.php b/Admin/Installer.php index 493e1d7..85eb0d9 100755 --- a/Admin/Installer.php +++ b/Admin/Installer.php @@ -18,7 +18,6 @@ use phpOMS\Application\ApplicationAbstract; use phpOMS\Message\Http\HttpRequest; use phpOMS\Message\Http\HttpResponse; use phpOMS\Module\InstallerAbstract; -use phpOMS\Module\ModuleInfo; use phpOMS\System\File\PathException; use phpOMS\Uri\HttpUri; @@ -58,7 +57,7 @@ final class Installer extends InstallerAbstract public static function installExternal(ApplicationAbstract $app, array $data) : array { try { - $app->dbPool->get()->con->query('select 1 from `editor_doc`'); + $app->dbPool->get()->con->query('select 1 from `messages_mail`'); } catch (\Exception $e) { return []; // @codeCoverageIgnore } @@ -142,6 +141,22 @@ final class Installer extends InstallerAbstract return []; } + $emailId = $responseData['response']->id; + + foreach ($data['l11n'] as $language => $l11n) { + $l11nResponse = new HttpResponse(); + $l11nRequest = new HttpRequest(new HttpUri('')); + + $l11nRequest->header->account = 1; + $l11nRequest->setData('email', $emailId); + $l11nRequest->setData('language', $language); + $l11nRequest->setData('subject', $l11n['subject'] ?? ''); + $l11nRequest->setData('body', $l11n['body'] ?? ''); + $l11nRequest->setData('bodyalt', $l11n['bodyalt'] ?? ''); + + $module->apiEmailL11nCreate($l11nRequest, $l11nResponse); + } + return !\is_array($responseData['response']) ? $responseData['response']->toArray() : $responseData['response']; diff --git a/Controller/ApiController.php b/Controller/ApiController.php index bc3ec2a..7b011f7 100755 --- a/Controller/ApiController.php +++ b/Controller/ApiController.php @@ -16,6 +16,8 @@ namespace Modules\Messages\Controller; use Modules\Admin\Models\NullAccount; use Modules\Messages\Models\Email; +use Modules\Messages\Models\EmailL11n; +use Modules\Messages\Models\EmailL11nMapper; use Modules\Messages\Models\EmailMapper; use phpOMS\Message\Http\RequestStatusCode; use phpOMS\Message\NotificationLevel; @@ -74,8 +76,7 @@ final class ApiController extends Controller private function validateEmailCreate(RequestAbstract $request) : array { $val = []; - if (($val['subject'] = !$request->hasData('subject')) - || ($val['body'] = !$request->hasData('body')) + if (false ) { return $val; } @@ -128,17 +129,88 @@ final class ApiController extends Controller $email->account = new NullAccount($request->getDataInt('account') ?? $request->header->account); $email->setHtml($request->getDataBool('ishtml') ?? false); - $email->subject = $request->getDataString('subject') ?? ''; - if ($request->getDataBool('ishtml') ?? false) { - $email->msgHTML($request->getDataString('body') ?? ''); - } else { - $email->body = $request->getDataString('body') ?? ''; + if ($request->hasData('body')) { + if ($request->getDataBool('ishtml') ?? false) { + $email->msgHTML($request->getDataString('body') ?? ''); + } else { + $email->body = $request->getDataString('body') ?? ''; + } } $email->bodyAlt = $request->getDataString('bodyalt') ?? ''; return $email; } + + /** + * Api method to create item l11n + * + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param mixed $data Generic data + * + * @return void + * + * @api + * + * @since 1.0.0 + */ + public function apiEmailL11nCreate(RequestAbstract $request, ResponseAbstract $response, mixed $data = null) : void + { + if (!empty($val = $this->validateEmailL11nCreate($request))) { + $response->set('email_l11n_create', new FormValidation($val)); + $response->header->status = RequestStatusCode::R_400; + + return; + } + + $emailL11n = $this->createEmailL11nFromRequest($request); + $this->createModel($request->header->account, $emailL11n, EmailL11nMapper::class, 'message_l11n', $request->getOrigin()); + $this->fillJsonResponse($request, $response, NotificationLevel::OK, 'Localization', 'Localization successfully created', $emailL11n); + } + + /** + * Method to create item l11n from request. + * + * @param RequestAbstract $request Request + * + * @return EmailL11n + * + * @since 1.0.0 + */ + private function createEmailL11nFromRequest(RequestAbstract $request) : EmailL11n + { + $itemL11n = new EmailL11n(); + $itemL11n->email = $request->getDataInt('email') ?? 0; + $itemL11n->setLanguage( + $request->getDataString('language') ?? $request->getLanguage() + ); + $itemL11n->subject = $request->getDataString('subject') ?? ''; + $itemL11n->body = $request->getDataString('body') ?? ''; + $itemL11n->bodyAlt = $request->getDataString('bodyalt') ?? ''; + + return $itemL11n; + } + + /** + * Validate item l11n create request + * + * @param RequestAbstract $request Request + * + * @return array + * + * @since 1.0.0 + */ + private function validateEmailL11nCreate(RequestAbstract $request) : array + { + $val = []; + if (($val['email'] = !$request->hasData('email')) + ) { + return $val; + } + + return []; + } } diff --git a/Models/Email.php b/Models/Email.php index 5c925de..1078754 100755 --- a/Models/Email.php +++ b/Models/Email.php @@ -34,7 +34,7 @@ class Email extends MailEmail implements \JsonSerializable * @var int * @since 1.0.0 */ - protected int $id = 0; + public int $id = 0; public Account $account; @@ -44,6 +44,8 @@ class Email extends MailEmail implements \JsonSerializable private array $media = []; + public array $l11n = []; + /** * Constructor. * @@ -67,6 +69,17 @@ class Email extends MailEmail implements \JsonSerializable return $this->id; } + public function getL11nByLanguage(string $language) : EmailL11n + { + foreach ($this->l11n as $l11n) { + if ($l11n->language->getLanguage() === $language) { + return $l11n; + } + } + + return new NullEmailL11n(); + } + /** * {@inheritdoc} */ diff --git a/Models/EmailL11n.php b/Models/EmailL11n.php new file mode 100644 index 0000000..e34c057 --- /dev/null +++ b/Models/EmailL11n.php @@ -0,0 +1,133 @@ +id; + } + + /** + * Get language + * + * @return string + * + * @since 1.0.0 + */ + public function getLanguage() : string + { + return $this->language; + } + + /** + * Set language + * + * @param string $language Language + * + * @return void + * + * @since 1.0.0 + */ + public function setLanguage(string $language) : void + { + $this->language = $language; + } + + /** + * {@inheritdoc} + */ + public function toArray() : array + { + return [ + 'id' => $this->id, + 'language' => $this->language, + ]; + } + + /** + * {@inheritdoc} + */ + public function jsonSerialize() : mixed + { + return $this->toArray(); + } +} diff --git a/Models/EmailL11nMapper.php b/Models/EmailL11nMapper.php new file mode 100644 index 0000000..1662b17 --- /dev/null +++ b/Models/EmailL11nMapper.php @@ -0,0 +1,62 @@ + + */ +final class EmailL11nMapper extends DataMapperFactory +{ + /** + * Columns. + * + * @var array + * @since 1.0.0 + */ + public const COLUMNS = [ + 'messages_mail_l11n_id' => ['name' => 'messages_mail_l11n_id', 'type' => 'int', 'internal' => 'id'], + 'messages_mail_l11n_subject' => ['name' => 'messages_mail_l11n_subject', 'type' => 'string', 'internal' => 'subject'], + 'messages_mail_l11n_body' => ['name' => 'messages_mail_l11n_body', 'type' => 'string', 'internal' => 'body'], + 'messages_mail_l11n_bodyalt' => ['name' => 'messages_mail_l11n_bodyalt', 'type' => 'string', 'internal' => 'bodyAlt'], + 'messages_mail_l11n_message' => ['name' => 'messages_mail_l11n_message', 'type' => 'int', 'internal' => 'email'], + 'messages_mail_l11n_lang' => ['name' => 'messages_mail_l11n_lang', 'type' => 'string', 'internal' => 'language'], + ]; + + /** + * Primary table. + * + * @var string + * @since 1.0.0 + */ + public const TABLE = 'messages_mail_l11n'; + + /** + * Primary field name. + * + * @var string + * @since 1.0.0 + */ + public const PRIMARYFIELD = 'messages_mail_l11n_id'; +} diff --git a/Models/EmailMapper.php b/Models/EmailMapper.php index a8be6a8..80a68d0 100755 --- a/Models/EmailMapper.php +++ b/Models/EmailMapper.php @@ -75,6 +75,12 @@ final class EmailMapper extends DataMapperFactory 'external' => 'messages_mail_media_dst', 'self' => 'messages_mail_media_src', ], + 'l11n' => [ + 'mapper' => EmailL11nMapper::class, + 'table' => 'messages_mail_l11n', + 'self' => 'messages_mail_l11n_message', + 'external' => null, + ], ]; /** diff --git a/Models/NullEmailL11n.php b/Models/NullEmailL11n.php new file mode 100644 index 0000000..3ad67fe --- /dev/null +++ b/Models/NullEmailL11n.php @@ -0,0 +1,46 @@ +id = $id; + } + + /** + * {@inheritdoc} + */ + public function jsonSerialize() : mixed + { + return ['id' => $this->id]; + } +} diff --git a/Theme/Backend/mail-dashboard.tpl.php b/Theme/Backend/mail-dashboard.tpl.php index 1c0b86c..2ccc75c 100755 --- a/Theme/Backend/mail-dashboard.tpl.php +++ b/Theme/Backend/mail-dashboard.tpl.php @@ -24,8 +24,8 @@ $quota = $mail->getQuota(); $messages = $this->getData('messages') ?? []; -$previous = empty($messages) ? 'messages/dashboard' : 'messages/dashboard?{?}&id=' . \reset($messages)->getId() . '&ptype=p'; -$next = empty($messages) ? 'messages/dashboard' : 'messages/dashboard?{?}&id=' . \end($messages)->getId() . '&ptype=n'; +$previous = empty($messages) ? 'messages/dashboard' : 'messages/dashboard?{?}&id=' . \reset($messages)->id . '&ptype=p'; +$next = empty($messages) ? 'messages/dashboard' : 'messages/dashboard?{?}&id=' . \end($messages)->id . '&ptype=n'; echo $this->getData('nav')->render(); ?>