WIP: Next major version - AthenaHR v2 #1
@@ -6,6 +6,7 @@ use App\Invitation;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||
use Illuminate\Foundation\Queue\Queueable;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use Illuminate\Support\Facades\Mail;
|
||||
use App\Mail\InviteExpiringSoon;
|
||||
|
||||
@@ -26,27 +27,37 @@ class ExpiredInviteCleanup implements ShouldQueue
|
||||
*/
|
||||
public function handle(): void
|
||||
{
|
||||
// 1. Notify invites expiring within the next 24 hours that haven't been notified yet
|
||||
Invitation::where('status', 'pending')
|
||||
Log::info('Cleaning up expired invites.');
|
||||
|
||||
$notified = 0;
|
||||
$deleted = 0;
|
||||
|
||||
Invitation::where('status', 'approved')
|
||||
->where('notified', false)
|
||||
->whereBetween('expiration', [Carbon::now(), Carbon::now()->addDay()])
|
||||
->chunkById(100, function ($invites) {
|
||||
->chunkById(100, function ($invites) use (&$notified) {
|
||||
foreach ($invites as $invite) {
|
||||
Mail::to($invite->requestor_email)
|
||||
->send(new InviteExpiringSoon($invite));
|
||||
->queue(new InviteExpiringSoon($invite));
|
||||
|
||||
$notified++;
|
||||
$invite->notified = true;
|
||||
$invite->save();
|
||||
|
||||
Log::debug("Notified approved invite {$invite->invitation_code}, sent to {$invite->requestor_email}.");
|
||||
}
|
||||
});
|
||||
|
||||
// 2. Delete invites that have actually expired
|
||||
Invitation::where('status', 'pending')
|
||||
->where('expiration', '<', Carbon::now())
|
||||
->chunkById(100, function ($invites) {
|
||||
Invitation::where('expiration', '<', Carbon::now())
|
||||
->where('status', '!=', 'denied')
|
||||
->chunkById(100, function ($invites) use (&$deleted, &$notified) {
|
||||
foreach ($invites as $invite) {
|
||||
Log::debug("Deleted invite {$invite->invitation_code} for {$invite->requestor_email}.");
|
||||
$invite->delete();
|
||||
$deleted++;
|
||||
}
|
||||
});
|
||||
|
||||
Log::info("Deleted {$deleted} invites and notified {$notified} approved invites close to expiration.");
|
||||
}
|
||||
}
|
||||
|
@@ -5,6 +5,7 @@ namespace App\Jobs;
|
||||
use App\Invitation;
|
||||
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||
use Illuminate\Foundation\Queue\Queueable;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
|
||||
// General Housekeeping Job: Drop Approved and Completed Invites
|
||||
class InviteLifecycleCleanup implements ShouldQueue
|
||||
@@ -24,11 +25,18 @@ class InviteLifecycleCleanup implements ShouldQueue
|
||||
*/
|
||||
public function handle(): void
|
||||
{
|
||||
Invitation::whereIn('status', ['approved', 'completed'])
|
||||
->chunkById(100, function ($invites) {
|
||||
Log::info("Invite lifecycle: processing completed invites.");
|
||||
$deleted = 0;
|
||||
|
||||
Invitation::where('status', '=', 'completed')
|
||||
->chunkById(100, function ($invites) use (&$deleted) {
|
||||
foreach ($invites as $invite) {
|
||||
Log::debug("Deleted invite {$invite->invitation_code} for {$invite->requestor_email}.");
|
||||
$invite->delete();
|
||||
$deleted++;
|
||||
}
|
||||
});
|
||||
|
||||
Log::info("Deleted {$deleted} completed invitations.");
|
||||
}
|
||||
}
|
||||
|
@@ -133,7 +133,7 @@
|
||||
<x-slot name="cardFooter">
|
||||
<p><i class="fas fa-info-circle"></i> {{ __('Here, you can manage the invitation system, and approve any invite requests that might have come through. You can also send invites from here if necessary.') }}</p>
|
||||
<p><i class="fas fa-info-circle"></i> {!! __('Remember: invitations are unique on an email/IP address basis. The same user won\'t be able to request an invite twice. This restriction also applies to you. Check if there\'s already an invite before sending one out.') !!}</p>
|
||||
<p><i class="fas fa-exclamation-triangle"></i> {!! __('<b>Invite lifecycle: </b> <i>Approved</i> and <i>Completed</i> invites are wiped from the system on a daily basis. <i>Expired</i> invites are wiped 1 day after expiration. <i>Denied</i> invites are <b>never</b> wiped.') !!}</p>
|
||||
<p><i class="fas fa-exclamation-triangle"></i> {!! __('<b>Invite lifecycle: </b><i>Completed</i> invites are wiped from the system every 12 hours. <i>Expired</i> invites are wiped 1 day after expiration. <i>Denied</i> invites are <b>never</b> wiped ') !!}</p>
|
||||
</x-slot>
|
||||
|
||||
</x-card>
|
||||
|
@@ -36,5 +36,10 @@ Schedule::command('votes:evaluate')->daily();
|
||||
Schedule::job(new ProcessDueSuspensions())->daily();
|
||||
Schedule::job(new ProcessExpiredAbsences())->daily();
|
||||
|
||||
Schedule::job(new InviteLifecycleCleanup())->daily();
|
||||
Schedule::job(new ExpiredInviteCleanup())->daily();
|
||||
// Schedule::job(new InviteLifecycleCleanup())->cron("0 */12 * * *");
|
||||
// Schedule::job(new ExpiredInviteCleanup())->daily();
|
||||
|
||||
// debug
|
||||
|
||||
Schedule::job(new InviteLifecycleCleanup())->everyFiveMinutes();
|
||||
Schedule::job(new ExpiredInviteCleanup())->everyMinute();
|
||||
|
Reference in New Issue
Block a user