Skip to content

Conversation

ddm14159
Copy link
Collaborator

  1. Сделал админку (просмотр юзеров, комментариев, решений)
  2. Добавил признак is_admin в таблицу юзеров
  3. Админские роуты открыл для админа + дал ему все права в policy

@ddm14159
Copy link
Collaborator Author

развернул ветку на https://hexlet-sicp-aakz.onrender.com/ru
админский юзер - admin@test.com | sCUg9bp2Na14

@ddm14159 ddm14159 marked this pull request as ready for review September 29, 2025 09:22

if (!empty($userId)) {
$query->where('user_id', $userId);
}
Copy link
Collaborator

@fey fey Sep 30, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

для таких вещей (и ниже) нужно сразу использовать Spatie\QueryBuilder

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

поправил тут и в app/Http/Controllers/Admin/SolutionController.php

->where('commentable_id', $commentableId);
}

$comments = $query->orderBy('created_at', 'desc')->paginate(50);
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Давай сразу добавим scope latest() в модель и его используем, чтоыб вручную orderby не прописывать каждый рза.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

он в билдере есть, взял оттуда

use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;

class AdminMiddleware
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Здесь лучше всего использовать policy для определения прав доступа. Тогда вся логика авторизации будет в одном месте. Есть еще гейты, но честно скажу, я с ними почти что не работал.
https://laravel.com/docs/12.x/authorization

Для единообразия можно определить одну полиси для всей админки, там метод типа access, и использовать ее. ну и доступ кмк лучше определить внутри контроллера/методов, а не в мидлваре, тогда вся логика будет в одном месте и поток выполнения более явный, чем с мидлварой.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

переделал на гейт. с полиси там как будто не так удобно, мы же не с моделью работаем

@fey
Copy link
Collaborator

fey commented Sep 30, 2025

развернул ветку на https://hexlet-sicp-aakz.onrender.com/ru
админский юзер - admin@test.com | sCUg9bp2Na14

Эти учетные данные не соответствуют нашим записям.

@ddm14159
Copy link
Collaborator Author

добавил снова юзера, у нас там база чистится каждый раз при деплоях

@ddm14159
Copy link
Collaborator Author

поправил сиды и дев-логин, теперь сразу создается админский юзер
https://hexlet-sicp-aakz.onrender.com/ru
админский юзер - admin@test.com| password

@fey
Copy link
Collaborator

fey commented Sep 30, 2025

По админке. Выглядит сложно) Давай упрощать. Во первых перенести навигацию с верха в бок. Верстку навигации можно из раздела профиля/настроек взять. Основные данные - также в таблице.

Таблицу сильно проще можно сделать.

Смотри к примеру какая админка в hexlet-cv. Аватарки админу, картинки не нужны, колво решений и упражнений тоже. Максимально просто - имя, емейл, роль (админ или нет), дата регистрации, айди, может чето еще (потом будут кнопки действия, детального просмотра)/

image

Вот эти штуки - спорно. Админка это такая вещь, где интерфейс максимлаьно топорный. Например выбор-фильтрация сущностей может выполняться черзео обычную форму с фильтрами (которую можно потом добавить). И из этого и так понятно будет, что мы смотрим комментарии конкретного пользователя. Давай постепенно удалим лишнее
image

В итоге должны 3 простых тиовых страницы, которые можно легко копирнуть и использовать для нового раздела.

->appends($request->query());

$userId = $request->input('filter.user_id');
$user = $userId ? User::find($userId) : null;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

а что это за юзер?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

использовал для вьюхи, если смотрим по конкретному юзеру. убрал

public function devLogin()
{
$user = User::first();
$user = User::where(['is_admin' => true])->first();
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

можно в модель добавить скопу admin() для выбора админов.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

добавил

<div>
<div>
<a href="{{ route('users.show', $user) }}">
<strong>{{ $user->name ?: __('admin.not_available') }}</strong>
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

мне кажется ситуации когда нет имени не может быть.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

убрал

@ddm14159 ddm14159 force-pushed the #1706/add-admin-panel branch from cd92228 to 61eeecc Compare October 1, 2025 08:06
@ddm14159 ddm14159 force-pushed the #1706/add-admin-panel branch from 61eeecc to 19c2158 Compare October 1, 2025 08:11
@ddm14159
Copy link
Collaborator Author

ddm14159 commented Oct 1, 2025

Обновил страницы + добавил простые формы для фильтрации
image

<a href="{{ route('exercises.show', $comment->commentable) }}">
<strong>{{ $comment->getCommentableName() }}</strong>
</a>
@endif
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

тут можно еще проще сделать, без ифа.
Может быть есть хелпер, может нет (можно создать) аля getCommentableUrl, который будет внутри себя прятать ссылку и содержать логику по получению урла.

</td>
<td>
<span class="text-break">{{ $user->email }}</span>
@if($user->email_verified_at)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

давай без ифа, просто выводить как есть.
Админка это та вещь, где проще, тем лучше. Тем более с иконками, если их будет сильно много - будет сильно шумно визуально =)

Т.е. можно тупо тексты выводить, наллы, true/false и прочь - это нормально.

public function __construct()
{
$this->middleware('can:access-admin');
}
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

можно создать родительский контроллер Admin\Controller, и в нем определить это правило, тогда при добавлении новых секций не придется конструктор дублировать.

пример из рельс

https://github.com/hexlet-basics/hexlet-basics/blob/main/app/controllers/web/admin/application_controller.rb

@fey
Copy link
Collaborator

fey commented Oct 3, 2025

В принципе мне все ок, тут можно например тестировщиков просить кейсов добавить. И потом мержить @marentsov
По след итерации в админке я напишу в ищщус

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants