presseportale/app/Console/Commands/MigratePresseData.php
Kevin Adametz 405df0a122
Some checks failed
linter / quality (push) Has been cancelled
tests / ci (push) Has been cancelled
first commit
2025-10-20 17:53:02 +02:00

138 lines
5.3 KiB
PHP

<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Str;
// Import der Models für die NEUE Struktur
use App\Models\User as NewUser;
use App\Models\Article as NewArticle;
use App\Models\Brand;
// Import der Models für die ALTE Struktur
use App\Models\Legacy\Presseecho\User as LegacyUser;
use App\Models\Legacy\Presseecho\Article as LegacyArticle;
class MigratePresseechoData extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'migrate:presseecho';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Migrates all data from the old presseecho.de database to the new central database';
/**
* Execute the console command.
*/
public function handle()
{
$this->info('Starting migration for presseecho.de...');
// Holen der Brand-ID für Presseecho aus der neuen DB
$brand = Brand::where('domain', 'presseecho.de')->first();
if (!$brand) {
$this->error('Brand "presseecho.de" not found in the new database. Please seed brands first.');
return 1;
}
// Deaktivieren von Foreign Key Checks für reibungsloses Einfügen
DB::connection('mysql')->statement('SET FOREIGN_KEY_CHECKS=0;');
// Starten der einzelnen Migrationsschritte
$this->migrateUsers();
$this->migrateArticles($brand->id);
// $this->migrateCategories($brand->id); // Weitere Schritte hier hinzufügen
// Reaktivieren der Foreign Key Checks
DB::connection('mysql')->statement('SET FOREIGN_KEY_CHECKS=1;');
$this->info('Migration for presseecho.de completed successfully!');
return 0;
}
private function migrateUsers()
{
$this->line('Migrating users...');
$progressBar = $this->output->createProgressBar(LegacyUser::count());
$progressBar->start();
// Chunking verwenden, um den Speicher bei vielen Nutzern zu schonen
LegacyUser::chunk(200, function ($legacyUsers) use ($progressBar) {
foreach ($legacyUsers as $legacyUser) {
// Prüfen, ob der Nutzer (anhand der E-Mail) bereits in der neuen DB existiert
$existingUser = NewUser::where('email', $legacyUser->email)->first();
if (!$existingUser) {
// Nutzer existiert noch nicht -> neu anlegen
NewUser::create([
'name' => $legacyUser->name,
'email' => $legacyUser->email,
'password' => $legacyUser->password, // Annahme: Passwörter sind bereits gehasht. Wenn nicht: Hash::make(Str::random(16)) und Passwort-Reset erzwingen
'email_verified_at' => $legacyUser->created_at, // oder ein anderer Zeitstempel
'created_at' => $legacyUser->created_at,
'updated_at' => $legacyUser->updated_at,
// ... weitere Felder mappen
]);
}
$progressBar->advance();
}
});
$progressBar->finish();
$this->newLine(2);
}
private function migrateArticles(int $brandId)
{
$this->line('Migrating articles...');
$progressBar = $this->output->createProgressBar(LegacyArticle::count());
$progressBar->start();
LegacyArticle::chunk(200, function ($legacyArticles) use ($brandId, $progressBar) {
foreach ($legacyArticles as $legacyArticle) {
// Den zugehörigen Nutzer in der NEUEN Datenbank finden
$author = NewUser::where('email', $legacyArticle->author_email)->first(); // Annahme: Artikel hat eine Autoren-E-Mail
if (!$author) {
$this->warn("Skipping article ID {$legacyArticle->id}, author with email {$legacyArticle->author_email} not found.");
continue; // Artikel überspringen, wenn kein Autor gefunden wurde
}
// Neuen Artikel in der zentralen DB erstellen
$newArticle = NewArticle::create([
'user_id' => $author->id,
'title' => $legacyArticle->title,
'slug' => $legacyArticle->slug, // oder neu generieren: Str::slug($legacyArticle->title)
'content' => $legacyArticle->body, // Spaltennamen anpassen
'created_at' => $legacyArticle->created_at,
'updated_at' => $legacyArticle->updated_at,
// ... weitere Felder mappen
]);
// Den Artikel mit der Plattform "Presseecho" verknüpfen
// Dies fügt den Eintrag in die Pivot-Tabelle `article_platform` ein
$newArticle->platforms()->attach($brandId, [
'status' => 'published', // oder den alten Status übernehmen
'published_at' => $legacyArticle->published_date,
// eventuell weitere Pivot-Daten
]);
$progressBar->advance();
}
});
$progressBar->finish();
$this->newLine(2);
}
}