Files
RomhackPlaza/app/Http/Controllers/NewsController.php

138 lines
4.7 KiB
PHP
Raw Normal View History

2026-06-16 16:21:43 +02:00
<?php
namespace App\Http\Controllers;
use App\Exceptions\SubmissionException;
use App\Helpers\EntryHelpers;
use App\Http\Requests\StoreDraftRequest;
use App\Http\Requests\StoreEntryRequest;
use App\Http\Requests\StoreNewsDraftRequest;
use App\Http\Requests\StoreNewsRequest;
use App\Jobs\DeleteXenForoCommentsThread;
use App\Models\News;
use App\Services\NewsService;
2026-06-24 19:20:33 +02:00
use Artesaos\SEOTools\Facades\SEOTools;
2026-06-16 16:21:43 +02:00
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Gate;
2026-06-24 19:20:33 +02:00
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;
2026-06-16 16:21:43 +02:00
class NewsController extends Controller
{
public function index()
{
2026-06-24 19:20:33 +02:00
SEOTools::setTitle('News');
2026-06-16 16:21:43 +02:00
return view('news.index');
}
public function show(Request $request, News $news)
{
if( !\Auth::guest() )
Gate::authorize('viewAny', $news);
// Permissions.
$entryPolicy = match ($news->state) {
'pending' => 'viewPending',
'draft' => 'viewDraft',
'rejected' => 'viewRejected',
'hidden' => 'viewHidden',
'locked' => 'viewLocked',
'published' => null,
'default' => null
};
if ($entryPolicy)
Gate::authorize($entryPolicy, $news);
$comments = EntryHelpers::getLatestComments($news);
2026-06-24 19:20:33 +02:00
SEOTools::setTitle($news->title);
SEOTools::setDescription( Str::limit( $news->description , 150 ) );
SEOTools::opengraph()->addProperty('type', 'article');
if( $news->gallery->first() ){
SEOTools::opengraph()->addImage( url( Storage::url( $news->gallery->first()->image ) ) );
}
2026-06-16 16:21:43 +02:00
return view('news.show', compact('news', 'comments'));
}
public function create(Request $request)
{
$data = [
'news' => new News(),
'isEdit' => false,
'oldCategory' => old('category') ? [ old('category') ] : []
];
2026-06-24 19:20:33 +02:00
SEOTools::setTitle('Submit News');
2026-06-16 16:21:43 +02:00
return view ('news.create', $data);
}
public function edit(Request $request, News $news)
{
$data = [
'news' => $news,
'isEdit' => true,
'oldCategory' => old('category', $news->category_id) ? [ old('category', $news->category_id) ] : []
];
2026-06-24 19:20:33 +02:00
SEOTools::setTitle('Edit News');
2026-06-16 16:21:43 +02:00
return view ('news.edit', $data);
}
public function store(Request $request)
{
$request = $request->input('submit-state') === 'draft' ? app(StoreNewsDraftRequest::class) : app(StoreNewsRequest::class);
$request->validateResolved();
$service = app(NewsService::class);
try {
$entry = $service->storeNews($request);
return match ($entry->state) {
'published' => redirect()->route('news.show', ['news' => $entry->slug])->with('success', "Your entry has been published."),
'pending' => redirect()->route('home')->with('success', "Your entry has been submitted and is pending review."),
default => redirect()->route('home')->with('success', "Your entry has been saved as a draft.")
};
} catch ( SubmissionException $e ) {
return back()->withInput()->withErrors(['error' => $e->getMessage()]);
} catch ( \Exception $e ) {
return back()->withInput()->withErrors(['error' => 'Unknown error: '.$e->getMessage()]);
}
}
public function update(Request $request, News $news)
{
$request = $request->input('submit-state') === 'draft' ? app(StoreNewsDraftRequest::class) : app(StoreNewsRequest::class);
$request->validateResolved();
$service = app(NewsService::class);
try {
$news = $service->editNews($request, $news);
return match ($news->state) {
'published' => redirect()->route('news.show', ['news' => $news->slug])->with('success', "Your entry has been published."),
'pending' => redirect()->route('home')->with('success', "Your entry has been submitted and is pending review."),
default => redirect()->route('home')->with('success', "Your entry has been saved as a draft.")
};
} catch ( SubmissionException $e ) {
return back()->withInput()->withErrors(['error' => $e->getMessage()]);
} catch ( \Exception $e ) {
return back()->withInput()->withErrors(['error' => 'Unknown error: '.$e->getMessage()]);
}
}
public function destroy(Request $request, News $news)
{
if( $news->comments_thread_id )
DeleteXenForoCommentsThread::dispatch( $news->comments_thread_id );
$news->delete();
return redirect( route('news.index') )->with('success', "Entry successfully deleted.");
}
}