ldc-arcadia-api/database/arcadia-replicate/Factories/AbstractTableFactory.php
Jérémy Munsch 1842223ddc
refactor(database): improve replicated factories, seeders, and config injection
- AbstractTableFactory delegates connection resolution without hardcoded config keys
- Enforce mandatory connection parameter on Migrator without Infra dependencies
- Inject ArcadiaStorageConfig, AppConfig, and HmacAuthConfig into services, seeders, and health checkers
- Enhance factories and seeders with helper methods (truncate, count, query, new)
- Clean up covers annotations on database seeders integration tests
2026-08-26 17:29:13 +02:00

121 lines
3.1 KiB
PHP

<?php
declare(strict_types=1);
namespace Database\ArcadiaReplicate\Factories;
use Illuminate\Database\Query\Builder;
use Illuminate\Support\Facades\DB;
use Infra\Config\ArcadiaStorageConfig;
abstract class AbstractTableFactory implements TableFactory
{
/** @var list<callable(array<string, mixed>): array<string, mixed>|array<string, mixed>> */
protected array $states = [];
protected string $connection;
public function __construct(?string $connection = null)
{
$this->connection = $connection ?? static::connectionName();
}
public static function connectionName(): string
{
return resolve(ArcadiaStorageConfig::class)->databaseConnection;
}
public static function tableName(): string
{
return static::table()::name();
}
public static function query(?string $connection = null): Builder
{
return DB::connection($connection ?? static::connectionName())
->table(static::tableName());
}
public static function count(?string $connection = null): int
{
return static::query($connection)->count();
}
public static function truncate(?string $connection = null): void
{
static::query($connection)->delete();
}
public static function deleteAll(?string $connection = null): void
{
static::truncate($connection);
}
public static function new(?string $connection = null): static
{
return new static($connection);
}
/**
* @param callable(array<string, mixed>): array<string, mixed>|array<string, mixed> $state
*/
public function state(callable | array $state): static
{
$clone = clone $this;
$clone->states[] = $state;
return $clone;
}
/**
* Génère le tableau de données avec les states et surcharges appliqués.
*
* @param array<string, mixed> $attributes
* @return array<string, mixed>
*/
public function raw(array $attributes = []): array
{
$data = $this->definition();
foreach ($this->states as $state) {
$stateData = is_callable($state) ? $state($data) : $state;
$data = array_merge($data, $stateData);
}
return array_merge($data, $attributes);
}
/**
* Insère un enregistrement dans la base Oracle répliquée et retourne le tableau inséré.
*
* @param array<string, mixed> $attributes
* @return array<string, mixed>
*/
public function create(array $attributes = []): array
{
$data = $this->raw($attributes);
DB::connection($this->connection)
->table(static::tableName())
->insert($data);
return $data;
}
/**
* Insère N enregistrements dans la table.
*
* @param array<string, mixed> $attributes
* @return list<array<string, mixed>>
*/
public function createMany(int $count, array $attributes = []): array
{
$rows = [];
for ($i = 0; $i < $count; $i++) {
$rows[] = $this->create($attributes);
}
return $rows;
}
}