/
denispirit
/
otbor
Обзор
Документация
Войти
/
denispirit
/
otbor
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
app/Http/Controllers/AdController.php
151 строка
9 KB
denispirit
Final наверное
14 фев 2025, 14:13
14 фев 2025, 14:13
5b40404
Код
Авторство
О чём код?
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Models\Ad; use App\Models\Category; use Illuminate\Support\Facades\Auth; class AdController extends Controller { // Объявляем метод index, который отвечает за отображение списка объявлений public function index() // Начало метода index { // Если пользователь администратор (email = admin@admin.com), показываем все объявления, // иначе – только активные объявления для обычных пользователей и гостей. if (Auth::check() && Auth::user()->email === 'admin@admin.com') { $ads = Ad::with('user')->latest()->paginate(10); } else { $ads = Ad::with('user')->where('is_active', true)->latest()->paginate(10); } // Возвращаем представление 'ads.index' и передаем ему переменную $ads для отображения списка объявлений return view('ads.index', compact('ads')); } // Конец метода index // Объявляем метод show, который отвечает за отображение конкретного объявления public function show(Ad $ad) // Метод show принимает экземпляр объявления $ad через привязку модели { // Если объявление не активно и пользователь не является ни владельцем, ни администратором, // то объявление считается недоступным. if (!$ad->is_active && !(Auth::check() && (Auth::user()->email === 'admin@admin.com' || Auth::id() === $ad->user_id))) { abort(404); } // Возвращаем представление 'ads.show' и передаем ему переменную $ad для отображения деталей объявления return view('ads.show', compact('ad')); } // Конец метода show // Объявляем метод search для поиска объявлений по переданному запросу public function search(Request $request) // Метод search принимает объект запроса $request { // Получаем поисковую строку из запроса $query = $request->input('query'); // Формируем запрос для поиска по заголовку и описанию $adsQuery = Ad::where(function($q) use ($query) { $q->where('title', 'like', "%$query%") ->orWhere('description', 'like', "%$query%"); }); // Если пользователь не является администратором, добавляем условие: объявление должно быть активным if (!(Auth::check() && Auth::user()->email === 'admin@admin.com')) { $adsQuery->where('is_active', true); } // Получаем результаты с пагинацией $ads = $adsQuery->paginate(10); // Возвращаем представление 'ads.index' и передаем найденные объявления через переменную $ads return view('ads.index', compact('ads')); } // Конец метода search // Объявляем метод create для отображения формы создания нового объявления public function create() // Начало метода create { $categories = Category::all(); // Получаем все категории из базы данных return view('ads.create', compact('categories')); } // Конец метода create // Объявляем метод store для сохранения нового объявления в базе данных public function store(Request $request) // Метод store принимает объект запроса $request { // Валидация данных $validated = $request->validate([ 'title' => 'required|string|max:255', 'description' => 'required|string', 'category_id' => 'required|exists:categories,id', 'image' => 'required|image|mimes:jpeg,png|max:2048' ]); // Сохранение изображения $imagePath = $request->file('image')->store('ads', 'public'); // Создание объявления Ad::create([ 'title' => $request->title, 'description' => $request->description, 'category_id' => $request->category_id, 'user_id' => Auth::id(), 'image_path' => $imagePath, 'is_active' => true ]); return redirect()->route('ads.index')->with('success', 'Объявление успешно создано!'); } // Конец метода store // Объявляем метод myAds для отображения объявлений, созданных текущим пользователем public function myAds() // Начало метода myAds { $ads = Ad::where('user_id', Auth::id()) ->latest() ->paginate(10); // Возвращаем представление 'ads.my' и передаем ему переменную $ads для отображения объявлений пользователя return view('ads.my', compact('ads')); } // Конец метода myAds // Объявляем метод toggleStatus для переключения статуса объявления (активное/неактивное) public function toggleStatus(Ad $ad) // Метод toggleStatus принимает объект объявления $ad через привязку модели { /* Проверяем: - Если текущий пользователь является владельцем объявления, либо - Если текущий пользователь является администратором (email = admin@admin.com), то разрешаем изменение статуса. */ if (!(Auth::check() && (Auth::user()->email === 'admin@admin.com' || $ad->user_id === Auth::id()))) { abort(403, 'Unauthorized action.'); } // Переключаем логическое значение статуса объявления $ad->is_active = !$ad->is_active; $ad->save(); // Если пользователь – администратор, перенаправляем назад, иначе – на страницу "Мои объявления" if (Auth::check() && Auth::user()->email === 'admin@admin.com') { return redirect()->back()->with('success', 'Статус объявления успешно изменен'); } return redirect()->route('ads.my')->with('success', 'Статус объявления успешно изменен'); } // Конец метода toggleStatus // Новый метод для получения списка объявлений в формате JSON (только для администратора) public function adsJson() { // Проверяем, что текущий пользователь аутентифицирован и является администратором if (! (Auth::check() && Auth::user()->email === 'admin@admin.com')) { abort(403, 'Access denied.'); } // Получаем объявления с связанными категориями и пользователями $ads = Ad::with(['category', 'user'])->get(); // Трансформируем данные согласно требуемому формату JSON API $result = $ads->map(function($ad) { return [ 'id' => $ad->id, 'title' => $ad->title, 'description' => $ad->description, 'category' => $ad->category->name ?? null, 'image' => $ad->image ?? '../unloads/default.png', // Если изображение отсутствует — используем значение по умолчанию 'email' => $ad->user->email, ]; }); // Возвращаем JSON-ответ с результатами и опцией JSON_UNESCAPED_SLASHES для неэкранированных слешей return response()->json($result, 200, [], JSON_UNESCAPED_SLASHES); } }