validate([ 'message' => 'required|string|min:5|max:2000', ]); $feedback = UserFeedback::create([ 'user_id' => $request->user()->id, 'message' => $validated['message'], ]); return response()->json([ 'message' => 'Feedback sent successfully', 'data' => [ 'id' => $feedback->id, 'created_at' => $feedback->created_at, ], ], 201); } // CREATE FEEDBACK (public landing page) public function storePublic(Request $request) { $validated = $request->validate([ 'message' => 'required|string|min:5|max:2000', 'name' => 'nullable|string|max:120', 'email' => 'nullable|email|max:255', ]); $details = []; if (! empty($validated['name'])) { $details[] = 'Name: ' . trim($validated['name']); } if (! empty($validated['email'])) { $details[] = 'Email: ' . trim($validated['email']); } $message = trim($validated['message']); if (! empty($details)) { $message .= "\n\n[Landing Page]\n" . implode("\n", $details); } else { $message .= "\n\n[Landing Page]"; } $feedback = UserFeedback::create([ 'user_id' => null, 'message' => $message, ]); return response()->json([ 'message' => 'Feedback sent successfully', 'data' => [ 'id' => $feedback->id, 'created_at' => $feedback->created_at, ], ], 201); } // LIST FEEDBACK (admin) public function adminIndex(Request $request) { @set_time_limit(120); $validated = $request->validate([ 'per_page' => 'nullable|integer|min:1|max:100', ]); $perPage = $validated['per_page'] ?? 20; $paginator = UserFeedback::query() ->with(['user:id,first_name,last_name,email']) ->orderByDesc('id') ->paginate($perPage); $data = collect($paginator->items())->map(function (UserFeedback $item) { return [ 'id' => $item->id, 'message' => $item->message, 'created_at' => $item->created_at, 'user' => [ 'id' => $item->user?->id, 'first_name' => $item->user?->first_name, 'last_name' => $item->user?->last_name, 'email' => $item->user?->email, ], ]; }); return response()->json([ 'data' => $data, 'meta' => [ 'current_page' => $paginator->currentPage(), 'per_page' => $paginator->perPage(), 'total' => $paginator->total(), 'last_page' => $paginator->lastPage(), ], ]); } }