MIF_E31231623/website/wisata_web/app/Http/Controllers/API/WisataController.php

91 lines
2.7 KiB
PHP

<?php
namespace App\Http\Controllers\API;
use App\Http\Controllers\Controller;
use App\Http\Resources\DestinationResource;
use App\Models\Wisata;
use Database\Seeders\DestinationSeeder;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\Storage;
class WisataController extends Controller
{
public function index(Request $request): JsonResponse
{
$this->seedDefaultDestinationsIfEmpty();
$wisatas = Wisata::query()
->with('kategori')
->when($request->kategori_id, fn ($query, string $kategoriId) => $query->where('kategori_id', $kategoriId))
->when($request->search, function ($query, string $search): void {
$query->where(function ($query) use ($search): void {
$query->where('title', 'like', "%{$search}%")
->orWhere('location', 'like', "%{$search}%");
});
})
->latest()
->paginate((int) $request->integer('per_page', 10));
return response()->json([
'success' => true,
'message' => 'Success',
'data' => DestinationResource::collection($wisatas)->response()->getData(true)['data'],
'meta' => [
'current_page' => $wisatas->currentPage(),
'last_page' => $wisatas->lastPage(),
'per_page' => $wisatas->perPage(),
'total' => $wisatas->total(),
],
]);
}
public function show(Wisata $wisata): JsonResponse
{
$wisata->load('kategori');
return response()->json([
'success' => true,
'message' => 'Success',
'data' => new DestinationResource($wisata),
]);
}
public function uploadImage(Request $request, Wisata $wisata): JsonResponse
{
$validated = $request->validate([
'image' => ['required', 'image', 'mimes:jpg,jpeg,png,webp', 'max:4096'],
]);
unset($validated);
if ($wisata->image) {
Storage::disk('public')->delete($wisata->publicStoragePath($wisata->image));
}
$wisata->update([
'image' => Storage::disk('public')->putFile('wisata', $request->file('image')),
]);
return response()->json([
'success' => true,
'message' => 'Success',
'data' => new DestinationResource($wisata->fresh('kategori')),
]);
}
private function seedDefaultDestinationsIfEmpty(): void
{
if (Wisata::query()->exists()) {
return;
}
Artisan::call('db:seed', [
'--class' => DestinationSeeder::class,
'--force' => true,
]);
}
}