|
2 | 2 | namespace OpenProvider\WhmcsDomainAddon\Controllers\Admin; |
3 | 3 |
|
4 | 4 | use Illuminate\Database\QueryException; |
| 5 | +use Illuminate\Database\Schema\Blueprint; |
5 | 6 | use WHMCS\Config\Setting; |
| 7 | +use WHMCS\Database\Capsule; |
6 | 8 | use WeDevelopCoffee\wPower\Controllers\ViewBaseController; |
7 | 9 | use WeDevelopCoffee\wPower\Core\Core; |
8 | 10 | use WeDevelopCoffee\wPower\Validator\Validator; |
@@ -41,6 +43,8 @@ public function __construct( |
41 | 43 | */ |
42 | 44 | public function show($params) |
43 | 45 | { |
| 46 | + $this->ensureTablesExist(); |
| 47 | + |
44 | 48 | $domains = isset($_POST['domains']) ? trim($_POST['domains']) : ''; |
45 | 49 | $submissionError = null; |
46 | 50 | $validationErrors = []; |
@@ -89,6 +93,79 @@ public function show($params) |
89 | 93 | ]); |
90 | 94 | } |
91 | 95 |
|
| 96 | + private function ensureTablesExist(): void |
| 97 | + { |
| 98 | + if (Capsule::schema()->hasTable('mod_op_bulk_transfer_batches') && |
| 99 | + Capsule::schema()->hasTable('mod_op_bulk_transfer_items')) { |
| 100 | + return; |
| 101 | + } |
| 102 | + |
| 103 | + if (!Capsule::schema()->hasTable('mod_op_bulk_transfer_batches')) { |
| 104 | + Capsule::schema()->create('mod_op_bulk_transfer_batches', function (Blueprint $table) { |
| 105 | + $table->increments('id'); |
| 106 | + $table->string('bulk_reference', 50)->unique('uniq_bulk_reference'); |
| 107 | + $table->integer('reseller_id')->unsigned()->nullable()->default(null); |
| 108 | + $table->integer('initiated_by_admin_id')->unsigned()->nullable()->default(null); |
| 109 | + $table->string('description', 255)->nullable()->default(null); |
| 110 | + $table->integer('total_domains')->unsigned()->default(0); |
| 111 | + $table->integer('processed_domains')->unsigned()->default(0); |
| 112 | + $table->integer('success_domains')->unsigned()->default(0); |
| 113 | + $table->integer('failed_domains')->unsigned()->default(0); |
| 114 | + $table->enum('status', [ |
| 115 | + 'queued', 'processing', 'completed', 'completed_with_errors', 'failed', |
| 116 | + ])->default('queued')->index('idx_status'); |
| 117 | + $table->text('notes')->nullable(); |
| 118 | + $table->dateTime('created_at')->useCurrent(); |
| 119 | + $table->dateTime('updated_at')->useCurrent()->useCurrentOnUpdate(); |
| 120 | + $table->index('created_at', 'idx_created_at'); |
| 121 | + }); |
| 122 | + } |
| 123 | + |
| 124 | + if (!Capsule::schema()->hasTable('mod_op_bulk_transfer_items')) { |
| 125 | + Capsule::schema()->create('mod_op_bulk_transfer_items', function (Blueprint $table) { |
| 126 | + $table->increments('id'); |
| 127 | + $table->integer('batch_id')->unsigned(); |
| 128 | + $table->integer('client_id')->unsigned()->nullable()->default(null); |
| 129 | + $table->integer('domain_id')->unsigned()->nullable()->default(null); |
| 130 | + $table->string('domain', 255); |
| 131 | + $table->string('op_owner_handle', 100)->nullable()->default(null); |
| 132 | + $table->string('op_admin_handle', 100)->nullable()->default(null); |
| 133 | + $table->string('op_tech_handle', 100)->nullable()->default(null); |
| 134 | + $table->string('op_billing_handle', 100)->nullable()->default(null); |
| 135 | + $table->string('op_transfer_status', 20)->nullable()->default(null); |
| 136 | + $table->integer('op_domain_id')->unsigned()->nullable()->default(null); |
| 137 | + $table->enum('transfer_status', [ |
| 138 | + 'queued', 'validating', 'validation_failed', 'ready_for_transfer', |
| 139 | + 'unlocking', 'getting_epp', 'creating_handle', 'transferring', |
| 140 | + 'transfer_requested', 'checking_transfer_status', 'success', 'failed', |
| 141 | + ])->default('queued')->index('idx_transfer_status'); |
| 142 | + $table->text('failure_reason')->nullable(); |
| 143 | + $table->dateTime('transfer_requested_at')->nullable()->default(null); |
| 144 | + $table->dateTime('last_status_check_at')->nullable()->default(null); |
| 145 | + $table->text('last_status_message')->nullable(); |
| 146 | + $table->tinyInteger('attempt_count')->unsigned()->default(0); |
| 147 | + $table->dateTime('started_at')->nullable()->default(null); |
| 148 | + $table->dateTime('finished_at')->nullable()->default(null); |
| 149 | + $table->dateTime('created_at')->useCurrent(); |
| 150 | + $table->dateTime('updated_at')->useCurrent()->useCurrentOnUpdate(); |
| 151 | + $table->unique(['batch_id', 'domain'], 'uniq_batch_domain'); |
| 152 | + $table->index('batch_id', 'idx_batch_id'); |
| 153 | + $table->index('client_id', 'idx_client_id'); |
| 154 | + $table->index('domain_id', 'idx_domain_id'); |
| 155 | + $table->index('op_transfer_status', 'idx_op_transfer_status'); |
| 156 | + $table->index('last_status_check_at', 'idx_last_status_check_at'); |
| 157 | + $table->index('domain', 'idx_domain'); |
| 158 | + }); |
| 159 | + |
| 160 | + Capsule::schema()->table('mod_op_bulk_transfer_items', function (Blueprint $table) { |
| 161 | + $table->foreign('batch_id', 'fk_bulk_transfer_batch') |
| 162 | + ->references('id') |
| 163 | + ->on('mod_op_bulk_transfer_batches') |
| 164 | + ->onDelete('cascade'); |
| 165 | + }); |
| 166 | + } |
| 167 | + } |
| 168 | + |
92 | 169 | private function buildSubmissionErrorMessage(\Throwable $exception): string |
93 | 170 | { |
94 | 171 | $message = trim((string) $exception->getMessage()); |
@@ -223,6 +300,8 @@ private function isValidDomain(string $domain): bool |
223 | 300 |
|
224 | 301 | public function batchList($params) |
225 | 302 | { |
| 303 | + $this->ensureTablesExist(); |
| 304 | + |
226 | 305 | try { |
227 | 306 | $perPage = 10; |
228 | 307 |
|
@@ -269,6 +348,8 @@ public function batchList($params) |
269 | 348 |
|
270 | 349 | public function batchDetails($params) |
271 | 350 | { |
| 351 | + $this->ensureTablesExist(); |
| 352 | + |
272 | 353 | $batchReference = $params['batchReference'] ?? ($_GET['batchReference'] ?? ''); |
273 | 354 |
|
274 | 355 | try { |
|
0 commit comments