clrghouz/app/Console/Commands/AddressMerge.php

131 lines
4.0 KiB
PHP

<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use Illuminate\Database\QueryException;
use Illuminate\Support\Facades\DB;
use App\Models\{Address,System};
class AddressMerge extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'address:merge'
.' {src : Source Address}'
.' {dst : Destination Address}'
.' {--F|force : Force}'
.' {--I|ignore : Ignore different BBSes}'
.' {--d|dryrun : Dry Run}';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Permanently remove a duplicate address';
/**
* Execute the console command.
*
* @return int
*/
public function handle()
{
$src = Address::withTrashed()->findOrfail($this->argument('src'));
$dst = Address::withTrashed()->findOrfail($this->argument('dst'));
if ((! $this->option('ignore')) && ($src->system_id !== $dst->system_id) && ($src->system->name !== System::default)) {
$this->error(sprintf('FTN addresses are from different systems (%s/%s)',$src->system->name,$dst->system->name));
exit(1);
}
if ((! $this->option('force')) && ($src->ftn !== $dst->ftn)) {
$this->error(sprintf('FTN addresses are not the same (%s:%s)',$src->ftn,$dst->ftn));
exit(1);
}
if ($src->active) {
$this->error(sprintf('Source [%s] is still active',$src->ftn));
exit(1);
}
DB::beginTransaction();
// Find all echomail seenbys
$x = DB::update('update echomail_seenby set address_id=? where address_id=?',[$dst->id,$src->id]);
$this->info(sprintf('Updated [%d] echomail seenby records',$x));
// Find all echomail paths
$x = DB::update('update echomail_path set address_id=? where address_id=?',[$dst->id,$src->id]);
$this->info(sprintf('Updated [%d] echomail path records',$x));
// Find all echomails
$x = DB::update('update echomails set fftn_id=? where fftn_id=?',[$dst->id,$src->id]);
$this->info(sprintf('Updated [%d] echomail source records',$x));
// Find all netmails
$x = DB::update('update netmails set fftn_id=? where fftn_id=?',[$dst->id,$src->id]);
$this->info(sprintf('Updated [%d] netmail source records',$x));
// Find all netmails
$x = DB::update('update netmails set tftn_id=? where tftn_id=?',[$dst->id,$src->id]);
$this->info(sprintf('Updated [%d] netmail destination records',$x));
// Find all nodelist
$x = DB::update('update address_nodelist set address_id=? where address_id=?',[$dst->id,$src->id]);
$this->info(sprintf('Updated [%d] nodelist records',$x));
// Find all file seenbys
$x = DB::update('update file_seenby set address_id=? where address_id=?',[$dst->id,$src->id]);
$this->info(sprintf('Updated [%d] file seenby records',$x));
// Find all files
$x = DB::update('update files set fftn_id=? where fftn_id=?',[$dst->id,$src->id]);
$this->info(sprintf('Updated [%d] file source records',$x));
// Resubscribe echoareas
try {
$x = DB::update('update address_echoarea set address_id=? where address_id=?',[$dst->id,$src->id]);
} catch (QueryException $e) {
DB::rollback();
$this->error(sprintf('You may need to remove %s:%s (%d) from echoareas',$src->ftn,$src->system->name,$src->id));
exit(1);
}
$this->info(sprintf('Updated [%d] echomail subscription records',$x));
// Resubscribe fileareas
try {
$x = DB::update('update address_filearea set address_id=? where address_id=?',[$dst->id,$src->id]);
} catch (QueryException $e) {
DB::rollback();
$this->error(sprintf('You may need to remove %s:%s (%d) from fileareas',$src->ftn,$src->system->name,$src->id));
exit(1);
}
$this->info(sprintf('Updated [%d] filearea subscription records',$x));
if ($this->option('dryrun')) {
$this->warn(sprintf('NOT deleting [%s] - DRY RUN',$src->ftn));
DB::rollBack();
} else {
if ($src->forceDelete()) {
$this->alert(sprintf('%s deleted.', $src->ftn));
DB::commit();
} else {
$this->warn(sprintf('Address [%s] didnt delete?',$src->ftn));
DB::rollBack();
}
}
return Command::SUCCESS;
}
}