diff --git a/app/Console/Commands/Areafix/Rescan.php b/app/Console/Commands/Areafix/Rescan.php new file mode 100644 index 0000000..43187c7 --- /dev/null +++ b/app/Console/Commands/Areafix/Rescan.php @@ -0,0 +1,92 @@ +argument('days')) && (! is_numeric($this->argument('days')))) + throw new \Exception('Days must be numeric: '.$this->argument('days')); + + $ao = Address::findFtn($this->argument('ftn')); + + if (! $ao) + throw new \Exception('FTN not found: '.$this->argument('ftn')); + + // Check that the area belongs to the domain for the FTN + if (! $this->argument('area')) + throw new \Exception('Areaname is required'); + + $eao = Echoarea::where('name',$this->argument('area'))->singleOrFail(); + if ($eao->domain_id !== $ao->zone->domain_id) + throw new \Exception(sprintf('Echo area [%s] is not in domain [%s] for FTN [%s]',$eao->name,$ao->zone->domain->name,$ao->ftn)); + + // Check that the user is subscribed + if (! $ao->echoareas->contains($eao->id)) + throw new \Exception(sprintf('FTN [%s] is not subscribed to [%s]',$ao->ftn,$eao->name)); + + // Check that an FTN can read the area + if (! $eao->sec_read || ($ao->security < $eao->sec_read)) + throw new \Exception(sprintf('FTN [%s] doesnt have permission to received [%s]',$ao->ftn,$eao->name)); + + foreach (Echomail::select('id') + ->where('echoarea_id',$eao->id) + ->when($this->argument('days'),function($query) { + return $query->where('created_at','>=',Carbon::now()->subDays($this->argument('days'))->startOfDay()); + }) + ->cursor() as $eo) { + + // Echomail hasnt been exported before + if (! $eo->seenby->count()) { + $eo->seenby()->attach($ao->id,['export_at'=>Carbon::now()]); + $this->info(sprintf('Exported [%d] to [%s]',$eo->id,$ao->ftn3d)); + + } else { + $export = $eo->seenby->where('id',$ao->id)->pop(); + + // Echomail is pending export + if ($export && $export->pivot->export_at && is_null($export->pivot->sent_at) && is_null($export->pivot->sent_pkt)) { + $this->warn(sprintf('Not exporting [%d] already queued for [%s]',$eo->id,$ao->ftn3d)); + + // Echomail has been exported + } elseif ($export) { + $eo->seenby()->updateExistingPivot($ao,['export_at'=>Carbon::now(),'sent_at'=>NULL,'sent_pkt'=>NULL]); + $this->info(sprintf('Re-exported [%d] to [%s]',$eo->id,$ao->ftn3d)); + + // Echomail has not been exported + } else { + $eo->seenby()->attach($ao,['export_at'=>Carbon::now(),'sent_at'=>NULL,'sent_pkt'=>NULL]); + $this->info(sprintf('Exported [%d] to [%s]',$eo->id,$ao->ftn3d)); + } + } + } + + return self::SUCCESS; + } +} \ No newline at end of file diff --git a/app/Models/Echomail.php b/app/Models/Echomail.php index 4fdb811..4ae8b75 100644 --- a/app/Models/Echomail.php +++ b/app/Models/Echomail.php @@ -104,6 +104,7 @@ final class Echomail extends Model implements Packet $rogue = collect(); + // @todo move the parseAddress processing into Message::class, and our address to the seenby (and thus no need to add it when we export) // Parse SEEN-BY if ($model->set_seenby->count()) $seenby = self::parseAddresses('seenby',$model->set_seenby,$model->fftn->zone,$rogue); @@ -183,6 +184,7 @@ final class Echomail extends Model implements Packet public function seenby() { return $this->belongsToMany(Address::class,'echomail_seenby') + ->withPivot(['export_at','sent_at','sent_pkt']) ->FTN2DOrder(); }