uploadFolder = "notification"; } public function index() { ResponseService::noAnyPermissionThenRedirect(['notification-list', 'notification-create', 'notification-update', 'notification-delete']); $item_list = Item::where('status', 'approved')->getNonExpiredItems()->get(); return view('notification.index', compact('item_list')); } public function store(Request $request) { ResponseService::noPermissionThenSendJson('notification-create'); $validator = Validator::make($request->all(), [ 'file' => 'image|mimes:jpeg,png,jpg', 'send_to' => 'required|in:all,selected', 'user_id' => 'required_if:send_to,selected', 'title' => 'required', 'message' => 'required', ], [ 'user_id.required_if' => __("Please select at least one user") ]); if ($validator->fails()) { ResponseService::validationError($validator->errors()->first()); } try { $get_fcm_key = CachingService::getSystemSettings('fcm_key'); if (!empty($get_fcm_key->data)) { ResponseService::errorResponse('Server FCM Key Is Missing'); } $notification = Notifications::create([ ...$request->all(), 'image' => $request->hasFile('file') ? FileService::compressAndUpload($request->file('file'), $this->uploadFolder) : '', 'user_id' => $request->send_to == "selected" ? $request->user_id : '' ]); $customBodyFields = [ 'notification_id' => $notification->id, // Add this line 'image' => $notification->image, 'item_id' => $notification->item_id, ]; $sendToAll = $request->send_to == 'all'; $userIds = $request->send_to == 'selected' ? explode(',', $request->user_id) : []; $executeJob = function () use ($request, $customBodyFields, $sendToAll, $userIds) { try { $job = new SendFcmBatchJob( $request->title, $request->message, 'notification', $customBodyFields, $sendToAll, $userIds ); $job->handle(); } catch (\Throwable $th) { Log::error('Background notification job failed', [ 'message' => $th->getMessage(), 'file' => $th->getFile(), 'line' => $th->getLine(), 'trace' => $th->getTraceAsString() ]); } }; ignore_user_abort(true); set_time_limit(0); response()->json([ 'error' => false, 'message' => trans('Notification queued successfully. It will be sent in background.'), 'data' => $notification, 'code' => config('constants.RESPONSE_CODE.SUCCESS') ])->send(); while (ob_get_level() > 0) { ob_end_flush(); } flush(); if (function_exists('fastcgi_finish_request')) { fastcgi_finish_request(); $executeJob(); } else { register_shutdown_function($executeJob); } exit(); } catch (\Throwable $th) { ResponseService::logErrorResponse($th, 'NotificationController -> store'); ResponseService::errorResponse('Something Went Wrong'); } } public function destroy($id) { try { ResponseService::noPermissionThenSendJson('notification-delete'); $notification = Notifications::findOrFail($id); $notification->delete(); FileService::delete($notification->getRawOriginal('image')); ResponseService::successResponse('Notification Deleted successfully'); } catch (Throwable $th) { ResponseService::logErrorResponse($th, 'NotificationController -> destroy'); ResponseService::errorResponse('Something Went Wrong'); } } public function show(Request $request) { ResponseService::noPermissionThenSendJson('notification-list'); $offset = $request->offset ?? 0; $limit = $request->limit ?? 10; $sort = $request->sort ?? 'id'; $order = $request->order ?? 'DESC'; $sql = Notifications::where('id', '!=', 0)->orderBy($sort, $order); if (!empty($request->search)) { $sql = $sql->search($request->search); } $total = $sql->count(); $sql->skip($offset)->take($limit); $result = $sql->get(); $bulkData = array(); $bulkData['total'] = $total; $rows = array(); foreach ($result as $key => $row) { $tempRow = $row->toArray(); $operate = ''; if (Auth::user()->can('notification-delete')) { $operate .= BootstrapTableService::deleteButton(route('notification.destroy', $row->id)); } $tempRow['operate'] = $operate; $rows[] = $tempRow; } $bulkData['rows'] = $rows; return response()->json($bulkData); } public function batchDelete(Request $request) { ResponseService::noPermissionThenSendJson('notification-delete'); try { foreach (Notifications::whereIn('id', explode(',', $request->id))->get() as $row) { $row->delete(); FileService::delete($row->getRawOriginal('image')); } ResponseService::successResponse("Notification deleted successfully"); } catch (Throwable $th) { ResponseService::logErrorResponse($th, "NotificationController -> batchDelete"); ResponseService::errorResponse(); } } }