GOOD SHELL MAS BOY
Server: Apache/2.4.52 (Ubuntu)
System: Linux vmi1836763.contaboserver.net 5.15.0-130-generic #140-Ubuntu SMP Wed Dec 18 17:59:53 UTC 2024 x86_64
User: www-data (33)
PHP: 8.4.10
Disabled: NONE
Upload Files
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);
        }
    }
}