Files
approagency/app/Console/Commands/SendDueReminders.php
T
2025-12-13 15:56:47 +03:30

92 lines
2.7 KiB
PHP

<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use App\Models\Reminder;
use App\Jobs\SendPushJob;
use App\Jobs\SendPushToPackageJob;
use Carbon\Carbon;
class SendDueReminders extends Command
{
/**
* The name and signature of the console command.
*/
protected $signature = 'reminders:send-due';
/**
* The console command description.
*/
protected $description = 'Send push notifications for due reminders';
/**
* Execute the console command.
*/
public function handle(): int
{
$now = now();
$reminders = Reminder::with(['user', 'packageName'])
->where('time', '<=', $now->toTimeString())
->where(function ($query) use ($now) {
// Non-repeatable reminders: send once
$query->where('repeatable', false)
->whereNull('last_repeat')
// OR repeatable reminders that haven't been sent today
->orWhere('repeatable', true)
->where(function ($sub) use ($now) {
$sub->whereNull('last_repeat')
->orWhereDate('last_repeat', '<', $now->toDateString());
});
})
->get();
if ($reminders->isEmpty()) {
$this->info('No reminders due at this time.');
return Command::SUCCESS;
}
foreach ($reminders as $reminder) {
$packageName = $reminder->packageName;
// Check if reminder has a specific user
if ($reminder->user_id) {
$user = $reminder->user;
$relation = $user->packageNames()->where('package_names.id', $packageName->id)->first();
$fcmToken = $relation?->pivot?->fcm_token;
if ($fcmToken) {
SendPushJob::dispatch(
user: $user,
title: $reminder->title,
packageName: $packageName,
description: $reminder->description ?? '',
data: $reminder->data ?? []
);
}
}
// Otherwise, send to all users that have this package
else {
// Just dispatch the job once for all users with this package
SendPushToPackageJob::dispatch(
$packageName,
$reminder->title,
$reminder->description ?? '',
$reminder->data ?? []
);
}
$scheduledTime = Carbon::parse($reminder->time);
$scheduledTime->setDate($now->year, $now->month, $now->day);
$reminder->last_repeat = $scheduledTime;
$reminder->save();
$this->info("Queued push notification for reminder {$reminder->id}.");
}
return Command::SUCCESS;
}
}