<?php namespace App\Console\Commands; use Illuminate\Console\Command; use Illuminate\Database\QueryException; use Illuminate\Support\Facades\DB; use App\Models\Address; 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 !== 'Discovered System')) { $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; } }