Skip to content

Commit b5fdbd0

Browse files
committed
feat(database): dissociate down migrations from up migrations
1 parent b7dc71e commit b5fdbd0

File tree

48 files changed

+263
-623
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+263
-623
lines changed

packages/auth/src/Install/CreatePermissionsTable.php

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,14 @@
44

55
namespace Tempest\Auth\Install;
66

7-
use Tempest\Database\DatabaseMigration;
7+
use Tempest\Database\MigratesDown;
8+
use Tempest\Database\MigratesUp;
89
use Tempest\Database\QueryStatements\CreateTableStatement;
910
use Tempest\Database\QueryStatements\DropTableStatement;
1011
use Tempest\Discovery\SkipDiscovery;
1112

1213
#[SkipDiscovery]
13-
final class CreatePermissionsTable implements DatabaseMigration
14+
final class CreatePermissionsTable implements MigratesUp, MigratesDown
1415
{
1516
private(set) string $name = '0000-00-01_create_permissions_table';
1617

@@ -23,6 +24,6 @@ public function up(): CreateTableStatement
2324

2425
public function down(): DropTableStatement
2526
{
26-
return DropTableStatement::forModel(Permission::class);
27+
return new DropTableStatement('permissions');
2728
}
2829
}

packages/auth/src/Install/CreateUserPermissionsTable.php

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,14 @@
44

55
namespace Tempest\Auth\Install;
66

7-
use Tempest\Database\DatabaseMigration;
7+
use Tempest\Database\MigratesDown;
8+
use Tempest\Database\MigratesUp;
89
use Tempest\Database\QueryStatements\CreateTableStatement;
910
use Tempest\Database\QueryStatements\DropTableStatement;
1011
use Tempest\Discovery\SkipDiscovery;
1112

1213
#[SkipDiscovery]
13-
final class CreateUserPermissionsTable implements DatabaseMigration
14+
final class CreateUserPermissionsTable implements MigratesUp, MigratesDown
1415
{
1516
private(set) string $name = '0000-00-02_create_user_permissions_table';
1617

@@ -24,6 +25,6 @@ public function up(): CreateTableStatement
2425

2526
public function down(): DropTableStatement
2627
{
27-
return DropTableStatement::forModel(Permission::class);
28+
return new DropTableStatement('user_permissions');
2829
}
2930
}

packages/auth/src/Install/CreateUsersTable.php

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,14 @@
44

55
namespace Tempest\Auth\Install;
66

7-
use Tempest\Database\DatabaseMigration;
7+
use Tempest\Database\MigratesDown;
8+
use Tempest\Database\MigratesUp;
89
use Tempest\Database\QueryStatements\CreateTableStatement;
910
use Tempest\Database\QueryStatements\DropTableStatement;
1011
use Tempest\Discovery\SkipDiscovery;
1112

1213
#[SkipDiscovery]
13-
final class CreateUsersTable implements DatabaseMigration
14+
final class CreateUsersTable implements MigratesUp, MigratesDown
1415
{
1516
private(set) string $name = '0000-00-00_create_users_table';
1617

@@ -26,6 +27,6 @@ public function up(): CreateTableStatement
2627

2728
public function down(): DropTableStatement
2829
{
29-
return DropTableStatement::forModel(User::class);
30+
return new DropTableStatement('users');
3031
}
3132
}

packages/database/src/DatabaseMigration.php

Lines changed: 0 additions & 16 deletions
This file was deleted.

packages/database/src/GenericDatabaseMigration.php

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
use Tempest\Database\QueryStatements\RawStatement;
88

9-
final class GenericDatabaseMigration implements DatabaseMigration
9+
final class GenericDatabaseMigration implements MigratesUp
1010
{
1111
public string $name;
1212

@@ -21,9 +21,4 @@ public function up(): QueryStatement
2121
{
2222
return new RawStatement($this->content);
2323
}
24-
25-
public function down(): ?QueryStatement
26-
{
27-
return null;
28-
}
2924
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Tempest\Database;
6+
7+
interface MigratesDown
8+
{
9+
public string $name {
10+
get;
11+
}
12+
13+
public function down(): QueryStatement;
14+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Tempest\Database;
6+
7+
interface MigratesUp
8+
{
9+
public string $name {
10+
get;
11+
}
12+
13+
public function up(): QueryStatement;
14+
}

packages/database/src/MigrationDiscovery.php

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public function __construct(
2323

2424
public function discover(DiscoveryLocation $location, ClassReflector $class): void
2525
{
26-
if (! $class->implements(DatabaseMigration::class)) {
26+
if (! $class->implements(MigratesUp::class) && ! $class->implements(MigratesDown::class)) {
2727
return;
2828
}
2929

@@ -64,19 +64,17 @@ public function discoverPath(DiscoveryLocation $location, string $path): void
6464

6565
public function apply(): void
6666
{
67-
/** @var DatabaseMigration[] $resolved */
67+
/** @var array<MigratesUp|MigratesDown> $resolved */
6868
$resolved = [];
69+
6970
foreach ($this->discoveryItems as $discoveryItem) {
7071
if (is_string($discoveryItem)) {
7172
$resolved[] = $this->container->get($discoveryItem);
72-
} elseif ($discoveryItem instanceof DatabaseMigration) {
73+
} elseif ($discoveryItem instanceof MigratesUp || $discoveryItem instanceof MigratesDown) {
7374
$resolved[] = $discoveryItem;
7475
}
7576
}
7677

77-
$this->container->singleton(
78-
RunnableMigrations::class,
79-
new RunnableMigrations($resolved),
80-
);
78+
$this->container->singleton(RunnableMigrations::class, new RunnableMigrations($resolved));
8179
}
8280
}

packages/database/src/Migrations/CreateMigrationsTable.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,13 @@
44

55
namespace Tempest\Database\Migrations;
66

7-
use Tempest\Database\DatabaseMigration;
7+
use Tempest\Database\MigratesDown;
8+
use Tempest\Database\MigratesUp;
89
use Tempest\Database\QueryStatement;
910
use Tempest\Database\QueryStatements\CreateTableStatement;
1011
use Tempest\Database\QueryStatements\DropTableStatement;
1112

12-
final class CreateMigrationsTable implements DatabaseMigration
13+
final class CreateMigrationsTable implements MigratesUp, MigratesDown
1314
{
1415
private(set) string $name = '0000-00-00_create_migrations_table';
1516

packages/database/src/Migrations/MigrationManager.php

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@
77
use Tempest\Container\Container;
88
use Tempest\Database\Config\DatabaseDialect;
99
use Tempest\Database\Database;
10-
use Tempest\Database\DatabaseMigration as MigrationInterface;
11-
use Tempest\Database\DatabaseMigration;
1210
use Tempest\Database\Exceptions\QueryWasInvalid;
1311
use Tempest\Database\HasLeadingStatements;
1412
use Tempest\Database\HasTrailingStatements;
13+
use Tempest\Database\MigratesDown;
14+
use Tempest\Database\MigratesUp;
1515
use Tempest\Database\OnDatabase;
1616
use Tempest\Database\Query;
1717
use Tempest\Database\QueryStatement;
@@ -61,7 +61,7 @@ public function up(): void
6161
$existingMigrations,
6262
);
6363

64-
foreach ($this->migrations as $migration) {
64+
foreach ($this->migrations->up() as $migration) {
6565
if (in_array($migration->name, $existingMigrations, strict: true)) {
6666
continue;
6767
}
@@ -92,7 +92,7 @@ public function down(): void
9292
$existingMigrations,
9393
);
9494

95-
foreach ($this->migrations as $migration) {
95+
foreach ($this->migrations->down() as $migration) {
9696
/* If the migration is not in the existing migrations, it means it has not been executed */
9797
if (! in_array($migration->name, $existingMigrations, strict: true)) {
9898
continue;
@@ -143,7 +143,7 @@ public function rehashAll(): void
143143
*/
144144
$databaseMigration = array_find(
145145
iterator_to_array($this->migrations),
146-
static fn (DatabaseMigration $migration) => $migration->name === $existingMigration->name,
146+
static fn (MigratesUp|MigratesDown $migration) => $migration->name === $existingMigration->name,
147147
);
148148

149149
if ($databaseMigration === null) {
@@ -169,7 +169,7 @@ public function validate(): void
169169
foreach ($existingMigrations as $existingMigration) {
170170
$databaseMigration = array_find(
171171
iterator_to_array($this->migrations),
172-
static fn (DatabaseMigration $migration) => $migration->name === $existingMigration->name,
172+
static fn (MigratesUp|MigratesDown $migration) => $migration->name === $existingMigration->name,
173173
);
174174

175175
if ($databaseMigration === null) {
@@ -186,7 +186,7 @@ public function validate(): void
186186
}
187187
}
188188

189-
public function executeUp(MigrationInterface $migration): void
189+
public function executeUp(MigratesUp $migration): void
190190
{
191191
if ($migration instanceof ShouldMigrate && $migration->shouldMigrate($this->database) === false) {
192192
return;
@@ -239,7 +239,7 @@ public function executeUp(MigrationInterface $migration): void
239239
event(new MigrationMigrated($migration->name));
240240
}
241241

242-
public function executeDown(MigrationInterface $migration): void
242+
public function executeDown(MigratesDown $migration): void
243243
{
244244
if ($migration instanceof ShouldMigrate && $migration->shouldMigrate($this->database) === false) {
245245
return;
@@ -306,12 +306,19 @@ private function getTableDefinitions(): array
306306
);
307307
}
308308

309-
private function getMigrationHash(DatabaseMigration $migration): string
309+
private function getMigrationHash(MigratesUp $migration): string
310310
{
311-
$minifiedDownSql = $this->getMinifiedSqlFromStatement($migration->down());
312-
$minifiedUpSql = $this->getMinifiedSqlFromStatement($migration->up());
311+
$sql = '';
313312

314-
return hash('xxh128', $minifiedDownSql . $minifiedUpSql);
313+
if ($migration instanceof MigratesUp) {
314+
$sql .= $this->getMinifiedSqlFromStatement($migration->up());
315+
}
316+
317+
if ($migration instanceof MigratesDown) {
318+
$sql .= $this->getMinifiedSqlFromStatement($migration->down());
319+
}
320+
321+
return hash('xxh128', $sql);
315322
}
316323

317324
private function getMinifiedSqlFromStatement(?QueryStatement $statement): string

0 commit comments

Comments
 (0)