validate([ 'message' => 'required|string|min:5|max:2000', ]); $feedback = UserFeedback::create([ 'user_id' => $request->user()->id, 'sender_name' => trim(($request->user()->first_name ?? '') . ' ' . ($request->user()->last_name ?? '')) ?: null, 'sender_email' => $request->user()->email, 'source' => 'mobile_app', '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' => 'required|string|max:120', 'email' => 'required|email|max:255', ]); $feedback = UserFeedback::create([ 'user_id' => null, 'sender_name' => trim($validated['name']), 'sender_email' => trim($validated['email']), 'source' => 'landing_page', 'message' => trim($validated['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, 'sender_name' => $item->sender_name, 'sender_email' => $item->sender_email, 'source' => $item->source, '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(), ], ]); } }