Migration complete

This commit is contained in:
2026-06-23 19:24:38 +02:00
parent 279160c1cb
commit 64b26ef059
126 changed files with 8121 additions and 221 deletions

View File

@@ -68,7 +68,7 @@ class DynamicLoadController extends Controller
public function activityFeed(Request $request): JsonResponse
{
$availableFilters = ['entries', 'news', 'messages', 'threads', 'clubs'];
$availableFilters = ['entries', 'news', 'messages', 'threads', 'clubs', 'reviews'];
$requested = $request->query('filters')
? explode(',', $request->query('filters'))

View File

@@ -50,8 +50,9 @@ class EntryController extends Controller
Gate::authorize($entryPolicy, $entry);
$comments = EntryHelpers::getLatestComments($entry);
$reviews = $entry->reviews()->orderBy('created_at', 'desc')->limit(10)->get();
return view('entries.show', compact('entry', 'section', 'comments'));
return view('entries.show', compact('entry', 'section', 'comments', 'reviews'));
}

View File

@@ -15,7 +15,7 @@ class HomeController extends Controller
public function index( Request $request ): View {
$filters = [ 'entries', 'news', 'messages', 'threads', 'clubs' ];
$filters = [ 'entries', 'news', 'messages', 'threads', 'clubs', 'reviews' ];
$cookie = $request->cookie('activity_filters');
$activeFilters = $cookie ? array_intersect( json_decode( $cookie, true ) ?? [], $filters ) : $filters;
@@ -32,6 +32,7 @@ class HomeController extends Controller
'messages' => ['label' => 'Posts', 'icon' => 'message-square'],
'threads' => ['label' => 'Threads', 'icon' => 'messages-square'],
'clubs' => ['label' => 'Clubs', 'icon' => 'balloon'],
'reviews' => ['label' => 'Reviews', 'icon' => 'star'],
];
$latestNews = News::published()->latest('created_at')->limit(5)->get();

View File

@@ -0,0 +1,33 @@
<?php
namespace App\Http\Controllers;
use App\Exceptions\SubmissionException;
use App\Http\Requests\StoreReviewRequest;
use App\Models\Entry;
use App\Services\ReviewsService;
use Illuminate\Http\Request;
class ReviewController extends Controller
{
public function __construct(private ReviewsService $services){}
public function index(){
return view('reviews.index');
}
public function store(StoreReviewRequest $request, Entry $entry)
{
try {
$this->services->storeReview( $request, $entry );
return redirect()->route('entries.show', [ 'section' => $entry->type, 'entry' => $entry ])->with('success', "Your review has been published.");
} catch ( SubmissionException $e ) {
return back()->withInput()->withErrors(['error' => $e->getMessage()]);
} catch ( \Exception $e ) {
return back()->withInput()->withErrors(['error' => 'Unknown error: '.$e->getMessage()]);
}
}
}

View File

@@ -61,4 +61,10 @@ class ToolsController extends Controller
return view('tools.play', compact('patches', 'emuConfig'));
}
public function hasher( Request $request )
{
return view('tools.hasher');
}
}

View File

@@ -0,0 +1,50 @@
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
class CheckXenForoUserState
{
/**
* Handle an incoming request.
*
* @param Closure(Request): (Response) $next
*/
public function handle(Request $request, Closure $next): Response
{
if( \Auth::guest() )
return $next($request);
if( \Auth::user()->security_lock === 'change' )
return $this->deny( $request, "Password must be changed." );
else if( \Auth::user()->security_lock === 'reset' )
return $this->deny( $request, "Password must be reset.");
if( \Auth::user()->user_state === 'valid' )
return $next($request);
else if( \Auth::user()->user_state === 'email_confirm' || \Auth::user()->user_state === 'email_confirm_edit' )
return $this->deny( $request, "You must verify your email address." );
else if( \Auth::user()->user_state === 'email_bounce' )
return $this->deny( $request, "Invalid email address." );
else if( \Auth::user()->user_state === 'rejected' )
return $this->deny( $request, "Your account is currently rejected." );
else if( \Auth::user()->user_state === 'disabled' )
return $this->deny( $request, "Your account is currently disabled." );
return $this->deny($request, "Invalid user state.");
}
private function deny(Request $request, string $reason): Response
{
if($request->expectsJson())
return \response()->json(['error' => 'forbidden', 'reason' => $reason], 403);
return response()->view('pages.user_state', [
'reason' => $reason,
], 403 );
}
}

View File

@@ -73,7 +73,7 @@ class StoreEntryRequest extends FormRequest
if( section_must_be( ['romhacks', 'lua-scripts'], $section ) ){
$rules['modifications'] = 'array|required|min:1';
$rules['modifications.*'] = 'integer|exists:modifications,id';
} else if( section_must_be( 'utilities', $section ) ){
} else if( section_must_be( ['utilities','documents'], $section ) ){
$rules['categories'] = 'array|required|min:1';
$rules['categories.*'] = 'integer|exists:categories,id';
}
@@ -85,7 +85,7 @@ class StoreEntryRequest extends FormRequest
$rules['version'] = 'required|string|max:50';
$rules['release-date'] = 'required|date';
if( section_must_not_be( 'utilities', $section ) ){
if( section_must_not_be( ['utilities', 'documents'], $section ) ){
$rules['status'] = 'required|integer|exists:statuses,id';
} else {
$rules['level'] = 'required|integer|exists:levels,id';
@@ -159,6 +159,7 @@ class StoreEntryRequest extends FormRequest
$rules['owner_user_id'] = [ 'required', 'integer', new XfUserExists ];
$rules['comments_thread_id'] = 'nullable|integer';
$rules['featured'] = 'nullable|boolean';
$rules['refresh_created_at'] = 'nullable|boolean';
}
return $rules;
@@ -167,16 +168,31 @@ class StoreEntryRequest extends FormRequest
public function messages(): array
{
return [
'entry_title.required' => 'Please provide an entry title.',
'slug.unique' => 'An entry with this title already exists. Please choose another title.',
'file_ids.required' => 'Please upload at least one file.',
'file_ids.min' => 'Please upload at least one file.',
'hashes.required' => 'Please add at least one hash.',
'hashes.min' => 'Please add at least one hash.',
'gallery.required' => 'Please add at least one screenshot.',
'gallery.min' => 'Please add at least one screenshot.',
'new-game-platform.required_without' => 'Please choose a platform for the new game.',
'new-game-genre.required_without' => 'Please choose a genre for the new game.',
'files_uuid.required' => 'Please upload at least a file.',
'files_state.required' => 'A file may be corrupted, please reupload it.',
'files_state.*.in' => 'A file state doesn\'t have a standard value.',
'entry_title.required' => 'Please enter a title.',
'modifications.required' => 'Please select at least one modification.',
'categories.required' => 'Please select at least one category.',
'system.required' => 'Please select at least one system.',
'version.required' => 'Please enter a version number.',
'release-date.required' => 'Please enter a valid release date.',
'status.required' => 'Please select a status.',
'level.required' => 'Please select an experience level.',
'description.required' => 'Please enter a description.',
'game_selection_mode.required' => 'Please select a game selection mode.',
'platform_only_id.required' => 'Please select a platform.',
'game_id.required' => 'Please select a game.',
'new-game-title.required' => 'Please enter a game title.',
'new-game-platform.required' => 'Please select a game platform.',
'new-game-genre.required' => 'Please select a game genre.',
'hashes.required' => 'Please send at least one hash.',
'languages.required' => 'Please select at least one language.',
'main-image.required' => 'Please upload a main image.',
'gallery.required' => 'Please upload at least one image for the gallery.',
'authors.required' => 'Please select at least one author.',
'new-authors.required' => 'Please select at least one author.',
'submit-state.required' => 'Please select a submit state.',
];
}
}

View File

@@ -0,0 +1,41 @@
<?php
namespace App\Http\Requests;
use Illuminate\Contracts\Validation\ValidationRule;
use Illuminate\Foundation\Http\FormRequest;
class StoreReviewRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*/
public function authorize(): bool
{
$review = $this->route('review');
if( $review )
return $this->user()->can('update', $review);
return $this->user()->can('create', '\App\Models\EntryReview');
}
/**
* Get the validation rules that apply to the request.
*
* @return array<string, ValidationRule|array<mixed>|string>
*/
public function rules(): array
{
$isEdit = (bool) $this->route('review');
$rules = [];
$rules['rating'] = 'required|numeric|min:1|max:5';
$rules['title'] = 'required|string|max:255';
$rules['description'] = 'required|string';
return $rules;
}
}