Skip to content

Commit 1310971

Browse files
authored
Fix Migration Command for Legacy Actions in PostgreSQL (#145)
1 parent f917cca commit 1310971

4 files changed

Lines changed: 36 additions & 18 deletions

File tree

src/Commands/MigrateLegacyActionsCommand.php

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,10 @@ private function getLegacyBuilder(): Builder
9191
{
9292
$tableName = config('magiclink.magiclink_table', 'magic_links');
9393

94+
if ((new MagicLink())->getConnection()->getDriverName() === 'pgsql') {
95+
return DB::table($tableName)->where('action', 'not like', '{');
96+
}
97+
9498
return DB::table($tableName)->where('action', 'like', 'O:%');
9599
}
96100

@@ -114,7 +118,10 @@ private function migrateRecord(int|string $id, string $action): array
114118
];
115119
}
116120

117-
$magicLink->action = unserialize($action);
121+
$magicLink->action = (new MagicLink())->getConnection()->getDriverName() === 'pgsql'
122+
? unserialize(base64_decode($action))
123+
: unserialize($action);
124+
118125
$magicLink->saveQuietly();
119126

120127
return [
@@ -125,6 +132,10 @@ private function migrateRecord(int|string $id, string $action): array
125132

126133
private function isAllowedAction(string $data): bool
127134
{
135+
if ((new MagicLink())->getConnection()->getDriverName() === 'pgsql') {
136+
$data = base64_decode($data);
137+
}
138+
128139
if (preg_match('/^O:\d+:"([^"]+)"/', $data, $matches)) {
129140
$className = $matches[1];
130141

tests/Actions/LegacyTest.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
use MagicLink\Actions\LoginAction;
99
use MagicLink\Actions\ResponseAction;
1010
use MagicLink\Actions\ViewAction;
11+
use MagicLink\MagicLink;
1112
use MagicLink\Test\TestCase;
1213
use MagicLink\Test\TestSupport\MyController;
1314
use MagicLink\Test\TestSupport\User;
@@ -74,7 +75,9 @@ private function generateMagicLink($action): string
7475
{
7576
$id = (string) \Illuminate\Support\Str::uuid();
7677
$token = 'toktok';
77-
$payload = serialize($action);
78+
$payload = (new MagicLink())->getConnection()->getDriverName() === 'pgsql'
79+
? base64_encode(serialize($action))
80+
: serialize($action);
7881

7982
DB::table('magic_links')->insert([
8083
'id' => $id,

tests/Commands/MigrateLegacyActionsCommandTest.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
use MagicLink\Actions\LoginAction;
99
use MagicLink\Actions\ResponseAction;
1010
use MagicLink\Actions\ViewAction;
11+
use MagicLink\MagicLink;
1112
use MagicLink\Test\TestCase;
1213
use MagicLink\Test\TestSupport\MyController;
1314
use MagicLink\Test\TestSupport\User;
@@ -128,7 +129,9 @@ private function generateMagicLink($action): array
128129
{
129130
$id = (string) \Illuminate\Support\Str::uuid();
130131
$token = 'toktok';
131-
$payload = serialize($action);
132+
$payload = (new MagicLink())->getConnection()->getDriverName() === 'pgsql'
133+
? base64_encode(serialize($action))
134+
: serialize($action);
132135

133136
DB::table('magic_links')->insert([
134137
'id' => $id,

tests/TestCase.php

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,15 @@
33
namespace MagicLink\Test;
44

55
use Illuminate\Database\Schema\Blueprint;
6+
use Illuminate\Foundation\Testing\RefreshDatabase;
67
use MagicLink\MagicLinkServiceProvider;
78
use MagicLink\Test\TestSupport\User;
89
use Orchestra\Testbench\TestCase as Orchestra;
910

1011
abstract class TestCase extends Orchestra
1112
{
13+
use RefreshDatabase;
14+
1215
public function setUp(): void
1316
{
1417
parent::setUp();
@@ -77,7 +80,7 @@ protected function defineEnvironment($app)
7780

7881
$driver = getenv('DB_DRIVER');
7982

80-
if ($driver !== 'mysql') {
83+
if ($driver !== 'pgsql') {
8184
$app['config']->set('database.default', 'testbench');
8285
} else {
8386
$app['config']->set('database.default', $driver);
@@ -87,31 +90,29 @@ protected function defineEnvironment($app)
8790
protected function defineDatabaseMigrations()
8891
{
8992
$this->loadMigrationsFrom(__DIR__ . '/../databases/migrations');
90-
$this->setUpDatabase($this->app);
9193
}
9294

93-
/**
94-
* Set up the database.
95-
*
96-
* @param \Illuminate\Foundation\Application $app
97-
*/
98-
protected function setUpDatabase($app)
95+
protected function refreshTestDatabase()
9996
{
100-
if ($app['config']->get('database.default') !== 'testbench') {
101-
$app['db']->connection()->getSchemaBuilder()->dropIfExists('users');
102-
$app['db']->connection()->getSchemaBuilder()->dropIfExists('migrations');
103-
$app['db']->connection()->getSchemaBuilder()->dropIfExists('magic_links');
97+
if (getenv('DB_DRIVER') === 'pgsql') {
98+
$this->app['db']->connection()->getSchemaBuilder()->dropIfExists('users');
99+
$this->app['db']->connection()->getSchemaBuilder()->dropIfExists('migrations');
100+
$this->app['db']->connection()->getSchemaBuilder()->dropIfExists('magic_links');
101+
$this->artisan('migrate', ['--database' => getenv('DB_DRIVER') === 'pgsql' ? 'pgsql' : 'testbench']);
104102
}
103+
}
105104

106-
$this->artisan('migrate');
107-
108-
$app['db']->connection()->getSchemaBuilder()->create('users', function (Blueprint $table) {
105+
protected function afterRefreshingDatabase()
106+
{
107+
$this->app['db']->connection()->getSchemaBuilder()->create('users', function (Blueprint $table) {
109108
$table->increments('id');
110109
$table->string('email');
111110
$table->string('remember_token')->nullable();
112111
});
113112

114113
User::create(['email' => 'test@user.com']);
114+
115+
$this->artisan('migrate', ['--database' => getenv('DB_DRIVER') === 'pgsql' ? 'pgsql' : 'testbench']);
115116
}
116117

117118
protected function loadRoutes()

0 commit comments

Comments
 (0)