feat: use vacation subject prefix
This commit is contained in:
@@ -24,13 +24,18 @@ class DirectAdminVacationApi
|
||||
[$endDate, $endTime] = $this->splitPeriod((string)($rule['end_value'] ?? ''));
|
||||
[$startYear, $startMonth, $startDay] = explode('-', $startDate);
|
||||
[$endYear, $endMonth, $endDay] = explode('-', $endDate);
|
||||
$subjectPrefix = (string)($rule['subject_prefix'] ?? $rule['subject'] ?? '');
|
||||
$replyFrequency = !empty($rule['reply_every_message']) ? '0' : (string)max(0, (int)($rule['repeat_minutes'] ?? 1440));
|
||||
return [
|
||||
'action' => $exists ? 'modify' : 'create',
|
||||
'domain' => $domain,
|
||||
'user' => $local,
|
||||
'email' => $email,
|
||||
'text' => (string)($rule['body'] ?? ''),
|
||||
'subject' => (string)($rule['subject'] ?? ''),
|
||||
'subject_prefix' => $subjectPrefix,
|
||||
'subject' => $subjectPrefix,
|
||||
'reply_frequency' => $replyFrequency,
|
||||
'reply_once_time' => $replyFrequency,
|
||||
'starttime' => $startTime,
|
||||
'startyear' => $startYear,
|
||||
'startmonth' => $startMonth,
|
||||
|
||||
@@ -3,18 +3,27 @@ declare(strict_types=1);
|
||||
|
||||
final class RuleValidator
|
||||
{
|
||||
/** @var array<string,int> */
|
||||
private const REPLY_FREQUENCIES = [
|
||||
'30' => 30,
|
||||
'60' => 60,
|
||||
'120' => 120,
|
||||
'360' => 360,
|
||||
'720' => 720,
|
||||
'1440' => 1440,
|
||||
'2880' => 2880,
|
||||
'10080' => 10080,
|
||||
];
|
||||
|
||||
/** @param array<string,mixed> $input @return array<string,mixed> */
|
||||
public static function validate(array $input, Settings $settings): array
|
||||
{
|
||||
$subject = trim((string)($input['subject'] ?? ''));
|
||||
if ($subject === '') {
|
||||
throw new InvalidArgumentException('Temat jest wymagany.');
|
||||
$subjectPrefix = trim((string)($input['subject_prefix'] ?? $input['subject'] ?? ''));
|
||||
if (str_contains($subjectPrefix, "\r") || str_contains($subjectPrefix, "\n")) {
|
||||
throw new InvalidArgumentException('Przedrostek tematu nie może zawierać nowych linii.');
|
||||
}
|
||||
if (str_contains($subject, "\r") || str_contains($subject, "\n")) {
|
||||
throw new InvalidArgumentException('Temat nie może zawierać nowych linii.');
|
||||
}
|
||||
if (strlen($subject) > $settings->maxSubjectBytes()) {
|
||||
throw new InvalidArgumentException('Temat jest za długi.');
|
||||
if (strlen($subjectPrefix) > $settings->maxSubjectBytes()) {
|
||||
throw new InvalidArgumentException('Przedrostek tematu jest za długi.');
|
||||
}
|
||||
|
||||
$body = str_replace(["\r\n", "\r", "\0"], ["\n", "\n", ''], (string)($input['body'] ?? ''));
|
||||
@@ -33,9 +42,10 @@ final class RuleValidator
|
||||
if ($endTs <= $startTs) {
|
||||
throw new InvalidArgumentException('Data zakończenia musi być późniejsza niż data rozpoczęcia.');
|
||||
}
|
||||
[$replyEveryMessage, $repeatMinutes] = self::parseReplyFrequency((string)($input['reply_frequency'] ?? '1440'));
|
||||
|
||||
return [
|
||||
'subject' => $subject,
|
||||
'subject_prefix' => $subjectPrefix,
|
||||
'body' => $body,
|
||||
'schedule_mode' => $mode,
|
||||
'timezone' => $settings->timezone(),
|
||||
@@ -44,10 +54,25 @@ final class RuleValidator
|
||||
'start_ts' => $startTs,
|
||||
'end_ts' => $endTs,
|
||||
'enabled' => self::truthy($input['enabled'] ?? false),
|
||||
'reply_every_message' => $replyEveryMessage,
|
||||
'repeat_minutes' => $repeatMinutes,
|
||||
'dynamic_scope' => $settings->dynamicMailboxScope(),
|
||||
];
|
||||
}
|
||||
|
||||
/** @return array{0:bool,1:int} */
|
||||
private static function parseReplyFrequency(string $value): array
|
||||
{
|
||||
$value = trim(strtolower($value));
|
||||
if ($value === 'every') {
|
||||
return [true, 0];
|
||||
}
|
||||
if (isset(self::REPLY_FREQUENCIES[$value])) {
|
||||
return [false, self::REPLY_FREQUENCIES[$value]];
|
||||
}
|
||||
throw new InvalidArgumentException('Częstość odpowiedzi jest nieprawidłowa.');
|
||||
}
|
||||
|
||||
/** @return array{0:int,1:string} */
|
||||
private static function parseScheduleValue(string $value, string $mode, DateTimeZone $tz, bool $start): array
|
||||
{
|
||||
|
||||
@@ -52,8 +52,6 @@ final class Settings
|
||||
'DEFAULT_ENABLE' => 'true',
|
||||
'GLOBAL_AUTORESPONDER_TIMEZONE' => 'Europe/Warsaw',
|
||||
'GLOBAL_AUTORESPONDER_BACKEND' => 'da',
|
||||
'GLOBAL_AUTORESPONDER_REPLY_EVERY_MESSAGE' => 'false',
|
||||
'GLOBAL_AUTORESPONDER_REPEAT_MINUTES' => '1440',
|
||||
'GLOBAL_AUTORESPONDER_DYNAMIC_MAILBOX_SCOPE' => 'true',
|
||||
'GLOBAL_AUTORESPONDER_MAX_SUBJECT_BYTES' => '255',
|
||||
'GLOBAL_AUTORESPONDER_MAX_BODY_BYTES' => '20000',
|
||||
@@ -103,16 +101,6 @@ final class Settings
|
||||
return $this->backendMode() === 'da' ? 'directadmin_period' : 'exact_hour';
|
||||
}
|
||||
|
||||
public function replyEveryMessage(): bool
|
||||
{
|
||||
return $this->getBool('GLOBAL_AUTORESPONDER_REPLY_EVERY_MESSAGE', false);
|
||||
}
|
||||
|
||||
public function repeatMinutes(): int
|
||||
{
|
||||
return $this->getInt('GLOBAL_AUTORESPONDER_REPEAT_MINUTES', 1440);
|
||||
}
|
||||
|
||||
public function dynamicMailboxScope(): bool
|
||||
{
|
||||
return $this->getBool('GLOBAL_AUTORESPONDER_DYNAMIC_MAILBOX_SCOPE', true);
|
||||
@@ -156,9 +144,6 @@ final class Settings
|
||||
if (!in_array($this->backendMode(), ['da', 'exim'], true)) {
|
||||
throw new InvalidArgumentException('Invalid backend mode: ' . $this->backendMode());
|
||||
}
|
||||
if ($this->repeatMinutes() < 0) {
|
||||
throw new InvalidArgumentException('Invalid repeat minutes');
|
||||
}
|
||||
if ($this->maxSubjectBytes() < 1 || $this->maxBodyBytes() < 1) {
|
||||
throw new InvalidArgumentException('Invalid size limits');
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user