169 lines
4.8 KiB
PHP
169 lines
4.8 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\Middleware\Skip;
|
|
use Illuminate\Queue\SerializesModels;
|
|
use Illuminate\Support\Facades\Log;
|
|
use Illuminate\Support\Facades\Notification;
|
|
|
|
use App\Models\{Address,Echoarea,Echomail};
|
|
use App\Notifications\Netmails\Areafix\Scan;
|
|
|
|
class AreafixRescan implements ShouldQueue
|
|
{
|
|
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
|
|
|
|
private const LOGKEY = 'JAR';
|
|
|
|
private Address $ao; // System address
|
|
private Echoarea $eao; // Domain we are processing
|
|
private int $days;
|
|
private bool $rescan;
|
|
|
|
/**
|
|
* Create a new job instance.
|
|
*/
|
|
public function __construct(Address $ao,Echoarea $eao,int $days=30,bool $rescan=FALSE)
|
|
{
|
|
$this->ao = $ao->withoutRelations();
|
|
$this->eao = $eao->withoutRelations();
|
|
$this->days = $days;
|
|
$this->rescan = $rescan;
|
|
}
|
|
|
|
public function __get(string $key): mixed
|
|
{
|
|
switch ($key) {
|
|
case 'jobname':
|
|
return sprintf('%s %s (%d)',$this->ao->ftn,$this->eao->name,$this->days);
|
|
|
|
default:
|
|
$this->fail('Unkown key:'.$key);
|
|
return NULL;
|
|
}
|
|
}
|
|
|
|
public function middleware(): array
|
|
{
|
|
return [
|
|
Skip::when(function(): bool {
|
|
if ($this->eao->domain_id !== $this->ao->zone->domain_id) {
|
|
Log::error(sprintf('%s:! Echo area [%s] is not in domain [%s] for FTN [%s]',self::LOGKEY,$this->eao->name,$this->ao->zone->domain->name,$this->ao->ftn));
|
|
|
|
return TRUE;
|
|
|
|
// Check that the user is subscribed
|
|
} elseif (! $this->ao->echoareas->contains($this->eao->id)) {
|
|
Log::error(sprintf('%s:! FTN [%s] is not subscribed to [%s]',self::LOGKEY,$this->ao->ftn,$this->eao->name));
|
|
|
|
return TRUE;
|
|
|
|
// Check that an FTN can read the area
|
|
} elseif (! $this->eao->can_read($this->ao->security)) {
|
|
Log::error(sprintf('%s:! FTN [%s] doesnt have permission to receive [%s]',self::LOGKEY,$this->ao->ftn,$this->eao->name));
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
})
|
|
];
|
|
}
|
|
|
|
public function handle(): void
|
|
{
|
|
$c = 0;
|
|
$s = 0;
|
|
|
|
$earliest = NULL;
|
|
$latest = NULL;
|
|
|
|
foreach (Echomail::select(['id','datetime'])
|
|
->where('echoarea_id',$this->eao->id)
|
|
->where('datetime','>=',
|
|
Carbon::now()
|
|
->subDays($this->days)
|
|
->startOfDay()
|
|
)
|
|
->orderBy('datetime')
|
|
->cursor() as $eo)
|
|
{
|
|
// Echomail hasnt been exported before
|
|
if (! $eo->seenby->count()) {
|
|
$eo->seenby()->attach($this->ao->id,['export_at'=>Carbon::now()]);
|
|
$c++;
|
|
|
|
if (($eo->datetime < $earliest) || (! $earliest))
|
|
$earliest = $eo->datetime;
|
|
|
|
if (($latest < $eo->datetime) || (! $latest))
|
|
$latest = $eo->datetime;
|
|
|
|
Log::debug(sprintf('Exported [%d] MSG (%s) dated (%s) to [%s]',$eo->id,$eo->msgid ?: '*NO MSGID*',$eo->datetime->format('Y-m-d H:i:s'),$this->ao->ftn3d));
|
|
|
|
} else {
|
|
$export = $eo->seenby->where('id',$this->ao->id)->pop();
|
|
|
|
if ($export) {
|
|
// Echomail is pending export
|
|
if ($export->pivot->export_at && is_null($export->pivot->sent_at) && is_null($export->pivot->sent_pkt)) {
|
|
$s++;
|
|
Log::debug(sprintf('Not exporting [%d] MSG (%s) dated (%s) already queued for [%s]',$eo->id,$eo->msgid ?: '*NO MSGID*',$eo->datetime->format('Y-m-d H:i:s'),$this->ao->ftn3d));
|
|
|
|
// Echomail has been exported
|
|
} elseif ($this->rescan) {
|
|
$eo->seenby()->updateExistingPivot($this->ao,['export_at'=>Carbon::now(),'sent_at'=>NULL]);
|
|
$c++;
|
|
|
|
if (($eo->datetime < $earliest) || (! $earliest))
|
|
$earliest = $eo->datetime;
|
|
|
|
if (($latest < $eo->datetime) || (! $latest))
|
|
$latest = $eo->datetime;
|
|
|
|
Log::debug(sprintf('Re-exported [%d] MSG (%s) dated (%s) to [%s]',$eo->id,$eo->msgid ?: '*NO MSGID*',$eo->datetime,$this->ao->ftn3d));
|
|
|
|
} else {
|
|
$s++;
|
|
Log::debug(sprintf('Not resending previously sent message [%d], MSGID (%s) - sent in Pkt [%s] on [%s]',
|
|
$eo->id,
|
|
$eo->msgid ?: '* NO MSGID*',
|
|
$export->pivot->sent_pkt ?: '-',
|
|
$export->pivot->sent_at ?: '-',
|
|
));
|
|
}
|
|
|
|
// Echomail has not been exported
|
|
} else {
|
|
$eo->seenby()->attach($this->ao,['export_at'=>Carbon::now(),'sent_at'=>NULL,'sent_pkt'=>NULL]);
|
|
$c++;
|
|
|
|
if (($eo->datetime < $earliest) || (! $earliest))
|
|
$earliest = $eo->datetime;
|
|
|
|
if (($latest < $eo->datetime) || (! $latest))
|
|
$latest = $eo->datetime;
|
|
|
|
Log::debug(sprintf('Exported [%d] to [%s]',$eo->id,$this->ao->ftn3d));
|
|
}
|
|
}
|
|
}
|
|
|
|
Notification::route('netmail',$this->ao)
|
|
->notify(new Scan(collect([
|
|
'area'=>$this->eao->name,
|
|
'queued'=>$c,
|
|
'skipped'=>$s,
|
|
'earliest'=>$earliest,
|
|
'latest'=>$latest,
|
|
])));
|
|
|
|
Log::info(sprintf('%s:= Queued [%d], Skipped [%d] echomails for [%s] in [%s]',self::LOGKEY,$c,$s,$this->ao->ftn,$this->eao->name));
|
|
}
|
|
} |