233 lines
8.8 KiB
PHP
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());
|
|
}
|
|
}
|
|
}
|