Sync global-autoresponder current state
This commit is contained in:
@@ -28,6 +28,40 @@ final class DirectAdminVacationSyncService
|
||||
}
|
||||
}
|
||||
|
||||
/** @return array<int,array{domain:string,mailbox:string,email:string}> */
|
||||
public function untrackedNativeVacations(string $username): array
|
||||
{
|
||||
$tracked = $this->trackedEmails($username);
|
||||
$out = [];
|
||||
foreach ($this->mailboxes->domainsForUser($username) as $domain) {
|
||||
foreach ($this->api->listVacations($username, $domain) as $local) {
|
||||
$email = strtolower($local . '@' . $domain);
|
||||
if (isset($tracked[$email])) {
|
||||
continue;
|
||||
}
|
||||
$out[] = [
|
||||
'domain' => $domain,
|
||||
'mailbox' => $local,
|
||||
'email' => $email,
|
||||
];
|
||||
}
|
||||
}
|
||||
usort($out, static fn (array $a, array $b): int => strcmp($a['email'], $b['email']));
|
||||
return $out;
|
||||
}
|
||||
|
||||
/** @param array<int,array<string,mixed>> $entries */
|
||||
public function deleteNativeVacations(string $username, array $entries): void
|
||||
{
|
||||
foreach ($entries as $entry) {
|
||||
$email = strtolower((string)($entry['email'] ?? ''));
|
||||
if ($email === '' || !filter_var($email, FILTER_VALIDATE_EMAIL)) {
|
||||
continue;
|
||||
}
|
||||
$this->api->deleteVacation($username, $email);
|
||||
}
|
||||
}
|
||||
|
||||
/** @return array<string,array<string,mixed>> */
|
||||
private function rulesById(string $username): array
|
||||
{
|
||||
@@ -47,12 +81,20 @@ final class DirectAdminVacationSyncService
|
||||
$existing = $this->indexedEntries($this->sync->entriesForRule($username, $ruleId));
|
||||
$targets = $this->targetMailboxes($username, $rule);
|
||||
$next = [];
|
||||
$conflicts = [];
|
||||
foreach ($targets as $mailbox) {
|
||||
$email = strtolower((string)$mailbox['email']);
|
||||
$isTracked = isset($existing[$email]);
|
||||
if (!$isTracked && $this->api->vacationExists($username, $email)) {
|
||||
throw new RuntimeException('Untracked DirectAdmin vacation already exists for ' . $email);
|
||||
$conflicts[] = $email;
|
||||
}
|
||||
}
|
||||
if ($conflicts !== []) {
|
||||
throw new RuntimeException('Untracked DirectAdmin vacation already exists for ' . implode(', ', $conflicts));
|
||||
}
|
||||
foreach ($targets as $mailbox) {
|
||||
$email = strtolower((string)$mailbox['email']);
|
||||
$isTracked = isset($existing[$email]);
|
||||
$this->api->saveVacation($username, $email, $rule, $isTracked);
|
||||
$next[] = [
|
||||
'rule_id' => $ruleId,
|
||||
@@ -95,6 +137,21 @@ final class DirectAdminVacationSyncService
|
||||
return $out;
|
||||
}
|
||||
|
||||
/** @return array<string,bool> */
|
||||
private function trackedEmails(string $username): array
|
||||
{
|
||||
$tracked = [];
|
||||
foreach ($this->sync->allRuleEntries($username) as $entries) {
|
||||
foreach ($entries as $entry) {
|
||||
$email = strtolower((string)($entry['email'] ?? $entry['api_key'] ?? ''));
|
||||
if ($email !== '') {
|
||||
$tracked[$email] = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return $tracked;
|
||||
}
|
||||
|
||||
/** @param array<string,mixed> $rule @return array<int,array{domain:string,mailbox:string,email:string}> */
|
||||
private function targetMailboxes(string $username, array $rule): array
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user