diff --git a/src/ApiResource/ZimbraSettings.php b/src/ApiResource/ZimbraSettings.php new file mode 100644 index 0000000..5790a06 --- /dev/null +++ b/src/ApiResource/ZimbraSettings.php @@ -0,0 +1,51 @@ + ['zimbra_settings:read']], + provider: ZimbraSettingsProvider::class, + security: "is_granted('ROLE_ADMIN')", + ), + new Put( + uriTemplate: '/settings/zimbra', + denormalizationContext: ['groups' => ['zimbra_settings:write']], + normalizationContext: ['groups' => ['zimbra_settings:read']], + provider: ZimbraSettingsProvider::class, + processor: ZimbraSettingsProcessor::class, + security: "is_granted('ROLE_ADMIN')", + ), + ], +)] +final class ZimbraSettings +{ + #[Groups(['zimbra_settings:read', 'zimbra_settings:write'])] + public ?string $serverUrl = null; + + #[Groups(['zimbra_settings:read', 'zimbra_settings:write'])] + public ?string $username = null; + + #[Groups(['zimbra_settings:read', 'zimbra_settings:write'])] + public ?string $calendarPath = null; + + #[Groups(['zimbra_settings:write'])] + public ?string $password = null; + + #[Groups(['zimbra_settings:read', 'zimbra_settings:write'])] + public bool $enabled = false; + + #[Groups(['zimbra_settings:read'])] + public bool $hasPassword = false; +} diff --git a/src/ApiResource/ZimbraTestConnection.php b/src/ApiResource/ZimbraTestConnection.php new file mode 100644 index 0000000..42e9012 --- /dev/null +++ b/src/ApiResource/ZimbraTestConnection.php @@ -0,0 +1,28 @@ + ['zimbra_test:read']], + provider: ZimbraTestConnectionProvider::class, + processor: ZimbraTestConnectionProvider::class, + security: "is_granted('ROLE_ADMIN')", + ), + ], +)] +final class ZimbraTestConnection +{ + #[Groups(['zimbra_test:read'])] + public bool $success = false; +} diff --git a/src/State/ZimbraSettingsProcessor.php b/src/State/ZimbraSettingsProcessor.php new file mode 100644 index 0000000..7825a6b --- /dev/null +++ b/src/State/ZimbraSettingsProcessor.php @@ -0,0 +1,53 @@ +configRepository->findSingleton(); + if (null === $config) { + $config = new ZimbraConfiguration(); + } + + $config->setServerUrl($data->serverUrl); + $config->setUsername($data->username); + $config->setCalendarPath($data->calendarPath); + $config->setEnabled($data->enabled); + + if (null !== $data->password && '' !== $data->password) { + $config->setEncryptedPassword($this->tokenEncryptor->encrypt($data->password)); + } + + $this->em->persist($config); + $this->em->flush(); + + $result = new ZimbraSettings(); + $result->serverUrl = $config->getServerUrl(); + $result->username = $config->getUsername(); + $result->calendarPath = $config->getCalendarPath(); + $result->enabled = $config->isEnabled(); + $result->hasPassword = $config->hasPassword(); + + return $result; + } +} diff --git a/src/State/ZimbraSettingsProvider.php b/src/State/ZimbraSettingsProvider.php new file mode 100644 index 0000000..fe95719 --- /dev/null +++ b/src/State/ZimbraSettingsProvider.php @@ -0,0 +1,33 @@ +configRepository->findSingleton(); + $dto = new ZimbraSettings(); + + if (null !== $config) { + $dto->serverUrl = $config->getServerUrl(); + $dto->username = $config->getUsername(); + $dto->calendarPath = $config->getCalendarPath(); + $dto->enabled = $config->isEnabled(); + $dto->hasPassword = $config->hasPassword(); + } + + return $dto; + } +} diff --git a/src/State/ZimbraTestConnectionProvider.php b/src/State/ZimbraTestConnectionProvider.php new file mode 100644 index 0000000..828c64f --- /dev/null +++ b/src/State/ZimbraTestConnectionProvider.php @@ -0,0 +1,37 @@ +success = $this->calDavService->testConnection(); + } catch (Throwable) { + $result->success = false; + } + + return $result; + } +}