json([ 'error' => false, 'data' => PopupBanner::orderBy('sort_order')->orderBy('id')->get(), 'types' => PopupBanner::TYPES, ]); } public function store(Request $request): JsonResponse { $data = $this->validated($request, true); $data['image_path'] = $request->file('image')->store('popup-banners', PopupBanner::DISK); return response()->json([ 'error' => false, 'message' => 'Đã thêm popup.', 'data' => PopupBanner::create($data), ], 201); } public function update(Request $request, int $id): JsonResponse { $popup = PopupBanner::findOrFail($id); $data = $this->validated($request, false); $oldImage = null; if ($request->hasFile('image')) { $oldImage = $popup->image_path; $data['image_path'] = $request->file('image')->store('popup-banners', PopupBanner::DISK); } $popup->update($data); if ($oldImage) { Storage::disk(PopupBanner::DISK)->delete($oldImage); } return response()->json([ 'error' => false, 'message' => 'Đã cập nhật popup.', 'data' => $popup->fresh(), ]); } public function destroy(int $id): JsonResponse { $popup = PopupBanner::findOrFail($id); $popup->delete(); Storage::disk(PopupBanner::DISK)->delete($popup->image_path); return response()->json(['error' => false, 'message' => 'Đã xoá popup.']); } /** * @return array */ private function validated(Request $request, bool $creating): array { $data = $request->validate([ 'title' => 'required|string|max:150', 'type' => ['required', Rule::in(array_keys(PopupBanner::TYPES))], 'image' => [$creating ? 'required' : 'nullable', 'file', 'mimes:jpg,jpeg,png,webp,gif', 'max:5120'], 'link_url' => ['nullable', 'string', 'max:255', 'regex:' . ClientMenu::HREF_PATTERN], 'open_in_new_tab' => 'boolean', 'is_active' => 'boolean', 'starts_at' => 'nullable|date', 'ends_at' => 'nullable|date|after_or_equal:starts_at', 'sort_order' => 'integer|min:0|max:65535', ]); unset($data['image']); return $data; } }