only([ 'keywords', 'location', 'category_id', 'job_type', 'experience_level', 'remote', 'salary_min', 'salary_max', 'posted_within', 'company', 'sort', ]); // Track search event if keywords are provided if (!empty($filters['keywords'])) { AnalyticsEvent::logEvent(AnalyticsEvent::EVENT_SEARCH, null, $filters); } $perPage = $request->input('per_page', 20); $jobs = $this->searchService->search($filters, $perPage); $categories = JobCategory::withCount('jobs')->orderBy('name')->get(); $filterOptions = $this->searchService->getFilterOptions(); return view('jobs.index', compact('jobs', 'categories', 'filterOptions', 'filters')); } /** * Display the specified job */ public function show(int $id) { $job = Job::with(['source', 'category', 'jobLocation']) ->findOrFail($id); // Track job view event AnalyticsEvent::logEvent(AnalyticsEvent::EVENT_JOB_VIEW, $job->id); $similarJobs = $this->jobRepository->getSimilarJobs($job, 5); return view('jobs.show', compact('job', 'similarJobs')); } /** * Display jobs by category */ public function category(string $slug, Request $request) { $category = JobCategory::where('slug', $slug)->firstOrFail(); // Track category view event AnalyticsEvent::logEvent(AnalyticsEvent::EVENT_CATEGORY_VIEW, null, ['category' => $category->name]); $filters = $request->only([ 'keywords', 'location', 'job_type', 'experience_level', 'remote', 'salary_min', 'salary_max', 'posted_within', 'sort', ]); $filters['category_id'] = $category->id; $perPage = $request->input('per_page', 20); $jobs = $this->searchService->search($filters, $perPage); $filterOptions = $this->searchService->getFilterOptions(); return view('jobs.category', compact('category', 'jobs', 'filterOptions', 'filters')); } /** * Display remote jobs */ public function remote(Request $request) { $filters = $request->only([ 'keywords', 'category_id', 'job_type', 'experience_level', 'salary_min', 'salary_max', 'posted_within', 'sort', ]); $filters['remote'] = true; $perPage = $request->input('per_page', 20); $jobs = $this->searchService->search($filters, $perPage); $categories = JobCategory::withCount('jobs')->orderBy('name')->get(); $filterOptions = $this->searchService->getFilterOptions(); return view('jobs.remote', compact('jobs', 'categories', 'filterOptions', 'filters')); } }