Added "auto_mailer" to mail profile so user can select which profiles are appropriate for auto mails to cliens through activities

Co-authored-by: Copilot <copilot@github.com>
This commit is contained in:
Simon Pocrnjič
2026-05-11 22:12:57 +02:00
parent e3bc5da7e3
commit 32fe2fbc9b
8 changed files with 75 additions and 2 deletions
@@ -26,7 +26,7 @@ public function index(): Response
->orderBy('priority') ->orderBy('priority')
->orderBy('id') ->orderBy('id')
->get([ ->get([
'id', 'name', 'active', 'host', 'port', 'username', 'from_name', 'encryption', 'from_address', 'priority', 'signature', 'last_success_at', 'last_error_at', 'last_error_message', 'test_status', 'test_checked_at', 'id', 'name', 'active', 'auto_mailer', 'host', 'port', 'username', 'from_name', 'encryption', 'from_address', 'priority', 'signature', 'last_success_at', 'last_error_at', 'last_error_message', 'test_status', 'test_checked_at',
]); ]);
return Inertia::render('Admin/MailProfiles/Index', [ return Inertia::render('Admin/MailProfiles/Index', [
@@ -76,6 +76,15 @@ public function toggle(Request $request, MailProfile $mailProfile)
return back()->with('success', 'Status updated'); return back()->with('success', 'Status updated');
} }
public function toggleAutoMailer(Request $request, MailProfile $mailProfile)
{
$this->authorize('update', $mailProfile);
$mailProfile->auto_mailer = ! $mailProfile->auto_mailer;
$mailProfile->save();
return back()->with('success', 'Auto-mailer updated');
}
public function test(Request $request, MailProfile $mailProfile) public function test(Request $request, MailProfile $mailProfile)
{ {
$this->authorize('test', $mailProfile); $this->authorize('test', $mailProfile);
@@ -28,6 +28,7 @@ public function rules(): array
'max_daily_quota' => ['nullable', 'integer', 'min:0'], 'max_daily_quota' => ['nullable', 'integer', 'min:0'],
'signature' => ['nullable', 'array'], 'signature' => ['nullable', 'array'],
'signature.*' => ['nullable', 'string', 'max:1000'], 'signature.*' => ['nullable', 'string', 'max:1000'],
'auto_mailer' => ['nullable', 'boolean'],
]; ];
} }
} }
@@ -29,6 +29,7 @@ public function rules(): array
'active' => ['nullable', 'boolean'], 'active' => ['nullable', 'boolean'],
'signature' => ['nullable', 'array'], 'signature' => ['nullable', 'array'],
'signature.*' => ['nullable', 'string', 'max:1000'], 'signature.*' => ['nullable', 'string', 'max:1000'],
'auto_mailer' => ['nullable', 'boolean'],
]; ];
} }
} }
+2 -1
View File
@@ -10,13 +10,14 @@ class MailProfile extends Model
use HasFactory; use HasFactory;
protected $fillable = [ protected $fillable = [
'name', 'active', 'host', 'port', 'encryption', 'username', 'from_address', 'from_name', 'name', 'active', 'auto_mailer', 'host', 'port', 'encryption', 'username', 'from_address', 'from_name',
'reply_to_address', 'reply_to_name', 'priority', 'signature', 'max_daily_quota', 'emails_sent_today', 'reply_to_address', 'reply_to_name', 'priority', 'signature', 'max_daily_quota', 'emails_sent_today',
'last_success_at', 'last_error_at', 'last_error_message', 'failover_to_id', 'test_status', 'test_checked_at', 'last_success_at', 'last_error_at', 'last_error_message', 'failover_to_id', 'test_status', 'test_checked_at',
]; ];
protected $casts = [ protected $casts = [
'active' => 'boolean', 'active' => 'boolean',
'auto_mailer' => 'boolean',
'signature' => 'array', 'signature' => 'array',
'last_success_at' => 'datetime', 'last_success_at' => 'datetime',
'last_error_at' => 'datetime', 'last_error_at' => 'datetime',
+6
View File
@@ -100,6 +100,12 @@ public function maybeQueue(Activity $activity, bool $sendFlag = true, array $opt
$mailProfile = isset($options['mail_profile_id']) $mailProfile = isset($options['mail_profile_id'])
? MailProfile::query()->find($options['mail_profile_id']) ? MailProfile::query()->find($options['mail_profile_id'])
: null; : null;
$mailProfile ??= MailProfile::query()
->where('active', true)
->where('auto_mailer', true)
->orderBy('priority')
->orderBy('id')
->first();
$mailProfile ??= MailProfile::query() $mailProfile ??= MailProfile::query()
->where('active', true) ->where('active', true)
->orderBy('priority') ->orderBy('priority')
@@ -0,0 +1,22 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::table('mail_profiles', function (Blueprint $table): void {
$table->boolean('auto_mailer')->default(false)->after('active');
});
}
public function down(): void
{
Schema::table('mail_profiles', function (Blueprint $table): void {
$table->dropColumn('auto_mailer');
});
}
};
@@ -99,6 +99,7 @@ const form = useForm({
from_address: "", from_address: "",
from_name: "", from_name: "",
priority: 10, priority: 10,
auto_mailer: false,
}); });
function openCreate() { function openCreate() {
@@ -120,6 +121,7 @@ function openEdit(p) {
form.from_address = p.from_address || ""; form.from_address = p.from_address || "";
form.from_name = p.from_name || ""; form.from_name = p.from_name || "";
form.priority = p.priority ?? 10; form.priority = p.priority ?? 10;
form.auto_mailer = p.auto_mailer ?? false;
editTarget.value = p; editTarget.value = p;
signatureItems.value = signatureFromObject(p.signature); signatureItems.value = signatureFromObject(p.signature);
editOpen.value = true; editOpen.value = true;
@@ -159,6 +161,7 @@ function submitEdit() {
from_address: form.from_address, from_address: form.from_address,
from_name: form.from_name || null, from_name: form.from_name || null,
priority: form.priority, priority: form.priority,
auto_mailer: form.auto_mailer,
signature: signatureToObject(), signature: signatureToObject(),
}; };
if (form.password && form.password.trim() !== "") { if (form.password && form.password.trim() !== "") {
@@ -181,6 +184,12 @@ function toggleActive(p) {
.then(() => window.location.reload()); .then(() => window.location.reload());
} }
function toggleAutoMailer(p) {
window.axios
.post(route("admin.mail-profiles.toggle-auto-mailer", p.id))
.then(() => window.location.reload());
}
function testConnection(p) { function testConnection(p) {
window.axios window.axios
.post(route("admin.mail-profiles.test", p.id)) .post(route("admin.mail-profiles.test", p.id))
@@ -238,6 +247,7 @@ const statusClass = (p) => {
<TableHead class="text-center">Port</TableHead> <TableHead class="text-center">Port</TableHead>
<TableHead class="text-center">Enc</TableHead> <TableHead class="text-center">Enc</TableHead>
<TableHead class="text-center">Aktivno</TableHead> <TableHead class="text-center">Aktivno</TableHead>
<TableHead class="text-center">Auto-mailer</TableHead>
<TableHead class="text-center">Status</TableHead> <TableHead class="text-center">Status</TableHead>
<TableHead>Zadnji uspeh</TableHead> <TableHead>Zadnji uspeh</TableHead>
<TableHead>Napaka</TableHead> <TableHead>Napaka</TableHead>
@@ -261,6 +271,12 @@ const statusClass = (p) => {
@update:model-value="() => toggleActive(p)" @update:model-value="() => toggleActive(p)"
/> />
</TableCell> </TableCell>
<TableCell class="text-center">
<Switch
:default-value="p.auto_mailer"
@update:model-value="() => toggleAutoMailer(p)"
/>
</TableCell>
<TableCell class="text-center"> <TableCell class="text-center">
<Badge <Badge
v-if="p.test_status === 'success'" v-if="p.test_status === 'success'"
@@ -382,6 +398,14 @@ const statusClass = (p) => {
<Label for="create-priority">Prioriteta</Label> <Label for="create-priority">Prioriteta</Label>
<Input id="create-priority" v-model.number="form.priority" type="number" /> <Input id="create-priority" v-model.number="form.priority" type="number" />
</div> </div>
<div class="flex items-center gap-3">
<Switch
id="create-auto-mailer"
:model-value="form.auto_mailer"
@update:model-value="(val) => (form.auto_mailer = val)"
/>
<Label for="create-auto-mailer">Auto-mailer</Label>
</div>
</div> </div>
<div class="space-y-2"> <div class="space-y-2">
@@ -487,6 +511,14 @@ const statusClass = (p) => {
<Label for="edit-priority">Prioriteta</Label> <Label for="edit-priority">Prioriteta</Label>
<Input id="edit-priority" v-model.number="form.priority" type="number" /> <Input id="edit-priority" v-model.number="form.priority" type="number" />
</div> </div>
<div class="flex items-center gap-3">
<Switch
id="edit-auto-mailer"
:model-value="form.auto_mailer"
@update:model-value="(val) => (form.auto_mailer = val)"
/>
<Label for="edit-auto-mailer">Auto-mailer</Label>
</div>
</div> </div>
<div class="space-y-2"> <div class="space-y-2">
+1
View File
@@ -114,6 +114,7 @@
Route::post('mail-profiles', [\App\Http\Controllers\Admin\MailProfileController::class, 'store'])->name('mail-profiles.store'); Route::post('mail-profiles', [\App\Http\Controllers\Admin\MailProfileController::class, 'store'])->name('mail-profiles.store');
Route::put('mail-profiles/{mailProfile}', [\App\Http\Controllers\Admin\MailProfileController::class, 'update'])->name('mail-profiles.update'); Route::put('mail-profiles/{mailProfile}', [\App\Http\Controllers\Admin\MailProfileController::class, 'update'])->name('mail-profiles.update');
Route::post('mail-profiles/{mailProfile}/toggle', [\App\Http\Controllers\Admin\MailProfileController::class, 'toggle'])->name('mail-profiles.toggle'); Route::post('mail-profiles/{mailProfile}/toggle', [\App\Http\Controllers\Admin\MailProfileController::class, 'toggle'])->name('mail-profiles.toggle');
Route::post('mail-profiles/{mailProfile}/toggle-auto-mailer', [\App\Http\Controllers\Admin\MailProfileController::class, 'toggleAutoMailer'])->name('mail-profiles.toggle-auto-mailer');
Route::post('mail-profiles/{mailProfile}/test', [\App\Http\Controllers\Admin\MailProfileController::class, 'test'])->name('mail-profiles.test'); Route::post('mail-profiles/{mailProfile}/test', [\App\Http\Controllers\Admin\MailProfileController::class, 'test'])->name('mail-profiles.test');
Route::post('mail-profiles/{mailProfile}/send-test', [\App\Http\Controllers\Admin\MailProfileController::class, 'sendTest'])->name('mail-profiles.send-test'); Route::post('mail-profiles/{mailProfile}/send-test', [\App\Http\Controllers\Admin\MailProfileController::class, 'sendTest'])->name('mail-profiles.send-test');
Route::delete('mail-profiles/{mailProfile}', [\App\Http\Controllers\Admin\MailProfileController::class, 'destroy'])->name('mail-profiles.destroy'); Route::delete('mail-profiles/{mailProfile}', [\App\Http\Controllers\Admin\MailProfileController::class, 'destroy'])->name('mail-profiles.destroy');