KTV/app/Console/Commands/ExportSqlite.php

89 lines
2.7 KiB
PHP
Raw Permalink Normal View History

2025-05-26 16:28:16 +08:00
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use App\Jobs\ExportSqliteUserJob;
use App\Jobs\ExportSqliteSongJob;
use App\Jobs\ExportSqliteFavoriteJob;
2025-05-26 16:28:16 +08:00
use Illuminate\Support\Facades\Bus;
class ExportSqlite extends Command
{
/**
* 指令名稱與參數定義
*
* @var string
*/
protected $signature = 'export:sqlite
{type : The type of data to export (song, user, all)}
{--sync : Run the export job synchronously (without queue)}';
/**
* 指令描述
*
* @var string
*/
protected $description = 'Export data from the database to SQLite (song, user, or both).';
/**
* 執行指令
*/
public function handle()
{
$start = now();
$type = strtolower($this->argument('type'));
$this->info("[Export] 開始匯出資料類型: {$type}");
try {
if (!in_array($type, ['song', 'user', 'FavoriteSongs', 'all'])) {
2025-05-26 16:28:16 +08:00
$this->error('[Export] 無效的 type請使用song、user 或 all');
return 1;
}
$sync = $this->option('sync');
if ($sync) {
$this->warn('[Export] 使用同步模式執行...');
if ($type === 'song' || $type === 'all') {
(new ExportSqliteSongJob())->handle();
}
if ($type === 'FavoriteSongs' || $type === 'all') {
(new ExportSqliteFavoriteJob())->handle();
}
if ($type === 'user' || $type === 'all') {
(new ExportSqliteUserJob())->handle();
}
$this->info('[Export] 匯出完成(同步)');
} else {
if ($type === 'all') {
// 確保 user -> song 順序
Bus::chain([
new ExportSqliteUserJob(),
new ExportSqliteFavoriteJob(),
new ExportSqliteSongJob(),
])->dispatch();
} elseif ($type === 'song') {
} elseif ($type === 'FavoriteSongs') {
ExportSqliteSongJob::dispatch();
} elseif ($type === 'user') {
ExportSqliteUserJob::dispatch();
}
$this->info('[Export] 匯出任務已派送至 queue');
}
$duration = now()->diffInSeconds($start);
$this->info("[Export] 執行完成,用時 {$duration}");
} catch (\Throwable $e) {
$this->error('[Export] 發生錯誤:' . $e->getMessage());
return 1;
}
return 0;
}
}