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: [ 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, ) {} } diff --git a/packages/database/src/Migrations/DatePrefixStrategy.php b/packages/database/src/Migrations/DatePrefixStrategy.php new file mode 100644 index 000000000..b0afc7ce0 --- /dev/null +++ b/packages/database/src/Migrations/DatePrefixStrategy.php @@ -0,0 +1,16 @@ +