File: /var/www/api.ayokah.co.uk/app/Http/Controllers/Admin/CategoryController.php
<?php
namespace App\Http\Controllers\Admin;
use App\Models\Product;
use App\Models\Category;
use Illuminate\Support\Str;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
use App\Http\Controllers\Controller;
use App\Rules\CategoryIconDimension;
use App\Rules\FeatureImageDimension;
use Illuminate\Support\Facades\Storage;
use Illuminate\Validation\ValidationException;
class CategoryController extends Controller
{
public function store(Request $request)
{
try {
$validatedData = $request->validate([
'name' => ['required', 'string', 'max:255', 'unique:categories,name'],
'parent_id' => ['nullable', 'exists:categories,id'],
'description' => ['nullable', 'string', 'max:255'],
'type' => ['required', 'string', 'max:255'],
'feature_image' => ['nullable', 'image', new FeatureImageDimension], //120 by 120px
'icon' => ['nullable', 'image', new CategoryIconDimension], //80 by 80px
]);
} catch (ValidationException $e) {
return response()->json(['status' => 'failed', 'message' => $e->getMessage()], 422);
}
try {
if ($request->has('id')) {
$category = Category::findOrFail($request->id);
$status = 'updated';
} else {
$category = new Category();
$status = 'saved';
}
$category->fill($validatedData);
$category->name = ucwords($validatedData['name']);
$category->slug = Str::slug($validatedData['name']);
if ($request->hasFile('icon')) {
$uploadedFile = $request->file('icon')->getRealPath();
$uploadResult = cloudinary()->upload($uploadedFile, ['folder' => 'categoryIcons']);
$uploadedFileUrl = $uploadResult->getSecurePath();
$category->icon = $uploadedFileUrl; // Assign the secure URL here
}
if ($request->hasFile('feature_image')) {
$uploadedFile = $request->file('feature_image')->getRealPath();
$uploadResult = cloudinary()->upload($uploadedFile, ['folder' => 'categoryImages']);
$uploadedFileUrl = $uploadResult->getSecurePath();
$category->feature_image = $uploadedFileUrl; // Assign the secure URL here
}
$category->save();
return response()->json(['status' => 'success', 'message' => 'Category ' . $status . ' successfully', 'category' => $category], 200);
} catch (\Throwable $th) {
return response()->json(['status' => 'failed', 'message' => $th->getMessage()], 500);
}
}
public function list()
{
// Retrieve all top-level categories without their children
$categories = Category::select('name', 'slug', 'id', 'icon', 'feature_image')->inRandomOrder()->limit(12)->get();
if ($categories->isNotEmpty()) {
return response()->json(['status' => 'success', 'categories' => $categories], 200);
} else {
return response()->json(['status' => 'failed', 'message' => 'No products category found'], 404);
}
}
public function browseAll()
{
$categories = Category::whereNull('parent_id')->get();
if ($categories->isNotEmpty()) {
return response()->json(['status' => 'success', 'categories' => $categories], 200);
} else {
return response()->json(['status' => 'failed', 'message' => 'No products category found', 'categories' => []], 404);
}
}
public function mainMenu()
{
$categories = Category::with('children')
->whereNull('parent_id')
->inRandomOrder()
->get(['name', 'slug', 'feature_image', 'id']);
if ($categories->isNotEmpty()) {
return response()->json(['categories' => $categories], 200);
} else {
return response()->json(['message' => 'No products category found'], 404);
}
}
public function index()
{
// Retrieve all top-level categories with their children
$categories = Category::with('children')
->whereNull('parent_id')
->latest()
->limit(40)
->get();
if ($categories) {
return response()->json(['status' => 'success', 'message' => 'Categories found', 'categories' => $categories], 200);
} else {
return response()->json(['status' => 'failed', 'message' => 'No categories found'], 404);
}
}
public function show(Request $request)
{
try {
$validatedData = $request->validate([
'category_id' => ['required', 'exists:categories,slug'],
]);
$category = Category::where('slug', $validatedData['category_id'])->first();
if (!$category) {
return response()->json(['message' => 'Category not found'], 404);
}
$id = $category->id;
$name = $category->name;
$category = Category::where('id', $id)->first();
$childCategoryIds = $category->children->pluck('id');
// Fetch products that belong to these child categories
$show_category_products = Product::whereIn('category_id', $childCategoryIds)
->inRandomOrder()
->limit(30)
->get();
if ($show_category_products->isNotEmpty()) {
return response()->json(['products' => $show_category_products, 'name' => $name], 200);
} else {
return response()->json(['message' => 'No products found in these categories'], 404);
}
} catch (\Illuminate\Validation\ValidationException $e) {
return response()->json(['message' => $e->getMessage()], 422);
}
}
public function listCatProductCount()
{
try {
$categories = Category::select('id', 'name', 'slug', 'icon', 'feature_image')->withCount('products')->inRandomOrder()->get();
return response()->json(['categories' => $categories], 200);
} catch (\Throwable $th) {
Log::alert($th->getMessage());
return response()->json(['error' => 'Unable to fetch categories'], 422);
}
}
public function delete(Request $request)
{
try {
$validatedData = $request->validate([
'id' => ['required', 'exists:categories,id'],
]);
} catch (\Illuminate\Validation\ValidationException $e) {
return response()->json(['error' => $e->errors()], 422);
}
try {
$category = Category::findOrFail($request->id);
$imagePath = str_replace('/storage/', 'public/', $category->image);
if ($category && Storage::exists($imagePath)) {
Storage::delete($imagePath);
$category->delete();
return response()->json(['message' => 'Category deleted successfully'], 200);
} else {
return response()->json(['message' => 'Category or image not found'], 404);
}
} catch (\Exception $e) {
info('Mail the admin system about this error: ' . $e->getMessage());
return response()->json(['error' => 'Internal server error occurred. Please try again later.'], 500);
}
}
}