diff --git a/app/Console/Commands/SubmissionsDown.php b/app/Console/Commands/SubmissionsDown.php new file mode 100644 index 0000000..d36c200 --- /dev/null +++ b/app/Console/Commands/SubmissionsDown.php @@ -0,0 +1,22 @@ +info("Submissions disabled."); + } +} diff --git a/app/Console/Commands/SubmissionsUp.php b/app/Console/Commands/SubmissionsUp.php new file mode 100644 index 0000000..5fe9d15 --- /dev/null +++ b/app/Console/Commands/SubmissionsUp.php @@ -0,0 +1,22 @@ +info('Submissions enabled.'); + } +} diff --git a/app/Http/Middleware/SubmissionsEnabled.php b/app/Http/Middleware/SubmissionsEnabled.php new file mode 100644 index 0000000..08b50e7 --- /dev/null +++ b/app/Http/Middleware/SubmissionsEnabled.php @@ -0,0 +1,33 @@ +expectsJson() ){ + return response()->json([ + 'message' => 'The submissions are currently in maintenance mode.', + ], 503 ); + } + + return back()->withErrors([ + 'maintenance' => "The submissions are currently in maintenance mode.", + ])->withInput(); + } + + return $next($request); + } +} diff --git a/app/View/Components/ErrorBlock.php b/app/View/Components/ErrorBlock.php index f0bc778..d207e46 100644 --- a/app/View/Components/ErrorBlock.php +++ b/app/View/Components/ErrorBlock.php @@ -14,6 +14,10 @@ class ErrorBlock extends Component 'icon' => 'ban', 'message' => '%s' ], + 'not-found' => [ + 'icon' => 'sticky-note-off', + 'message' => "404: This page does not exist." + ], 'page-not-allowed' => [ 'icon' => 'shield-ban', 'message' => "You do not have permission to access this page.\nRequired permission: %s" @@ -21,6 +25,10 @@ class ErrorBlock extends Component 'user-state-not-valid' => [ 'icon' => 'shield-ban', 'message' => "You do not have permission to access this page.\nYour user profile is incomplete: %s\nGo back to the forum for more details." + ], + 'server-error' => [ + 'icon' => 'bomb', + 'message' => "500: Internal Server Error." ] ]; diff --git a/bootstrap/app.php b/bootstrap/app.php index 36f39a2..47d2e39 100644 --- a/bootstrap/app.php +++ b/bootstrap/app.php @@ -16,6 +16,7 @@ return Application::configure(basePath: dirname(__DIR__)) $middleware->encryptCookies(except: ['xf_session','xf_user','xf_csrf','xf_style_variation','activity_filters']); $middleware->alias([ 'xf.auth' => \App\Http\Middleware\CheckXenForoPermissions::class, + 'submissions.maintenance' => \App\Http\Middleware\SubmissionsEnabled::class, ]); $middleware->redirectGuestsTo(function(Request $request): void { if( $request->is('manage*')) @@ -24,5 +25,20 @@ return Application::configure(basePath: dirname(__DIR__)) $middleware->append(\App\Http\Middleware\CheckXenForoUserState::class); }) ->withExceptions(function (Exceptions $exceptions): void { - // + $exceptions->render(function(Throwable $e, $request) { + $statusCode = method_exists($e, 'getStatusCode') ? $e->getStatusCode() : 500; + + if( app()->environment('production') && $statusCode >= 500 && !$request->expectsJson() ){ + $errorId = (string) Str::uuid(); + + \Illuminate\Support\Facades\Log::error($e->getMessage(), [ + 'error_id' => $errorId, + 'exception' => $e, + 'url' => $request->fullUrl(), + 'user_id' => (optional($request->user())->user_id ?? 0), + ]); + + return response()->view('errors.500', ['errorId' => $errorId], 500 ); + } + }); })->create(); diff --git a/resources/views/errors/403.blade.php b/resources/views/errors/403.blade.php new file mode 100644 index 0000000..fa6fc84 --- /dev/null +++ b/resources/views/errors/403.blade.php @@ -0,0 +1,6 @@ +@extends('layouts.app') + +@section('content') + + Go back to the previous page +@endsection diff --git a/resources/views/errors/404.blade.php b/resources/views/errors/404.blade.php new file mode 100644 index 0000000..1778e29 --- /dev/null +++ b/resources/views/errors/404.blade.php @@ -0,0 +1,6 @@ +@extends('layouts.app') + +@section('content') + + Go back to the previous page +@endsection diff --git a/resources/views/errors/4xx.blade.php b/resources/views/errors/4xx.blade.php new file mode 100644 index 0000000..d8a7c2c --- /dev/null +++ b/resources/views/errors/4xx.blade.php @@ -0,0 +1,6 @@ +@extends('layouts.app') + +@section('content') + + Go back to the previous page +@endsection diff --git a/resources/views/errors/500.blade.php b/resources/views/errors/500.blade.php new file mode 100644 index 0000000..9998c2a --- /dev/null +++ b/resources/views/errors/500.blade.php @@ -0,0 +1,305 @@ + + + 500 - Internal server error - Romhack Plaza + + + + + +
+
+
+
+
500 - Internal server error
+

To resolve the issue quickly, please report it on Gitea, Discord, or the forum with the following information.

+
    +
  • Your error code: {{ $errorId ?? "" }}
  • +
  • What you were doing before the error occurred.
  • +
+
+ +
+
+
+ + diff --git a/resources/views/layouts/app.blade.php b/resources/views/layouts/app.blade.php index 79e2d1a..0d2b185 100644 --- a/resources/views/layouts/app.blade.php +++ b/resources/views/layouts/app.blade.php @@ -24,6 +24,9 @@ @if(session('error')) @endif + @if($errors->has('maintenance')) + + @endif @yield('content') diff --git a/resources/views/maintenance.blade.php b/resources/views/maintenance.blade.php new file mode 100644 index 0000000..de6f08d --- /dev/null +++ b/resources/views/maintenance.blade.php @@ -0,0 +1,299 @@ + + + 500 - Internal server error - Romhack Plaza + + + + + +
+
+
+
+
Maintenance is in progress.
+

Please wait until maintenance is complete. Follow the Discord server or the forum if this is unscheduled maintenance.

+
+ +
+
+
+ + diff --git a/routes/web.php b/routes/web.php index c1683b6..4af9471 100644 --- a/routes/web.php +++ b/routes/web.php @@ -33,14 +33,14 @@ Route::name('reviews.')->controller(ReviewController::class)->group(function () }); // SubmissionController. -Route::name('submit.')->prefix('/submit')->controller(\App\Http\Controllers\SubmissionController::class)->middleware(['xf.auth', 'can:create,\App\Models\Entry'])->group(function () { +Route::name('submit.')->prefix('/submit')->controller(\App\Http\Controllers\SubmissionController::class)->middleware(['submissions.maintenance','xf.auth', 'can:create,\App\Models\Entry'])->group(function () { Route::get('/', 'index')->name('index'); Route::get('/{section}', 'create' )->name('create') ->where([ 'section' => 'translations|romhacks|homebrew|utilities|documents|lua-scripts' ]); Route::post('/{section}', 'store' )->name('store') ->where([ 'section' => 'translations|romhacks|homebrew|utilities|documents|lua-scripts' ]); }); -Route::name('submit.')->prefix('/edit')->controller(\App\Http\Controllers\SubmissionController::class)->middleware(['xf.auth', 'can:update,entry'])->group(function () { +Route::name('submit.')->prefix('/edit')->controller(\App\Http\Controllers\SubmissionController::class)->middleware(['submissions.maintenance','xf.auth', 'can:update,entry'])->group(function () { Route::get('/{section}/{entry:id}', 'edit' )->name('edit') ->where([ 'section' => 'translations|romhacks|homebrew|utilities|documents|lua-scripts', 'entry' => '[0-9\-]+' ]); Route::post('/{section}/{entry:id}', 'update' )->name('update') @@ -54,12 +54,12 @@ Route::name('news.')->controller(\App\Http\Controllers\NewsController::class)->g Route::get('/news/', 'index' )->name('index'); Route::get('/news/{news:slug}', 'show' )->name('show')->where([ 'news' => '[a-zA-Z0-9\-_]+']); - Route::get('/submit/news', 'create' )->name('create')->middleware(['xf.auth','can:create,\App\Models\News']); - Route::post('/submit/news', 'store' )->name('store')->middleware(['xf.auth','can:create,\App\Models\News']); + Route::get('/submit/news', 'create' )->name('create')->middleware(['submissions.maintenance','xf.auth','can:create,\App\Models\News']); + Route::post('/submit/news', 'store' )->name('store')->middleware(['submissions.maintenance','xf.auth','can:create,\App\Models\News']); - Route::get('/edit/news/{news:id}', 'edit')->name('edit')->where(['news' => '[0-9\-]+'])->middleware(['xf.auth','can:update,news']); - Route::post('/edit/news/{news:id}', 'update')->name('update')->where(['news' => '[0-9\-]+'])->middleware(['xf.auth','can:update,news']); - Route::delete('/edit/news/{news:id}', 'destroy')->name('destroy')->where(['news' => '[0-9\-]+'])->middleware(['xf.auth','can:update,news']); + Route::get('/edit/news/{news:id}', 'edit')->name('edit')->where(['news' => '[0-9\-]+'])->middleware(['submissions.maintenance','xf.auth','can:update,news']); + Route::post('/edit/news/{news:id}', 'update')->name('update')->where(['news' => '[0-9\-]+'])->middleware(['submissions.maintenance','xf.auth','can:update,news']); + Route::delete('/edit/news/{news:id}', 'destroy')->name('destroy')->where(['news' => '[0-9\-]+'])->middleware(['submissions.maintenance','xf.auth','can:update,news']); }); // QueueController @@ -67,32 +67,32 @@ Route::name('queue.')->prefix('/queue')->controller(\App\Http\Controllers\QueueC Route::get('/', 'index' )->name('index'); Route::patch('/{entry:id}/comment', 'updateComment' ) - ->middleware(['xf.auth', 'can:updateComment,entry' ] ) + ->middleware(['submissions.maintenance','xf.auth', 'can:updateComment,entry' ] ) ->where([ 'entry' => '[0-9\-]+' ]) ->name('comment'); Route::patch('/{entry:id}/approve', 'approve' ) - ->middleware(['xf.auth', 'can:approve,entry' ] ) + ->middleware(['submissions.maintenance','xf.auth', 'can:approve,entry' ] ) ->where([ 'entry' => '[0-9\-]+' ]) ->name('approve'); Route::patch('/{entry:id}/reject', 'reject' ) - ->middleware(['xf.auth', 'can:reject,entry' ] ) + ->middleware(['submissions.maintenance','xf.auth', 'can:reject,entry' ] ) ->where([ 'entry' => '[0-9\-]+' ]) ->name('reject'); Route::patch('/news/{news:id}/comment', 'updateComment_news' ) - ->middleware(['xf.auth', 'can:updateComment,news' ] ) + ->middleware(['submissions.maintenance','xf.auth', 'can:updateComment,news' ] ) ->where([ 'news' => '[0-9\-]+' ]) ->name('news.comment'); Route::patch('/news/{news:id}/approve', 'approve_news' ) - ->middleware(['xf.auth', 'can:approve,news' ] ) + ->middleware(['submissions.maintenance','xf.auth', 'can:approve,news' ] ) ->where([ 'news' => '[0-9\-]+' ]) ->name('news.approve'); Route::patch('/news/{news:id}/reject', 'reject_news' ) - ->middleware(['xf.auth', 'can:reject,news' ] ) + ->middleware(['submissions.maintenance','xf.auth', 'can:reject,news' ] ) ->where([ 'news' => '[0-9\-]+' ]) ->name('news.reject'); });