Files
portal-api/modules/Lead/App/Http/Controllers/Api/Admin/LeadController.php
T

102 lines
4.1 KiB
PHP

<?php
namespace Modules\Lead\App\Http\Controllers\Api\Admin;
use App\Http\Controllers\Controller;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Validation\Rule;
use Modules\Lead\App\Http\Requests\LeadRequest;
use Modules\Lead\App\Http\Resources\LeadResource;
use Modules\Lead\App\Models\Lead;
class LeadController extends Controller
{
public function index(Request $request): JsonResponse
{
$request->validate(['date_from' => 'nullable|date', 'date_to' => 'nullable|date']);
$leads = Lead::query()
->with('customer:id,uuid,fullname,email')
->search($request->input('filter'))
->when($request->filled('status'), fn ($query) => $query->where('status', $request->input('status')))
->when($request->filled('source'), fn ($query) => $query->where('source', $request->input('source')))
->when($request->input('linked') === '1', fn ($query) => $query->whereNotNull('customer_id'))
->when($request->input('linked') === '0', fn ($query) => $query->whereNull('customer_id'))
->when($request->filled('date_from'), fn ($query) => $query->whereDate('created_at', '>=', $request->input('date_from')))
->when($request->filled('date_to'), fn ($query) => $query->whereDate('created_at', '<=', $request->input('date_to')))
->orderByDesc('id')
->paginate(min(max((int) $request->input('per_page', 20), 1), 100));
return response()->json([
'error' => false,
'data' => [
'items' => LeadResource::collection($leads->items()),
'total' => $leads->total(),
'per_page' => $leads->perPage(),
'current_page' => $leads->currentPage(),
'last_page' => $leads->lastPage(),
],
]);
}
public function show(string $uuid): JsonResponse
{
return response()->json(['error' => false, 'data' => new LeadResource($this->find($uuid)->load('customer:id,uuid,fullname,email'))]);
}
public function store(LeadRequest $request): JsonResponse
{
$lead = Lead::create($request->validated());
return response()->json(['error' => false, 'message' => 'Đã thêm khách tiềm năng.', 'data' => new LeadResource($lead->load('customer:id,uuid,fullname,email'))], 201);
}
public function update(string $uuid, LeadRequest $request): JsonResponse
{
$lead = $this->find($uuid);
$lead->update($request->validated());
return response()->json(['error' => false, 'message' => 'Đã cập nhật khách tiềm năng.', 'data' => new LeadResource($lead->load('customer:id,uuid,fullname,email'))]);
}
public function destroy(string $uuid): JsonResponse
{
$this->find($uuid)->delete();
return response()->json(['error' => false, 'message' => 'Đã xoá khách tiềm năng.']);
}
public function bulkDestroy(Request $request): JsonResponse
{
$uuids = $this->bulkUuids($request);
$deleted = Lead::query()->whereIn('uuid', $uuids)->delete();
return response()->json(['error' => false, 'message' => "Đã xoá {$deleted} khách tiềm năng.", 'data' => ['affected' => $deleted]]);
}
public function bulkStatus(Request $request): JsonResponse
{
$status = $request->validate(['status' => ['required', Rule::in(Lead::STATUSES)]])['status'];
$updated = Lead::query()->whereIn('uuid', $this->bulkUuids($request))->update(['status' => $status, 'updated_at' => now()]);
return response()->json(['error' => false, 'message' => "Đã cập nhật trạng thái cho {$updated} khách tiềm năng.", 'data' => ['affected' => $updated]]);
}
/**
* @return array<int, string>
*/
private function bulkUuids(Request $request): array
{
return $request->validate([
'uuids' => ['required', 'array', 'min:1', 'max:500'],
'uuids.*' => ['required', 'string', 'max:36'],
])['uuids'];
}
private function find(string $uuid): Lead
{
return Lead::query()->where('uuid', $uuid)->firstOrFail();
}
}