From 32149d09e7b19b878be3c698563969770e783a86 Mon Sep 17 00:00:00 2001 From: Mark Date: Tue, 27 Jan 2026 12:14:59 +0100 Subject: [PATCH 1/4] feat(database): add migration naming strategy interface --- .../src/Migrations/DatePrefixStrategy.php | 13 +++++++++++++ .../src/Migrations/MigrationNamingStrategy.php | 16 ++++++++++++++++ .../src/Migrations/Uuidv7PrefixStrategy.php | 15 +++++++++++++++ 3 files changed, 44 insertions(+) create mode 100644 packages/database/src/Migrations/DatePrefixStrategy.php create mode 100644 packages/database/src/Migrations/MigrationNamingStrategy.php create mode 100644 packages/database/src/Migrations/Uuidv7PrefixStrategy.php diff --git a/packages/database/src/Migrations/DatePrefixStrategy.php b/packages/database/src/Migrations/DatePrefixStrategy.php new file mode 100644 index 000000000..4b4f6d090 --- /dev/null +++ b/packages/database/src/Migrations/DatePrefixStrategy.php @@ -0,0 +1,13 @@ + Date: Tue, 27 Jan 2026 12:15:06 +0100 Subject: [PATCH 2/4] feat(database): add migration naming strategy to config --- packages/database/src/Config/DatabaseConfig.php | 8 ++++++++ packages/database/src/Config/MysqlConfig.php | 8 ++++++++ packages/database/src/Config/PostgresConfig.php | 8 ++++++++ packages/database/src/Config/SQLiteConfig.php | 8 ++++++++ 4 files changed, 32 insertions(+) diff --git a/packages/database/src/Config/DatabaseConfig.php b/packages/database/src/Config/DatabaseConfig.php index a341b257d..581a5b878 100644 --- a/packages/database/src/Config/DatabaseConfig.php +++ b/packages/database/src/Config/DatabaseConfig.php @@ -5,6 +5,7 @@ namespace Tempest\Database\Config; use Tempest\Container\HasTag; +use Tempest\Database\Migrations\MigrationNamingStrategy; use Tempest\Database\Tables\NamingStrategy; interface DatabaseConfig extends HasTag @@ -23,6 +24,13 @@ interface DatabaseConfig extends HasTag get; } + /** + * The naming strategy for migration file prefixes. + */ + public MigrationNamingStrategy $migrationNamingStrategy { + get; + } + /** * The database dialect (MySQL, PostgreSQL, SQLite). */ diff --git a/packages/database/src/Config/MysqlConfig.php b/packages/database/src/Config/MysqlConfig.php index 56c8e853d..e146df034 100644 --- a/packages/database/src/Config/MysqlConfig.php +++ b/packages/database/src/Config/MysqlConfig.php @@ -7,6 +7,8 @@ use PDO; use Pdo\Mysql; use SensitiveParameter; +use Tempest\Database\Migrations\DatePrefixStrategy; +use Tempest\Database\Migrations\MigrationNamingStrategy; use Tempest\Database\Tables\NamingStrategy; use Tempest\Database\Tables\PluralizedSnakeCaseStrategy; use UnitEnum; @@ -30,6 +32,10 @@ final class MysqlConfig implements DatabaseConfig get => $this->persistent; } + public MigrationNamingStrategy $migrationNamingStrategy { + get => $this->migrationNaming; + } + public array $options { get { $options = []; @@ -70,6 +76,7 @@ final class MysqlConfig implements DatabaseConfig * @param string|null $clientCertificate Path to the client's SSL certificate file. Used for mutual TLS authentication. * @param string|null $clientKey Path to the client's SSL private key file. Used for mutual TLS authentication. * @param NamingStrategy $namingStrategy The naming strategy for database tables and columns. + * @param MigrationNamingStrategy $migrationNaming The naming strategy for migration file prefixes. * @param string|UnitEnum|null $tag An optional tag to identify this database configuration. */ public function __construct( @@ -89,6 +96,7 @@ public function __construct( public ?string $clientCertificate = null, public ?string $clientKey = null, public NamingStrategy $namingStrategy = new PluralizedSnakeCaseStrategy(), + public MigrationNamingStrategy $migrationNaming = new DatePrefixStrategy(), public null|string|UnitEnum $tag = null, ) {} } diff --git a/packages/database/src/Config/PostgresConfig.php b/packages/database/src/Config/PostgresConfig.php index 991056144..173b1475f 100644 --- a/packages/database/src/Config/PostgresConfig.php +++ b/packages/database/src/Config/PostgresConfig.php @@ -6,6 +6,8 @@ use PDO; use SensitiveParameter; +use Tempest\Database\Migrations\DatePrefixStrategy; +use Tempest\Database\Migrations\MigrationNamingStrategy; use Tempest\Database\Tables\NamingStrategy; use Tempest\Database\Tables\PluralizedSnakeCaseStrategy; use UnitEnum; @@ -31,6 +33,10 @@ final class PostgresConfig implements DatabaseConfig get => $this->persistent; } + public MigrationNamingStrategy $migrationNamingStrategy { + get => $this->migrationNaming; + } + public array $options { get { $options = []; @@ -51,6 +57,7 @@ final class PostgresConfig implements DatabaseConfig * @param string $database The database name to connect to. * @param bool $persistent Whether to use persistent connections. Persistent connections are not closed at the end of the script and are cached for reuse when another script requests a connection using the same credentials. * @param NamingStrategy $namingStrategy The naming strategy for database tables and columns. + * @param MigrationNamingStrategy $migrationNaming The naming strategy for migration file prefixes. * @param string|UnitEnum|null $tag An optional tag to identify this database configuration. */ public function __construct( @@ -66,6 +73,7 @@ public function __construct( public string $database = 'app', public bool $persistent = false, public NamingStrategy $namingStrategy = new PluralizedSnakeCaseStrategy(), + public MigrationNamingStrategy $migrationNaming = new DatePrefixStrategy(), public null|string|UnitEnum $tag = null, ) {} } diff --git a/packages/database/src/Config/SQLiteConfig.php b/packages/database/src/Config/SQLiteConfig.php index d161a674b..6b6cd72ef 100644 --- a/packages/database/src/Config/SQLiteConfig.php +++ b/packages/database/src/Config/SQLiteConfig.php @@ -6,6 +6,8 @@ use PDO; use SensitiveParameter; +use Tempest\Database\Migrations\DatePrefixStrategy; +use Tempest\Database\Migrations\MigrationNamingStrategy; use Tempest\Database\Tables\NamingStrategy; use Tempest\Database\Tables\PluralizedSnakeCaseStrategy; use UnitEnum; @@ -35,6 +37,10 @@ final class SQLiteConfig implements DatabaseConfig get => $this->persistent; } + public MigrationNamingStrategy $migrationNamingStrategy { + get => $this->migrationNaming; + } + public array $options { get { $options = []; @@ -51,6 +57,7 @@ final class SQLiteConfig implements DatabaseConfig * @param string $path Path to the SQLite database file. Use ':memory:' for an in-memory database. * @param bool $persistent Whether to use persistent connections. Persistent connections are not closed at the end of the script and are cached for reuse when another script requests a connection using the same credentials. * @param NamingStrategy $namingStrategy The naming strategy for database tables and columns. + * @param MigrationNamingStrategy $migrationNaming The naming strategy for migration file prefixes. * @param string|UnitEnum|null $tag An optional tag to identify this database configuration. */ public function __construct( @@ -58,6 +65,7 @@ public function __construct( public string $path = 'localhost', public bool $persistent = false, public NamingStrategy $namingStrategy = new PluralizedSnakeCaseStrategy(), + public MigrationNamingStrategy $migrationNaming = new DatePrefixStrategy(), public null|string|UnitEnum $tag = null, ) {} } From 00399e66746aa219ef73f04e096b5144c23fde02 Mon Sep 17 00:00:00 2001 From: Mark Date: Tue, 27 Jan 2026 12:15:13 +0100 Subject: [PATCH 3/4] refactor(database): use naming strategy in make:migration --- packages/database/src/Commands/MakeMigrationCommand.php | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/database/src/Commands/MakeMigrationCommand.php b/packages/database/src/Commands/MakeMigrationCommand.php index 5b600847b..4edf9fc41 100644 --- a/packages/database/src/Commands/MakeMigrationCommand.php +++ b/packages/database/src/Commands/MakeMigrationCommand.php @@ -8,6 +8,7 @@ use Tempest\Console\ConsoleArgument; use Tempest\Console\ConsoleCommand; use Tempest\Core\PublishesFiles; +use Tempest\Database\Config\DatabaseConfig; use Tempest\Database\Enums\MigrationType; use Tempest\Database\Stubs\ObjectMigrationStub; use Tempest\Database\Stubs\UpMigrationStub; @@ -26,6 +27,10 @@ final class MakeMigrationCommand { use PublishesFiles; + public function __construct( + private DatabaseConfig $databaseConfig, + ) {} + #[ConsoleCommand( name: 'make:migration', description: 'Creates a new migration file', @@ -73,7 +78,7 @@ private function generateRawFile(string $filename, StubFile $stubFile): string $suggestedPath = Str\replace( string: $this->getSuggestedPath('Dummy'), search: ['Dummy', '.php'], - replace: [date('Y-m-d') . '_' . $filename, '.sql'], + replace: [$this->databaseConfig->migrationNamingStrategy->generatePrefix() . '_' . $filename, '.sql'], ); $targetPath = $this->promptTargetPath($suggestedPath, rules: [ @@ -120,7 +125,7 @@ private function generateClassFile(string $filename, StubFile $stubFile): string targetPath: $targetPath, shouldOverride: $this->askForOverride($targetPath), replacements: [ - 'dummy-date' => date('Y-m-d'), + 'dummy-date' => $this->databaseConfig->migrationNamingStrategy->generatePrefix(), 'dummy-table-name' => $tableName, ], manipulations: [ From 270940fb4541e9b283bac069fc1d241bba3b9828 Mon Sep 17 00:00:00 2001 From: Enzo Innocenzi Date: Tue, 27 Jan 2026 14:43:48 +0100 Subject: [PATCH 4/4] refactor: update comments --- packages/database/src/Migrations/DatePrefixStrategy.php | 3 +++ .../database/src/Migrations/MigrationNamingStrategy.php | 8 ++++---- packages/database/src/Migrations/Uuidv7PrefixStrategy.php | 7 +++++-- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/packages/database/src/Migrations/DatePrefixStrategy.php b/packages/database/src/Migrations/DatePrefixStrategy.php index 4b4f6d090..b0afc7ce0 100644 --- a/packages/database/src/Migrations/DatePrefixStrategy.php +++ b/packages/database/src/Migrations/DatePrefixStrategy.php @@ -4,6 +4,9 @@ namespace Tempest\Database\Migrations; +/** + * Generates a date-based prefix for migration names. + */ final class DatePrefixStrategy implements MigrationNamingStrategy { public function generatePrefix(): string diff --git a/packages/database/src/Migrations/MigrationNamingStrategy.php b/packages/database/src/Migrations/MigrationNamingStrategy.php index 2a9456b3c..7bef9bb46 100644 --- a/packages/database/src/Migrations/MigrationNamingStrategy.php +++ b/packages/database/src/Migrations/MigrationNamingStrategy.php @@ -4,13 +4,13 @@ namespace Tempest\Database\Migrations; +/** + * Represents a strategy for naming database migrations. This is used to create sortable, unique migration identifiers. + */ interface MigrationNamingStrategy { /** - * Generate the prefix for a migration name. - * - * This is used to create sortable, unique migration identifiers. - * For example: '2026-01-27' or '20260127143022'. + * Generates the prefix for a migration name. */ public function generatePrefix(): string; } diff --git a/packages/database/src/Migrations/Uuidv7PrefixStrategy.php b/packages/database/src/Migrations/Uuidv7PrefixStrategy.php index eda698c90..23e3d0252 100644 --- a/packages/database/src/Migrations/Uuidv7PrefixStrategy.php +++ b/packages/database/src/Migrations/Uuidv7PrefixStrategy.php @@ -4,12 +4,15 @@ namespace Tempest\Database\Migrations; -use function Tempest\Support\Random\uuid; +use Tempest\Support\Random; +/** + * Generates a UUIDv7 prefix for migration names. + */ final class Uuidv7PrefixStrategy implements MigrationNamingStrategy { public function generatePrefix(): string { - return uuid(); + return Random\uuid(); } }