Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 7 additions & 2 deletions packages/database/src/Commands/MakeMigrationCommand.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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',
Expand Down Expand Up @@ -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: [
Expand Down Expand Up @@ -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: [
Expand Down
8 changes: 8 additions & 0 deletions packages/database/src/Config/DatabaseConfig.php
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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).
*/
Expand Down
8 changes: 8 additions & 0 deletions packages/database/src/Config/MysqlConfig.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -30,6 +32,10 @@ final class MysqlConfig implements DatabaseConfig
get => $this->persistent;
}

public MigrationNamingStrategy $migrationNamingStrategy {
get => $this->migrationNaming;
}

public array $options {
get {
$options = [];
Expand Down Expand Up @@ -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(
Expand All @@ -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,
) {}
}
8 changes: 8 additions & 0 deletions packages/database/src/Config/PostgresConfig.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -31,6 +33,10 @@ final class PostgresConfig implements DatabaseConfig
get => $this->persistent;
}

public MigrationNamingStrategy $migrationNamingStrategy {
get => $this->migrationNaming;
}

public array $options {
get {
$options = [];
Expand All @@ -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(
Expand All @@ -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,
) {}
}
8 changes: 8 additions & 0 deletions packages/database/src/Config/SQLiteConfig.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -35,6 +37,10 @@ final class SQLiteConfig implements DatabaseConfig
get => $this->persistent;
}

public MigrationNamingStrategy $migrationNamingStrategy {
get => $this->migrationNaming;
}

public array $options {
get {
$options = [];
Expand All @@ -51,13 +57,15 @@ 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(
#[SensitiveParameter]
public string $path = 'localhost',
public bool $persistent = false,
public NamingStrategy $namingStrategy = new PluralizedSnakeCaseStrategy(),
public MigrationNamingStrategy $migrationNaming = new DatePrefixStrategy(),
public null|string|UnitEnum $tag = null,
) {}
}
16 changes: 16 additions & 0 deletions packages/database/src/Migrations/DatePrefixStrategy.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<?php

declare(strict_types=1);

namespace Tempest\Database\Migrations;

/**
* Generates a date-based prefix for migration names.
*/
final class DatePrefixStrategy implements MigrationNamingStrategy
{
public function generatePrefix(): string
{
return date('Y-m-d');
}
}
16 changes: 16 additions & 0 deletions packages/database/src/Migrations/MigrationNamingStrategy.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<?php

declare(strict_types=1);

namespace Tempest\Database\Migrations;

/**
* Represents a strategy for naming database migrations. This is used to create sortable, unique migration identifiers.
*/
interface MigrationNamingStrategy
{
/**
* Generates the prefix for a migration name.
*/
public function generatePrefix(): string;
}
18 changes: 18 additions & 0 deletions packages/database/src/Migrations/Uuidv7PrefixStrategy.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<?php

declare(strict_types=1);

namespace Tempest\Database\Migrations;

use Tempest\Support\Random;

/**
* Generates a UUIDv7 prefix for migration names.
*/
final class Uuidv7PrefixStrategy implements MigrationNamingStrategy
{
public function generatePrefix(): string
{
return Random\uuid();
}
}