middleware('nasa.auth')->group(function () { Route::prefix('category/base')->group(function() { Route::get('', [NasaV1CategoryBaseController::class, 'index']); Route::get('detail/{id}', [NasaV1CategoryBaseController::class, 'detail']); Route::put('detail/save/{id}', [NasaV1CategoryBaseController::class, 'detailSave']); Route::delete('delete/{id}', [NasaV1CategoryBaseController::class, 'delete']); Route::get('add', [NasaV1CategoryBaseController::class, 'add']); Route::put('add/save', [NasaV1CategoryBaseController::class, 'addSave']); Route::get('clone/{id}', [NasaV1CategoryBaseController::class, 'clone']); Route::put('clone/save', [NasaV1CategoryBaseController::class, 'cloneSave']); Route::get('hit/{id}/{field}', [NasaV1CategoryBaseController::class, 'hit']); }); }); // AI editorial API: independent of legacy feed ingestion and ATOM. Route::prefix('editorial/v1')->middleware([\App\Http\Middleware\EditorialAuthentication::class, 'throttle:60,1'])->group(function () { $controller = \App\Http\Controllers\Api\Editorial\EditorialController::class; Route::get('catalog', [$controller, 'catalog']); Route::get('source-articles/{article}', [$controller, 'source'])->whereNumber('article'); Route::post('assets', [$controller, 'upload']); Route::get('assets/{sha}', [$controller, 'asset'])->where('sha', '[a-f0-9]{64}'); Route::post('drafts', [$controller, 'store']); Route::get('drafts/{draft}', [$controller, 'draft'])->whereUuid('draft'); Route::post('drafts/{draft}/publish', [$controller, 'publish'])->whereUuid('draft'); Route::get('articles/{key}', [$controller, 'article']); Route::get('articles/{key}/versions/{revision}', [$controller, 'version'])->whereNumber('revision'); Route::post('articles/{key}/rollback', [$controller, 'rollback']); Route::get('publications/{publication}', [$controller, 'receipt'])->whereUuid('publication'); Route::post('publications/{publication}/synchronize', [$controller, 'synchronize'])->whereUuid('publication'); }); Route::get('editorial/v1/preview/{draft}/{key}', [\App\Http\Controllers\Api\Editorial\EditorialController::class, 'preview']) ->middleware(['signed:relative', 'throttle:60,1'])->whereUuid('draft')->name('editorial.preview'); Route::get('editorial/v1/preview-assets/{sha}', [\App\Http\Controllers\Api\Editorial\EditorialController::class, 'asset']) ->middleware(['signed:relative', 'throttle:120,1'])->where('sha', '[a-f0-9]{64}')->name('editorial.preview-asset');