File: //var/www/quadcode-jobs/app/Http/Controllers/Controller.php
<?php
namespace App\Http\Controllers;
use App\Helpers\CollectionHelper;
use App\Models\Vacancy;
use App\Repositories\CategoryRepository;
use App\Repositories\LocationRepository;
use App\Repositories\VacancyRepository;
use Illuminate\Contracts\Foundation\Application;
use Illuminate\Contracts\View\Factory;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller as BaseController;
use Illuminate\View\View;
class Controller extends BaseController
{
use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
public function index(Request $request): Factory|View|Application|JsonResponse
{
$filters = ['categories' => [], 'locations' => []];
$filterUri = [];
$vacanciesQuery = Vacancy::query()->where('state', VacancyRepository::STATE_PUBLISHED);
if ($request->has('location')) {
$value = $request->get('location');
if (!is_array($value)) {
$value = [$value];
}
$value = array_filter($value, fn($item) => is_numeric($item) && $item !== '0');
if (!empty($value)) {
$vacanciesQuery->whereHas('locations', function ($query) use ($value) {
$query->whereIn('lever_locations.id', $value);
});
$filters['locations'] = LocationRepository::getListByIds($value);
if ($filters['locations']->count()) {
$filterUri['location'] = $filters['locations']->keys()->toArray();
}
}
}
if ($request->has('category')) {
$value = $request->get('category');
if (!is_array($value)) {
$value = [$value];
}
$value = array_filter($value, fn($item) => is_numeric($item) && $item !== '0');
if (!empty($value)) {
$vacanciesQuery->whereIn('category_id', $value);
$filters['categories'] = CategoryRepository::getListByIds($value);
if ($filters['categories']->count()) {
$filterUri['category'] = $filters['categories']->keys()->toArray();
}
}
}
if ($request->has('keywords') && !empty($request->get('keywords'))) {
$fields = ['title'];
$keywords = '%' . trim(htmlspecialchars($request->get('keywords'))) . '%';
$vacanciesQuery->where(function ($query) use ($fields, $keywords) {
foreach ($fields as $field) {
$query->orWhere($field, 'ilike', $keywords);
}
});
}
$pageSize = 10;
$vacancies = CollectionHelper::paginate($vacanciesQuery->get(), $pageSize);
if ($request->ajax()) {
return response()->json($vacancies);
}
$responseData = [
'vacancies' => $vacancies,
'filters' => $filters,
'filterUri' => $filterUri,
];
if (!empty($request->get('from'))) {
$responseData['modalTitle'] = __('Close this popup to see all open vacancies.');
}
return view('site.jobs', $responseData);
}
}