<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Models\Newspaper;
use App\Models\NewspaperPage;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
use Intervention\Image\Facades\Image;
class PageController extends Controller
{
public function store(Request $request, Newspaper $newspaper)
{
$request->validate([
'images' => 'required|array|min:1',
'images.*' => 'required|image|mimes:jpg,jpeg,png,webp|max:20480',
]);
$startOrder = $newspaper->pages()->max('sort_order') ?? 0;
$pageNumber = $newspaper->pages()->max('page_number') ?? 0;
foreach ($request->file('images') as $index => $file) {
$pageNumber++;
$startOrder++;
$dir = 'newspapers/' . $newspaper->publish_date->format('Y-m-d');
$filename = 'page_' . $pageNumber . '_' . uniqid() . '.' . $file->getClientOriginalExtension();
$path = $file->storeAs($dir, $filename, 'public');
$thumbFilename = 'thumb_' . $filename;
$thumbPath = $dir . '/' . $thumbFilename;
try {
$img = Image::make($file)->resize(300, null, function ($c) {
$c->aspectRatio();
$c->upsize();
});
Storage::disk('public')->put($thumbPath, (string) $img->encode());
} catch (\Exception $e) {
$thumbPath = null;
}
NewspaperPage::create([
'newspaper_id' => $newspaper->id,
'page_number' => $pageNumber,
'title' => $request->input("titles.{$index}"),
'image_path' => $path,
'thumbnail_path' => $thumbPath,
'sort_order' => $startOrder,
]);
}
return redirect()->route('admin.newspapers.pages', $newspaper)
->with('success', count($request->file('images')) . ' page(s) uploaded successfully.');
}
public function destroy(NewspaperPage $page)
{
$newspaper = $page->newspaper;
if (Storage::disk('public')->exists($page->image_path)) {
Storage::disk('public')->delete($page->image_path);
}
if ($page->thumbnail_path && Storage::disk('public')->exists($page->thumbnail_path)) {
Storage::disk('public')->delete($page->thumbnail_path);
}
$page->delete();
return redirect()->route('admin.newspapers.pages', $newspaper)
->with('success', 'Page deleted.');
}
public function reorder(Request $request)
{
$request->validate(['pages' => 'required|array']);
foreach ($request->pages as $order => $pageId) {
NewspaperPage::where('id', $pageId)->update(['sort_order' => $order + 1]);
}
return response()->json(['success' => true]);
}
public function update(Request $request, NewspaperPage $page)
{
$data = $request->validate([
'title' => 'nullable|string|max:255',
'page_number' => 'required|integer|min:1',
]);
$page->update($data);
return redirect()->route('admin.newspapers.pages', $page->newspaper)
->with('success', 'Page updated.');
}
}