Skip to content

Commit 428311e

Browse files
committed
database: fix mail settings migration
1 parent 6df31e1 commit 428311e

File tree

2 files changed

+61
-11
lines changed

2 files changed

+61
-11
lines changed

app/Models/Setting.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,13 @@
22

33
namespace Pterodactyl\Models;
44

5+
/**
6+
* Pterodactyl\Models\Setting.
7+
*
8+
* @property int $id
9+
* @property string $key
10+
* @property string $value
11+
*/
512
class Setting extends Model
613
{
714
/**
Lines changed: 54 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,48 @@
11
<?php
22

3+
use Pterodactyl\Models\Setting;
34
use Illuminate\Support\Facades\DB;
45
use Illuminate\Database\Migrations\Migration;
56

67
return new class () extends Migration {
8+
private array $keys = [
9+
['mail:host', 'mail:mailers:smtp:host'],
10+
['mail:port', 'mail:mailers:smtp:port'],
11+
['mail:encryption', 'mail:mailers:smtp:encryption'],
12+
['mail:username', 'mail:mailers:smtp:username'],
13+
['mail:password', 'mail:mailers:smtp:password'],
14+
];
15+
716
/**
817
* Run the migrations.
918
*/
1019
public function up(): void
1120
{
12-
DB::update('UPDATE settings SET `key` = \'mail:mailers:smtp:host\' WHERE `key` = \'mail:host\' AND NOT EXISTS (SELECT 1 FROM settings WHERE `key` = \'mail:mailers:smtp:host\')');
13-
DB::update('UPDATE settings SET `key` = \'mail:mailers:smtp:port\' WHERE `key` = \'mail:port\' AND NOT EXISTS (SELECT 1 FROM settings WHERE `key` = \'mail:mailers:smtp:port\')');
14-
DB::update('UPDATE settings SET `key` = \'mail:mailers:smtp:encryption\' WHERE `key` = \'mail:encryption\' AND NOT EXISTS (SELECT 1 FROM settings WHERE `key` = \'mail:mailers:smtp:encryption\')');
15-
DB::update('UPDATE settings SET `key` = \'mail:mailers:smtp:username\' WHERE `key` = \'mail:username\' AND NOT EXISTS (SELECT 1 FROM settings WHERE `key` = \'mail:mailers:smtp:username\')');
16-
DB::update('UPDATE settings SET `key` = \'mail:mailers:smtp:password\' WHERE `key` = \'mail:password\' AND NOT EXISTS (SELECT 1 FROM settings WHERE `key` = \'mail:mailers:smtp:password\')');
21+
$settings = Setting::all();
22+
23+
// Gets the first column in our key table and gets all matching settings.
24+
$oldKeys = array_column($this->keys, 0);
25+
$oldSettings = $settings->filter(fn (Setting $setting) => in_array($setting->key, $oldKeys));
26+
27+
// Gets the second column in our key table and gets all matching settings.
28+
$newKeys = array_column($this->keys, 1);
29+
$newSettings = $settings->filter(fn (Setting $setting) => in_array($setting->key, $newKeys));
30+
31+
// Map all the old settings to their new key.
32+
$oldSettings->map(function (Setting $setting) use ($oldKeys) {
33+
$row = array_search($setting->key, $oldKeys, true);
34+
$setting->key = $this->keys[$row][1];
35+
36+
return $setting;
37+
// Check if any settings with the new key already exist.
38+
})->filter(function (Setting $setting) use ($newSettings) {
39+
if ($newSettings->contains('key', $setting->key)) {
40+
return false;
41+
}
42+
43+
return true;
44+
// Update the settings to use their new keys if they don't already exist.
45+
})->each(fn (Setting $setting) => $setting->save());
1746
}
1847

1948
/**
@@ -22,13 +51,27 @@ public function up(): void
2251
public function down(): void
2352
{
2453
DB::transaction(function () {
25-
DB::delete('DELETE FROM settings WHERE `key` IN (\'mail:host\', \'mail:port\', \'mail:encryption\', \'mail:username\', \'mail:password\')');
54+
$settings = Setting::all();
55+
56+
// Gets the second column in our key table and gets all matching settings.
57+
$newKeys = array_column($this->keys, 0);
58+
$newSettings = $settings->filter(fn (Setting $setting) => in_array($setting->key, $newKeys));
59+
60+
// Delete all settings that already have the new key.
61+
$newSettings->each(fn (Setting $setting) => $setting->delete());
62+
63+
// Gets the first column in our key table and gets all matching settings.
64+
$oldKeys = array_column($this->keys, 1);
65+
$oldSettings = $settings->filter(fn (Setting $setting) => in_array($setting->key, $oldKeys));
66+
67+
// Map all the old settings to their new key.
68+
$oldSettings->map(function (Setting $setting) use ($oldKeys) {
69+
$row = array_search($setting->key, $oldKeys, true);
70+
$setting->key = $this->keys[$row][0];
2671

27-
DB::update('UPDATE settings SET `key` = \'mail:host\' WHERE `key` = \'mail:mailers:smtp:host\'');
28-
DB::update('UPDATE settings SET `key` = \'mail:port\' WHERE `key` = \'mail:mailers:smtp:port\'');
29-
DB::update('UPDATE settings SET `key` = \'mail:encryption\' WHERE `key` = \'mail:mailers:smtp:encryption\'');
30-
DB::update('UPDATE settings SET `key` = \'mail:username\' WHERE `key` = \'mail:mailers:smtp:username\'');
31-
DB::update('UPDATE settings SET `key` = \'mail:password\' WHERE `key` = \'mail:mailers:smtp:password\'');
72+
return $setting;
73+
// Update the settings to use their new keys if they don't already exist.
74+
})->each(fn (Setting $setting) => $setting->save());
3275
});
3376
}
3477
};

0 commit comments

Comments
 (0)