Skip to content

Conversation

@rnik82
Copy link
Collaborator

@rnik82 rnik82 commented Sep 24, 2025

Pull request details

Removed the duplication of the solution on the code review page and fixed the solution comparison mechanism.
For guests added "Log in to see the solution" stub.

Issues fixed

Fix two issues #1681 and #1766

Link to demo

https://hexlet-sicp-449a.onrender.com

@rnik82 rnik82 marked this pull request as draft September 24, 2025 18:41
@rnik82 rnik82 marked this pull request as ready for review September 30, 2025 12:02
</div>

@if (count($solutionsListForCurrentExercise) > 1)
@if (count($solutionsOfOtherUsers ?? []) > 0)
Copy link
Collaborator

Choose a reason for hiding this comment

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

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

</ul>
<div class="tab-content" id="pills-tabContent">
@foreach ($solutionsListForCurrentExercise as $currentSolution)
@foreach ($solutionsOfOtherUsers as $currentSolution)
Copy link
Collaborator

Choose a reason for hiding this comment

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

тут в двух местах переименовывается переменая. Но, хм странно. Ведь получается что в solutionsListForCurrentExercise - решения пользователя, у которого страницу открываем users/1/solutions - для id 1, а в other - для всех остальных. Получается, что нам нужны обе переменных, ведь мы сравниваем решение текущего пользователя и другого.

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Изначально там было два одинаковых блока с solutionsListForCurrentExercise, поэтому и дублировались решения юзера и собстенно в этом была ошибка. А я во втором блоке заменил solutionsListForCurrentExercise на solutionsOfOtherUsers, чтобы вначале показывалось решение юзера, а следом в следующем блоке решения других пользователей.
Тут в дифе показаны только мои изменения во втором блоке и не виден первый блок с solutionsListForCurrentExercise, потому что я его не трогал.

@fey
Copy link
Collaborator

fey commented Sep 30, 2025

@rnik82 давай попробуем улучшить текущую страничку. Сейчас у нас два таба и идея была в том, чтобы сравнить два решения. Свое и чужое.
Соответственно так и стоит сравнивать, - выводить решение текущего пользователя на текущей странице (допустим, слева), выводить справа - наше решение. Если мы решение для этого задания не сохраняли, можно вывести текст типа "У вас нет сохраненных решений для этого задания". Если пользователь смотрит свои решения, то просто не выводим второй таб.

Сейчас получается при любых раскладах у тебя не выводится второй таб https://hexlet-sicp-449a.onrender.com/solutions/28
https://hexlet-sicp-449a.onrender.com/solutions/31

@rnik82
Copy link
Collaborator Author

rnik82 commented Oct 1, 2025

Сейчас получается при любых раскладах у тебя не выводится второй таб https://hexlet-sicp-449a.onrender.com/solutions/28 https://hexlet-sicp-449a.onrender.com/solutions/31

@fey, странно. У меня показывает решения и юзера и других пользователей если они есть (см скрин)
Screenshot from 2025-10-01 15-30-49
Просто они сейчас одно под другим, а нужно, как я понял, сделать одно слева, другое справа. И еще решения других юзеров сейчас промаркированы как v.1, v.2, v.3, v.4, v.5, v.6 и тд. При этом решения, условно, Васи это v.1 и v.2, решения Пети это v.3, v.4, v.5, а решения Вани это v.6.

Вопрос: как лучше назвать решения других польователей? Потому что v.1, v.2, v.3... как то не очень. Может просто 1, 2, 3...?

Если мы решение для этого задания не сохраняли, можно вывести текст типа "У вас нет сохраненных решений для этого задания".

Сейчас если мы заходим в свои решения, то там показаны только те, которые мы сохранили. То есть нам просто не показывает в списке никаких других решений, в том числе тех, которые мы прорешали но не сохранили. То есть ты предлагаешь выводить в списке все, которые мы решили, не важно сохраняли или нет. Я правильно понял?

Если пользователь смотрит свои решения, то просто не выводим второй таб.

То есть тут будет не как на Хекслете, а как-то по другому? Там всегда показывает "Ваше решение" (можно пощелкать разные версии), а рядом всегда "Решение учителя". Вроде там не было такого, что ты смотришь только свои решения без решений учителя.

@rnik82 rnik82 marked this pull request as draft October 1, 2025 16:25
@rnik82 rnik82 force-pushed the fix_issue#1681 branch 3 times, most recently from 974af5a to 20a0881 Compare October 1, 2025 17:33
@fey
Copy link
Collaborator

fey commented Oct 2, 2025

Сейчас если мы заходим в свои решения, то там показаны только те, которые мы сохранили. То есть нам просто не показывает в списке никаких других решений, в том числе тех, которые мы прорешали но не сохранили. То есть ты предлагаешь выводить в списке все, которые мы решили, не важно сохраняли или нет. Я правильно понял?

не, если мы сохранили это все верно. Ведь мы не можем показать то, что не сохранили

Просто они сейчас одно под другим, а нужно, как я понял, сделать одно слева, другое справа.

Да, стоит сделать слева и справа, чтобы было удобно сравнивать. А сверху-снизу для мобилок/узких экранов.

То есть тут будет не как на Хекслете, а как-то по другому? Там всегда показывает "Ваше решение" (можно пощелкать разные версии), а рядом всегда "Решение учителя". Вроде там не было такого, что ты смотришь только свои решения без решений учителя.

Можно выводить решение учителя, но это уже можно второй версией (след пр).

@fey
Copy link
Collaborator

fey commented Oct 2, 2025

@fey, странно. У меня показывает решения и юзера и других пользователей если они есть (см скрин)

image

Открываю https://hexlet-sicp-449a.onrender.com/ru/solutions/24

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

@rnik82
Copy link
Collaborator Author

rnik82 commented Oct 2, 2025

@fey, там оказалось что есть два обработчика show, которые используют один и тот же шаблон:
https://github.com/Hexlet/hexlet-sicp/blob/main/app/Http/Controllers/SolutionController.php
и
https://github.com/Hexlet/hexlet-sicp/blob/main/app/Http/Controllers/User/SolutionController.php

Соответственно, если мы заходим, например, сюда - https://hexlet-sicp-449a.onrender.com/ru/solutions/31
то видим только Свое решение.
image

А если сюда - https://hexlet-sicp-449a.onrender.com/ru/users/11/solutions/31,
то видим свое и чужие, если они есть.
image

По хорошему, тут, наверное, два отдельных шаблона нужно делать.

Я там вчера немного изменил сам шаблон, и сделал две колонки. Код только что обновил на рендере.

@rnik82
Copy link
Collaborator Author

rnik82 commented Oct 3, 2025

@fey, наверное, без твоего мнения не обойтись.

Как я уже писал, у нас есть два обработчика, два маршрута и один шаблон.

Вот первый вариант зайти на страницу Код ревью:
Screenshot from 2025-10-03 13-25-16
Ну далее нужно провалиться в чье-то решение.

Вот второй:
Иконка человека сверху справа -> Прогресс -> Мои решения -> Далее выбрать свое сохраненное решение
Screenshot from 2025-10-03 13-41-23

Мое предложение, разделить шаблоны.
В первом случае убрать слова "Код Ревью", "Сравни свои решения", а вместо этого написать, например, "Решение" и показывать только это конкретное выбранное решение без всякого сравнения.
Во втором случае, когда мы заходим через Прогресс, оставить все как есть. Я там сделал две колонки, слева - разные версии наших решений, справа - чужие для сравнения.

Что скажешь? Или тут была совсем другая идея?

@fey
Copy link
Collaborator

fey commented Oct 3, 2025

Что скажешь? Или тут была совсем другая идея?

Давай разделим. Чемто не помню какая идея была. Может быть в ищщусаъ/ПРах есть комменты.
Точно была идея сравнивать свое решение и чужое.

@rnik82 rnik82 force-pushed the fix_issue#1681 branch 3 times, most recently from 32e682a to a70a51a Compare October 3, 2025 13:30
@rnik82 rnik82 marked this pull request as ready for review October 3, 2025 13:50
$this->authorizeResource(Solution::class, 'solution');
$this->authorizeResource(Solution::class, 'solution', [
'except' => ['show'],
]);
Copy link
Collaborator

Choose a reason for hiding this comment

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

давай сделаем здесь через only. Белые списки проще менеджерить. И если появится кастомный не ресурсный роут, то он по дефолту будет закрыт.

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Делаю 'only' => ['store', 'destroy'], вместо 'except' => ['show'] и опять получаю ошибку 403 This action is unauthorized. Хз в чем дело.

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, если нужно чтобы все работало через $this->authorizeResource в конструкторе, то проще оставить 'except' => ['show']. Если мы добавляем 'only' => ['store', 'destroy'], то не работает, так как у нас больше одного параметра в методах store и destroy (помимо solution еще есть user). Либо можно вручную в этих методах policy подключить - $this->authorize('create', Solution::class) и $this->authorize('delete', $solution). Тогда тогда тоже работает норм. Или может подскажешь что-то еще?

return view('solution.show', compact(
$solutionsOfOtherUsers = $solution->exercise
->solutions()
->where('user_id', '!=', $user->id)
Copy link
Collaborator

Choose a reason for hiding this comment

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

можно сразу whereNot использовать https://laravel.com/docs/12.x/queries#where-not-clauses


$currentExercise = $solution->exercise;

$solutionsListForCurrentExercise = $solution->exercise
Copy link
Collaborator

Choose a reason for hiding this comment

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

давай вот эту переменную переименуем сразу, тк у нас появляется две переменных с разным смыслом.
Ведь здесь не все решения для текущ упражнения.

$otherSolutionIds = $otherSolutions->pluck('id')->sort()->values()->all();

return $solutionIds === $otherSolutionIds;
});
Copy link
Collaborator

Choose a reason for hiding this comment

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

Давай уберем провери с whereHas. Без них наше тесты более гибкие, нам достаточно просто что ответ ok. А если нужно что-то проверять на странице, это можно делать системными тестами (браузерными).

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 так то, в принципе, там уже есть такой тест:

public function testShow(): void
{
    $solution = $this->user->solutions()->first();

    $response = $this->get(route('users.solutions.show', [$this->user, $solution]));
    $response->assertOk();
}

Тогда мой вообще не нужен?

Copy link
Collaborator

Choose a reason for hiding this comment

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

Давай, если так считаеш)

@rnik82 rnik82 force-pushed the fix_issue#1681 branch 2 times, most recently from 0a80bb7 to 95f3349 Compare October 7, 2025 09:59
@fey
Copy link
Collaborator

fey commented Nov 6, 2025

@rnik82 можешь зарезолвить ветки, где поправил. И почистить от закомментированного кода, потом пингануть снова, я еще раз гляну.

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