Migration complete
This commit is contained in:
@@ -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'))
|
||||
|
||||
@@ -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'));
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
33
app/Http/Controllers/ReviewController.php
Normal file
33
app/Http/Controllers/ReviewController.php
Normal 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()]);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -61,4 +61,10 @@ class ToolsController extends Controller
|
||||
|
||||
return view('tools.play', compact('patches', 'emuConfig'));
|
||||
}
|
||||
|
||||
public function hasher( Request $request )
|
||||
{
|
||||
return view('tools.hasher');
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
50
app/Http/Middleware/CheckXenForoUserState.php
Normal file
50
app/Http/Middleware/CheckXenForoUserState.php
Normal 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 );
|
||||
}
|
||||
}
|
||||
@@ -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.',
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
41
app/Http/Requests/StoreReviewRequest.php
Normal file
41
app/Http/Requests/StoreReviewRequest.php
Normal 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;
|
||||
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user