first commit
This commit is contained in:
44
routes/console.php
Normal file
44
routes/console.php
Normal file
@@ -0,0 +1,44 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Support\Facades\Artisan;
|
||||
use Illuminate\Support\Facades\Schedule;
|
||||
use App\Models\MigrationSchedule;
|
||||
use App\Models\MigrationRun;
|
||||
use App\Jobs\RunMigrationJob;
|
||||
|
||||
// Check for due migration schedules every minute
|
||||
Schedule::call(function () {
|
||||
$schedules = MigrationSchedule::where('is_active', true)
|
||||
->where(function ($query) {
|
||||
$query->whereNull('next_run_at')
|
||||
->orWhere('next_run_at', '<=', now());
|
||||
})
|
||||
->get();
|
||||
|
||||
foreach ($schedules as $schedule) {
|
||||
// Skip if there's already a running or pending migration
|
||||
$existingRun = MigrationRun::where('schedule_id', $schedule->id)
|
||||
->whereIn('status', ['pending', 'running'])
|
||||
->latest()
|
||||
->first();
|
||||
|
||||
if ($existingRun) {
|
||||
continue; // Skip this schedule, migration already in progress
|
||||
}
|
||||
|
||||
// Create migration run and dispatch job
|
||||
$migrationRun = MigrationRun::create([
|
||||
'schedule_id' => $schedule->id,
|
||||
'status' => 'pending',
|
||||
'total_tables' => count($schedule->tables),
|
||||
]);
|
||||
|
||||
RunMigrationJob::dispatch($migrationRun)->onQueue('default');
|
||||
}
|
||||
})->name('check-migration-schedules')->everyMinute()->withoutOverlapping();
|
||||
|
||||
// Check for schema changes every hour
|
||||
Schedule::command('schema:check-changes')
|
||||
->hourly()
|
||||
->withoutOverlapping()
|
||||
->onOneServer();
|
||||
61
routes/web.php
Normal file
61
routes/web.php
Normal file
@@ -0,0 +1,61 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Support\Facades\Route;
|
||||
use App\Http\Controllers\DashboardController;
|
||||
use App\Http\Controllers\SourceDatabaseController;
|
||||
use App\Http\Controllers\TargetDatabaseController;
|
||||
use App\Http\Controllers\SchemaController;
|
||||
use App\Http\Controllers\MigrationScheduleController;
|
||||
|
||||
Route::get('/', [DashboardController::class, 'index'])->name('dashboard');
|
||||
|
||||
// Redirect /databases to source databases
|
||||
Route::redirect('/databases', '/databases/source');
|
||||
|
||||
// Source Databases
|
||||
Route::prefix('databases/source')->name('databases.source.')->group(function () {
|
||||
Route::get('/', [SourceDatabaseController::class, 'index'])->name('index');
|
||||
Route::get('/create', [SourceDatabaseController::class, 'create'])->name('create');
|
||||
Route::post('/', [SourceDatabaseController::class, 'store'])->name('store');
|
||||
Route::get('/{database}/edit', [SourceDatabaseController::class, 'edit'])->name('edit');
|
||||
Route::put('/{database}', [SourceDatabaseController::class, 'update'])->name('update');
|
||||
Route::delete('/{database}', [SourceDatabaseController::class, 'destroy'])->name('destroy');
|
||||
Route::get('/{database}/test', [SourceDatabaseController::class, 'testConnection'])->name('test');
|
||||
Route::post('/{database}/sync', [SourceDatabaseController::class, 'sync'])->name('sync');
|
||||
});
|
||||
|
||||
// Target Databases
|
||||
Route::prefix('databases/target')->name('databases.target.')->group(function () {
|
||||
Route::get('/', [TargetDatabaseController::class, 'index'])->name('index');
|
||||
Route::get('/create', [TargetDatabaseController::class, 'create'])->name('create');
|
||||
Route::post('/', [TargetDatabaseController::class, 'store'])->name('store');
|
||||
Route::get('/{database}/edit', [TargetDatabaseController::class, 'edit'])->name('edit');
|
||||
Route::put('/{database}', [TargetDatabaseController::class, 'update'])->name('update');
|
||||
Route::delete('/{database}', [TargetDatabaseController::class, 'destroy'])->name('destroy');
|
||||
Route::get('/{database}/test', [TargetDatabaseController::class, 'testConnection'])->name('test');
|
||||
});
|
||||
|
||||
// Schemas
|
||||
Route::prefix('schemas')->name('schemas.')->group(function () {
|
||||
Route::get('/', [SchemaController::class, 'index'])->name('index');
|
||||
Route::get('/{database}', [SchemaController::class, 'show'])->name('show');
|
||||
Route::post('/{database}/sync', [SchemaController::class, 'sync'])->name('sync');
|
||||
Route::get('/{database}/check-changes', [SchemaController::class, 'checkChanges'])->name('check-changes');
|
||||
Route::get('/tables/{table}', [SchemaController::class, 'tableDetail'])->name('table.detail');
|
||||
Route::put('/columns/{column}', [SchemaController::class, 'updateColumn'])->name('columns.update');
|
||||
Route::get('/pending-changes', [SchemaController::class, 'pendingChanges'])->name('pending-changes');
|
||||
Route::post('/changes/{change}/apply', [SchemaController::class, 'applyChange'])->name('changes.apply');
|
||||
});
|
||||
|
||||
// Migration Schedules
|
||||
Route::prefix('migrations')->name('migrations.')->group(function () {
|
||||
Route::get('/', [MigrationScheduleController::class, 'index'])->name('index');
|
||||
Route::get('/create', [MigrationScheduleController::class, 'create'])->name('create');
|
||||
Route::post('/', [MigrationScheduleController::class, 'store'])->name('store');
|
||||
Route::get('/{schedule}', [MigrationScheduleController::class, 'show'])->name('show');
|
||||
Route::get('/{schedule}/edit', [MigrationScheduleController::class, 'edit'])->name('edit');
|
||||
Route::put('/{schedule}', [MigrationScheduleController::class, 'update'])->name('update');
|
||||
Route::delete('/{schedule}', [MigrationScheduleController::class, 'destroy'])->name('destroy');
|
||||
Route::post('/{schedule}/run', [MigrationScheduleController::class, 'runNow'])->name('run');
|
||||
Route::post('/{schedule}/toggle', [MigrationScheduleController::class, 'toggle'])->name('toggle');
|
||||
});
|
||||
Reference in New Issue
Block a user