<?php namespace App\Console\Commands; use App\Models\Asset; use App\Models\CustomField; use Schema; use DB; use Illuminate\Console\Command; class PaveIt extends Command { /** * The name and signature of the console command. * * @var string */ protected $signature = 'snipeit:pave {--force : Skip the interactive yes/no prompt for confirmation}'; /** * The console command description. * * @var string */ protected $description = 'Clear the database tables, leaving all migrations, table structure, and the first user in place. (It is primarily a quick tool for developers.) If you want to destroy all tables as well, use php artisan db:wipe.'; /** * Create a new command instance. * * @return void */ public function __construct() { parent::__construct(); } /** * Execute the console command. * * @return mixed */ public function handle() { if (!$this->option('force')) { $confirmation = $this->confirm("\n****************************************************\nTHIS WILL DELETE ALL OF THE DATA IN YOUR DATABASE. \nThere is NO undo. This WILL destroy ALL of your data, \nINCLUDING ANY non-Snipe-IT tables you have in this database. \n****************************************************\n\nDo you wish to continue? No backsies! "); if (!$confirmation) { $this->error('ABORTING'); exit(-1); } } // List all the tables in the database so we don't have to worry about missing some as the app grows $tables = DB::connection()->getDoctrineSchemaManager()->listTableNames(); $except_tables = [ 'oauth_access_tokens', 'oauth_clients', 'oauth_personal_access_clients', 'migrations', 'settings', 'users', ]; // We only need to find out what these are so we can nuke these columns on the assets table. $custom_fields = CustomField::get(); foreach ($custom_fields as $custom_field) { $this->info('DROP the '.$custom_field->db_column.' column from assets as well.'); if (\Schema::hasColumn('assets', $custom_field->db_column)) { \Schema::table('assets', function ($table) use ($custom_field) { $table->dropColumn($custom_field->db_column); }); } } foreach ($tables as $table) { if (in_array($table, $except_tables)) { $this->info($table. ' is SKIPPED.'); } else { \DB::statement('truncate '.$table); $this->info($table. ' is TRUNCATED.'); } } // Leave in the demo oauth keys so we don't have to reset them every day in the demos \DB::statement('delete from oauth_clients WHERE id > 2'); \DB::statement('delete from oauth_access_tokens WHERE id > 2'); } }