get('per_page', 15), 100); $query = Addon::when($request->get('filter'), fn($q, $f) => $q->where('name', 'like', "%{$f}%") )->when($request->filled('type'), fn($q) => $q->where('type', $request->get('type')) )->when($request->filled('status'), fn($q) => $q->where('status', $request->boolean('status')) )->orderBy('sort_order')->orderBy('name'); if ($request->boolean('all')) { $items = $query->get(); return response()->json([ 'error' => false, 'data' => $items, ]); } $paginator = $query->paginate($perPage); return response()->json([ 'error' => false, 'data' => [ 'items' => $paginator->items(), 'total' => $paginator->total(), 'per_page' => $paginator->perPage(), 'current_page' => $paginator->currentPage(), 'last_page' => $paginator->lastPage(), ], ]); } public function show(int $id): JsonResponse { $addon = Addon::find($id); if (!$addon) { return response()->json(['error' => true, 'message' => 'Không tìm thấy addon.'], 404); } return response()->json([ 'error' => false, 'data' => $addon, ]); } public function store(Request $request): JsonResponse { $validated = $request->validate([ 'type' => ['required', 'string', Rule::in(AddonType::values())], 'code' => 'required|string|max:50|unique:product_addon,code', 'name' => 'required|string|max:100', 'prefix' => 'nullable|string|max:50', 'min' => 'required|integer|min:0', 'max' => 'required|integer|min:0', 'step' => 'required|integer|min:1', 'price' => 'required|integer|min:0', 'input_type' => ['required', 'string', Rule::in(['number', 'slider', 'select'])], 'status' => 'boolean', 'sort_order' => 'nullable|integer', ]); $addon = Addon::create($validated); return response()->json([ 'error' => false, 'message' => 'Tạo addon thành công.', 'data' => $addon, ], 201); } public function update(Request $request, int $id): JsonResponse { $addon = Addon::find($id); if (!$addon) { return response()->json(['error' => true, 'message' => 'Không tìm thấy addon.'], 404); } $validated = $request->validate([ 'type' => ['sometimes', 'required', 'string', Rule::in(AddonType::values())], 'code' => ['sometimes', 'required', 'string', 'max:50', Rule::unique('product_addon', 'code')->ignore($id)], 'name' => 'sometimes|required|string|max:100', 'prefix' => 'nullable|string|max:50', 'min' => 'sometimes|required|integer|min:0', 'max' => 'sometimes|required|integer|min:0', 'step' => 'sometimes|required|integer|min:1', 'price' => 'sometimes|required|integer|min:0', 'input_type' => ['sometimes', 'required', 'string', Rule::in(['number', 'slider', 'select'])], 'status' => 'boolean', 'sort_order' => 'nullable|integer', ]); $addon->update($validated); return response()->json([ 'error' => false, 'message' => 'Cập nhật addon thành công.', 'data' => $addon->fresh(), ]); } public function destroy(int $id): JsonResponse { $addon = Addon::find($id); if (!$addon) { return response()->json(['error' => true, 'message' => 'Không tìm thấy addon.'], 404); } $addon->delete(); return response()->json([ 'error' => false, 'message' => 'Xoá addon thành công.', ]); } public function bulkUpdateStatus(Request $request): JsonResponse { $validated = $request->validate([ 'ids' => 'required|array', 'ids.*' => 'integer', 'status' => 'required|boolean', ]); $updated = Addon::whereIn('id', $validated['ids']) ->update(['status' => $validated['status']]); $label = $validated['status'] ? 'kích hoạt' : 'ẩn'; return response()->json([ 'error' => false, 'message' => "Đã {$label} {$updated} addon.", ]); } public function bulkDestroy(Request $request): JsonResponse { $ids = $request->validate(['ids' => 'required|array', 'ids.*' => 'integer'])['ids']; $deleted = Addon::whereIn('id', $ids)->delete(); return response()->json([ 'error' => false, 'message' => "Đã xoá {$deleted} addon.", ]); } }