Files
timebank-cc-public/app/Jobs/DeleteExpiredWireChatMessagesJob.php
Ronald Huynen 2547717edb Initial commit
2026-03-23 21:37:59 +01:00

124 lines
5.4 KiB
PHP

<?php
namespace App\Jobs;
use Carbon\Carbon;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Log;
use Namu\WireChat\Enums\Actions;
use Namu\WireChat\Models\Message;
class DeleteExpiredWireChatMessagesJob implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
/**
* Create a new job instance.
*/
public function __construct()
{
$this->onQueue('low');
}
/**
* Execute the job.
*/
public function handle(): void
{
// Disappearing messages always enabled - this prevents orphaned messages
Log::info('WireChat disappearing messages: Starting cleanup');
$deletedCount = 0;
$deletedKeptCount = 0;
// Get all conversations with disappearing settings
$conversations = \Namu\WireChat\Models\Conversation::whereNotNull('disappearing_started_at')
->whereNotNull('disappearing_duration')
->get();
Log::info("WireChat disappearing messages: Found {$conversations->count()} conversations with disappearing enabled");
foreach ($conversations as $conversation) {
// Get regular messages (not kept) that should be deleted
$messages = $conversation->messages()
->withoutGlobalScopes()
->where(function ($query) {
// Messages that are not kept
$query->whereNull('kept_at')
// Or messages that are kept but have delete actions or are trashed
->orWhere(function ($query) {
$query->whereNotNull('kept_at') // Kept messages
->where(function ($query) {
$query->whereNotNull('deleted_at') // Trashed
->orWhereHas('actions', function ($query) {
$query->where('type', Actions::DELETE);
});
});
});
})
// Only messages created AFTER disappearing was enabled
->where('created_at', '>', $conversation->disappearing_started_at)
->get();
foreach ($messages as $message) {
$createdAt = $message->created_at;
if ($createdAt && $createdAt->isFuture()) {
continue; // Skip future messages
}
// Check if message is older than the conversation's duration
if ($createdAt && $createdAt->diffInSeconds(now()) > $conversation->disappearing_duration) {
try {
Log::info("WireChat disappearing messages: Deleting message {$message->id} (age: {$createdAt->diffInSeconds(now())}s, limit: {$conversation->disappearing_duration}s)");
$message->forceDelete();
$deletedCount++;
} catch (\Exception $e) {
Log::error("WireChat disappearing messages: Failed to delete message {$message->id}: {$e->getMessage()}");
}
}
}
// Get kept messages that should be deleted based on kept_messages_duration
$keptMessagesDurationDays = timebank_config('wirechat.disappearing_messages.kept_messages_duration');
if ($keptMessagesDurationDays !== null && timebank_config('wirechat.disappearing_messages.allow_users_to_keep', true)) {
$keptMessagesDuration = $keptMessagesDurationDays * 86400; // Convert days to seconds
$keptMessages = $conversation->messages()
->withoutGlobalScopes()
->whereNotNull('kept_at')
->whereNull('deleted_at')
->whereDoesntHave('actions', function ($query) {
$query->where('type', Actions::DELETE);
})
->where('kept_at', '>', $conversation->disappearing_started_at)
->get();
foreach ($keptMessages as $keptMessage) {
$keptAt = $keptMessage->kept_at;
if ($keptAt && $keptAt->isFuture()) {
continue; // Skip future kept messages
}
// Check if kept message is older than the kept messages duration
if ($keptAt && $keptAt->diffInSeconds(now()) > $keptMessagesDuration) {
try {
Log::info("WireChat disappearing messages: Deleting kept message {$keptMessage->id} (kept for: {$keptAt->diffInSeconds(now())}s, limit: {$keptMessagesDuration}s)");
$keptMessage->forceDelete();
$deletedKeptCount++;
} catch (\Exception $e) {
Log::error("WireChat disappearing messages: Failed to delete kept message {$keptMessage->id}: {$e->getMessage()}");
}
}
}
}
}
Log::info("WireChat disappearing messages: Deleted {$deletedCount} expired messages and {$deletedKeptCount} expired kept messages");
}
}