Files
bella_masala_laravel/app/Http/Controllers/CategoryController.php
2025-11-06 06:55:15 +00:00

233 lines
8.8 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Models\Category;
use App\Http\Resources\CategoryResource;
use App\Traits\ApiResponseHelper;
use App\Traits\ImageHelper;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Facades\DB;
class CategoryController extends Controller
{
use ApiResponseHelper, ImageHelper;
public function index(Request $request)
{
$perPage = $request->per_page ?? config('custom.paginationItem');
$route = $request->route();
$prefix = $route ? $route->getPrefix() : null;
$isClient = $prefix && (str_contains($prefix, '/client') || $prefix === 'client');
$query = Category::orderBy('sortingIndex', 'desc');
if ($isClient) {
$query->where('isActive', true);
}
$categories = $query->paginate($perPage);
$data = array();
$data['content'] = CategoryResource::collection($categories);
$data['pagination'] = [
'total' => $categories->total(),
'per_page' => $categories->perPage(),
'current_page' => $categories->currentPage(),
'last_page' => $categories->lastPage(),
'from' => $categories->firstItem(),
'to' => $categories->lastItem()
];
return $this->apiResponse(
true,
__('messages.categories_retrieved'),
$data
);
}
public function show($id)
{
$category = Category::find($id);
if (!$category) {
return $this->apiResponse(
false,
__('messages.category_not_found')
);
}
return $this->apiResponse(
true,
__('messages.category_retrieved'),
new CategoryResource($category)
);
}
public function store(Request $request)
{
$validator = Validator::make($request->all(), [
'title.en' => ['required', 'string'],
'title.it' => ['required', 'string'],
'description.en' => ['nullable', 'string'],
'description.it' => ['nullable', 'string'],
'sortingIndex' => ['nullable', 'integer'],
'isActive' => ['nullable', 'boolean'],
'thumbnail' => ['nullable', 'image'],
]);
if ($validator->fails()) {
return $this->apiResponse(false, $validator->errors()->first(), $validator->errors());
}
try {
DB::beginTransaction();
$category = new Category();
$category->title = $request->title;
$category->description = $request->description;
$category->sortingIndex = $request->sortingIndex ?? 0;
$category->isActive = $request->isActive ?? true;
$category->save();
if ($request->thumbnail) {
$prefix = 'category';
$thumbnailPath = $this->uploadFile($request->thumbnail, $prefix, false);
$category->thumbnail = $thumbnailPath;
$category->save();
}
DB::commit();
$category->refresh();
$data = new CategoryResource($category);
$message = __('messages.category_created');
return $this->apiResponse(true, $message, $data);
} catch (\Throwable $exception) {
DB::rollBack();
return $this->apiResponse(false, $exception->getMessage());
}
}
public function update(Request $request, $id)
{
$validator = Validator::make($request->all(), [
'title.en' => ['sometimes', 'string'],
'title.it' => ['sometimes', 'string'],
'description.en' => ['sometimes', 'string'],
'description.it' => ['sometimes', 'string'],
'sortingIndex' => ['sometimes', 'integer'],
'isActive' => ['sometimes', 'boolean'],
'thumbnail' => ['nullable', 'image'],
]);
if ($validator->fails()) {
return $this->apiResponse(false, $validator->errors()->first(), $validator->errors());
}
try {
DB::beginTransaction();
$category = Category::findOrFail($id);
if ($request->has('title')) {
$category->title = $request->title;
}
if ($request->has('description')) {
$category->description = $request->description;
}
if ($request->has('sortingIndex')) {
$category->sortingIndex = $request->sortingIndex;
}
if ($request->has('isActive')) {
$category->isActive = $request->isActive;
}
if ($request->thumbnail) {
$prefix = 'category';
$category->thumbnail = $this->updateFile($request->thumbnail, $category->thumbnail, $prefix, false);
}
$category->save();
DB::commit();
$category->refresh();
$data = new CategoryResource($category);
$message = __('messages.category_updated');
return $this->apiResponse(true, $message, $data);
} catch (\Throwable $exception) {
DB::rollBack();
return $this->apiResponse(false, $exception->getMessage());
}
}
public function destroy($id)
{
$category = Category::find($id);
if (!$category) {
return $this->apiResponse(
false,
__('messages.category_not_found')
);
}
$category->delete();
return $this->apiResponse(
true,
__('messages.category_deleted')
);
}
public function getAllData(Request $request)
{
$categories = \App\Models\Category::with('menus')->get();
$data = \App\Http\Resources\AdminCategoryWithMenusResource::collection($categories);
return $this->apiResponse(true, __('messages.categories_retrieved'), $data);
}
public function importAllData()
{
try {
$jsonPath = base_path('demo/bella_menu.json');
if (!file_exists($jsonPath)) {
return $this->apiResponse(false, 'bella_menu.json not found');
}
$json = file_get_contents($jsonPath);
$categories = json_decode($json, true);
if (!is_array($categories)) {
return $this->apiResponse(false, 'Invalid JSON structure');
}
\DB::beginTransaction();
foreach ($categories as $cat) {
// Check if category exists by both en and it title
$existingCategory = \App\Models\Category::whereJsonContains('title->en', $cat['title']['en'])
->orWhereJsonContains('title->it', $cat['title']['it'])
->first();
if ($existingCategory) {
$category = $existingCategory;
} else {
$category = new \App\Models\Category();
$category->title = $cat['title'];
$category->description = $cat['description'];
$category->sortingIndex = 0;
$category->isActive = $cat['isActive'] ?? true;
$category->thumbnail = $cat['thumbnail'] ?? null;
$category->save();
}
if (!empty($cat['menus']) && is_array($cat['menus'])) {
foreach ($cat['menus'] as $item) {
// Check if menu exists by both en and it title for this category
$exists = \App\Models\Menu::where('category_id', $category->id)
->where(function($query) use ($item) {
$query->whereJsonContains('title->en', $item['title']['en'])
->orWhereJsonContains('title->it', $item['title']['it']);
})->exists();
if ($exists) {
continue;
}
$menu = new \App\Models\Menu();
$menu->menu_id = $item['menu_id'] ?? null;
$menu->title = $item['title'];
$menu->description = $item['description'];
$menu->price = $item['price'];
$menu->image = $item['image'] ?? null;
$menu->isActive = $item['isActive'] ?? true;
$menu->category_id = $category->id;
$menu->save();
}
}
}
\DB::commit();
return $this->apiResponse(true, 'All data imported successfully');
} catch (\Throwable $e) {
\DB::rollBack();
return $this->apiResponse(false, $e->getMessage());
}
}
}