Skip to content

Commit 6862865

Browse files
committed
fix duplication of solution versions and add comparison solutions
1 parent 602f397 commit 6862865

File tree

6 files changed

+156
-56
lines changed

6 files changed

+156
-56
lines changed

app/Http/Controllers/User/SolutionController.php

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,16 @@ class SolutionController extends Controller
1717

1818
public function __construct(ActivityService $activityService)
1919
{
20-
$this->authorizeResource(Solution::class, 'solution');
20+
// $this->authorizeResource(Solution::class, 'solution', [
21+
// 'except' => ['show'],
22+
// ]);
2123
$this->activityService = $activityService;
2224
}
2325

2426
public function store(Request $request, User $user): RedirectResponse
2527
{
28+
$this->authorize('create', Solution::class);
29+
2630
$validatedData = $request->validate([
2731
'content' => 'required|string|min:1',
2832
]);
@@ -45,23 +49,30 @@ public function store(Request $request, User $user): RedirectResponse
4549

4650
public function show(User $user, Solution $solution): View
4751
{
48-
4952
$currentExercise = $solution->exercise;
5053

51-
$solutionsListForCurrentExercise = $solution->exercise
54+
$solutionsOfCurrentUser = $solution->exercise
5255
->solutions()
5356
->where('user_id', $user->id)
5457
->get();
5558

56-
return view('solution.show', compact(
59+
$solutionsOfOtherUsers = $solution->exercise
60+
->solutions()
61+
->whereNot('user_id', $user->id)
62+
->get();
63+
64+
return view('user.solution.show', compact(
5765
'currentExercise',
58-
'solutionsListForCurrentExercise',
59-
'user'
66+
'solutionsOfCurrentUser',
67+
'solutionsOfOtherUsers',
68+
'user',
6069
));
6170
}
6271

6372
public function destroy(User $user, Solution $solution): RedirectResponse
6473
{
74+
$this->authorize('delete', $solution);
75+
6576
if ($solution->delete()) {
6677
flash()->success(__('layout.flash.success'));
6778
} else {

resources/lang/en/solution.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,7 @@
1111
'code_review' => 'Code Review',
1212
'sub_title' => 'Compare your solutions',
1313
'solution_for_title' => 'Solution for Exercise :exercise',
14+
'solutions_of_others' => 'Solution of other users',
15+
'login_to_view' => 'Log in to see the solution',
16+
'please_login_to_view_solution' => 'Please log in to view the solution',
1417
];

resources/lang/ru/solution.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,7 @@
1111
'code_review' => 'Код Ревью',
1212
'sub_title' => 'Сравни свои решения',
1313
'solution_for_title' => 'Решение для упражнения :exercise',
14+
'solutions_of_others' => 'Решение других пользователей',
15+
'login_to_view' => 'Войдите чтобы увидеть решение',
16+
'please_login_to_view_solution' => 'Пожалуйста, войдите в систему для просмотра решения',
1417
];

resources/views/solution/show.blade.php

Lines changed: 9 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,21 @@
55
{{ getTitleContent(__('solution.solution_for_title', ['exercise' => $currentExercise->getFullTitle()])) }}
66
@endsection
77
@section('description'){{ $user->id }} - {{ __('solution.code_review') }} - {{ $user->name }} -
8-
{{ __('solution.exercise') }} {{ $currentExercise->getFullTitle() }}@endsection
8+
{{ __('solution.exercise') }} {{ $currentExercise->getFullTitle() }}@endsection
99

1010
@section('content')
1111

1212
<div class="d-flex flex-wrap justify-content-between mb-2 mb-lg-4">
1313
<div class="h5">
1414
<a href="{{ route('exercises.show', $currentExercise) }}">
15-
{{ __('solution.exercise') }} {{ $currentExercise->getFullTitle() }}
15+
{{ __('solution.exercise') }} {{ $currentExercise->getFullTitle() }}
1616
</div>
1717
<div class="h5">
1818
<a href="{{ route('users.show', $user) }}">{{ $user->name }}</a>
1919
</div>
2020
</div>
2121

22-
<h2 class="text-center">{{ __('solution.code_review') }}</h2>
23-
<div class="text-center h5">{{ __('solution.sub_title') }}</div>
22+
<h2 class="text-center">{{ __('solution.title_add_solution') }}</h2>
2423
<hr>
2524
<div class="row no-gutters">
2625
<div class="col-12 col-md p-2 p-lg-4">
@@ -29,14 +28,14 @@
2928
@if ($loop->first)
3029
<li class="nav-item" role="presentation">
3130
<a class="nav-link active" id="pills-{{ $currentSolution->id }}-tab" data-bs-toggle="pill"
32-
href="#pills-{{ $currentSolution->id }}" role="tab" aria-controls="pills-{{ $currentSolution->id }}"
33-
aria-selected="true">v.{{ $loop->iteration }}</a>
31+
href="#pills-{{ $currentSolution->id }}" role="tab" aria-controls="pills-{{ $currentSolution->id }}"
32+
aria-selected="true">v.{{ $loop->iteration }}</a>
3433
</li>
3534
@else
3635
<li class="nav-item" role="presentation">
3736
<a class="nav-link" id="pills-{{ $currentSolution->id }}-tab" data-bs-toggle="pill"
38-
href="#pills-{{ $currentSolution->id }}" role="tab" aria-controls="pills-{{ $currentSolution->id }}"
39-
aria-selected="true">v.{{ $loop->iteration }}</a>
37+
href="#pills-{{ $currentSolution->id }}" role="tab" aria-controls="pills-{{ $currentSolution->id }}"
38+
aria-selected="true">v.{{ $loop->iteration }}</a>
4039
</li>
4140
@endif
4241
@endforeach
@@ -45,57 +44,17 @@
4544
@foreach ($solutionsListForCurrentExercise as $currentSolution)
4645
@if ($loop->first)
4746
<div class="tab-pane fade show active" id="pills-{{ $currentSolution->id }}" role="tabpanel"
48-
aria-labelledby="pills-{{ $currentSolution->id }}-tab">
47+
aria-labelledby="pills-{{ $currentSolution->id }}-tab">
4948
@solution(['solution' => $currentSolution])
5049
</div>
5150
@else
5251
<div class="tab-pane fade show" id="pills-{{ $currentSolution->id }}" role="tabpanel"
53-
aria-labelledby="pills-{{ $currentSolution->id }}-tab">
52+
aria-labelledby="pills-{{ $currentSolution->id }}-tab">
5453
@solution(['solution' => $currentSolution])
5554
</div>
5655
@endif
5756
@endforeach
5857
</div>
5958
</div>
60-
61-
@if (count($solutionsListForCurrentExercise) > 1)
62-
<div class="d-none d-md-block border-left"></div>
63-
<div class="col p-2 p-lg-4">
64-
<ul class="nav nav-pills mb-3" id="pills-tab" role="tablist">
65-
@foreach ($solutionsListForCurrentExercise as $currentSolution)
66-
@if ($loop->first)
67-
<li class="nav-item" role="presentation">
68-
<a class="nav-link active" id="pills-{{ $currentSolution->id }}double-tab" data-bs-toggle="pill"
69-
href="#pills-{{ $currentSolution->id }}double" role="tab"
70-
aria-controls="pills-{{ $currentSolution->id }}double"
71-
aria-selected="true">v.{{ $loop->iteration }}</a>
72-
</li>
73-
@else
74-
<li class="nav-item" role="presentation">
75-
<a class="nav-link" id="pills-{{ $currentSolution->id }}double-tab" data-bs-toggle="pill"
76-
href="#pills-{{ $currentSolution->id }}double" role="tab"
77-
aria-controls="pills-{{ $currentSolution->id }}double"
78-
aria-selected="true">v.{{ $loop->iteration }}</a>
79-
</li>
80-
@endif
81-
@endforeach
82-
</ul>
83-
<div class="tab-content" id="pills-tabContent">
84-
@foreach ($solutionsListForCurrentExercise as $currentSolution)
85-
@if ($loop->first)
86-
<div class="tab-pane fade show active" id="pills-{{ $currentSolution->id }}double" role="tabpanel"
87-
aria-labelledby="pills-{{ $currentSolution->id }}double-tab">
88-
@solution(['solution' => $currentSolution])
89-
</div>
90-
@else
91-
<div class="tab-pane fade show" id="pills-{{ $currentSolution->id }}double" role="tabpanel"
92-
aria-labelledby="pills-{{ $currentSolution->id }}double-tab">
93-
@solution(['solution' => $currentSolution])
94-
</div>
95-
@endif
96-
@endforeach
97-
</div>
98-
</div>
99-
@endif
10059
</div>
10160
@endsection
Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
@extends('layouts.app')
2+
3+
@section('meta-robots', 'nofollow, noindex')
4+
@section('title')
5+
{{ getTitleContent(__('solution.solution_for_title', ['exercise' => $currentExercise->getFullTitle()])) }}
6+
@endsection
7+
@section('description'){{ $user->id }} - {{ __('solution.code_review') }} - {{ $user->name }} -
8+
{{ __('solution.exercise') }} {{ $currentExercise->getFullTitle() }}@endsection
9+
10+
@section('content')
11+
12+
@auth
13+
<div class="d-flex flex-wrap justify-content-between mb-2 mb-lg-4">
14+
<div class="h5">
15+
<a href="{{ route('exercises.show', $currentExercise) }}">
16+
{{ __('solution.exercise') }} {{ $currentExercise->getFullTitle() }}
17+
</div>
18+
<div class="h5">
19+
<a href="{{ route('users.show', $user) }}">{{ $user->name }}</a>
20+
</div>
21+
</div>
22+
23+
<h2 class="text-center">{{ __('solution.code_review') }}</h2>
24+
<div class="text-center h5">{{ __('solution.sub_title') }}</div>
25+
<hr>
26+
27+
<div class="row no-gutters mb-3">
28+
<div class="col-12 col-md-6 text-center">
29+
<h5>{{ __('solution.title_output_solution') }}</h5>
30+
</div>
31+
@if ($solutionsOfOtherUsers->isNotEmpty())
32+
<div class="col-12 col-md-6 text-center">
33+
<h5>{{ __('solution.solutions_of_others') }}</h5>
34+
</div>
35+
@endif
36+
</div>
37+
38+
<div class="row no-gutters">
39+
<div class="col-12 col-md-6 p-2 p-lg-4">
40+
<ul class="nav nav-pills mb-3" id="pills-tab" role="tablist">
41+
@foreach ($solutionsOfCurrentUser as $currentSolution)
42+
@if ($loop->first)
43+
<li class="nav-item" role="presentation">
44+
<a class="nav-link active" id="pills-{{ $currentSolution->id }}-tab" data-bs-toggle="pill"
45+
href="#pills-{{ $currentSolution->id }}" role="tab" aria-controls="pills-{{ $currentSolution->id }}"
46+
aria-selected="true">v.{{ $loop->iteration }}</a>
47+
</li>
48+
@else
49+
<li class="nav-item" role="presentation">
50+
<a class="nav-link" id="pills-{{ $currentSolution->id }}-tab" data-bs-toggle="pill"
51+
href="#pills-{{ $currentSolution->id }}" role="tab" aria-controls="pills-{{ $currentSolution->id }}"
52+
aria-selected="true">v.{{ $loop->iteration }}</a>
53+
</li>
54+
@endif
55+
@endforeach
56+
</ul>
57+
<div class="tab-content" id="pills-tabContent">
58+
@foreach ($solutionsOfCurrentUser as $currentSolution)
59+
@if ($loop->first)
60+
<div class="tab-pane fade show active" id="pills-{{ $currentSolution->id }}" role="tabpanel"
61+
aria-labelledby="pills-{{ $currentSolution->id }}-tab">
62+
@solution(['solution' => $currentSolution])
63+
</div>
64+
@else
65+
<div class="tab-pane fade show" id="pills-{{ $currentSolution->id }}" role="tabpanel"
66+
aria-labelledby="pills-{{ $currentSolution->id }}-tab">
67+
@solution(['solution' => $currentSolution])
68+
</div>
69+
@endif
70+
@endforeach
71+
</div>
72+
</div>
73+
74+
@if ($solutionsOfOtherUsers->isNotEmpty())
75+
<div class="col-12 col-md-6 p-2 p-lg-4">
76+
<div class="border-start d-none d-md-block"></div>
77+
<ul class="nav nav-pills mb-3" id="pills-tab" role="tablist">
78+
@foreach ($solutionsOfOtherUsers as $currentSolution)
79+
@if ($loop->first)
80+
<li class="nav-item" role="presentation">
81+
<a class="nav-link active" id="pills-{{ $currentSolution->id }}double-tab" data-bs-toggle="pill"
82+
href="#pills-{{ $currentSolution->id }}double" role="tab"
83+
aria-controls="pills-{{ $currentSolution->id }}double"
84+
aria-selected="true">v.{{ $loop->iteration }}</a>
85+
</li>
86+
@else
87+
<li class="nav-item" role="presentation">
88+
<a class="nav-link" id="pills-{{ $currentSolution->id }}double-tab" data-bs-toggle="pill"
89+
href="#pills-{{ $currentSolution->id }}double" role="tab"
90+
aria-controls="pills-{{ $currentSolution->id }}double"
91+
aria-selected="true">v.{{ $loop->iteration }}</a>
92+
</li>
93+
@endif
94+
@endforeach
95+
</ul>
96+
<div class="tab-content" id="pills-tabContent">
97+
@foreach ($solutionsOfOtherUsers as $currentSolution)
98+
@if ($loop->first)
99+
<div class="tab-pane fade show active" id="pills-{{ $currentSolution->id }}double" role="tabpanel"
100+
aria-labelledby="pills-{{ $currentSolution->id }}double-tab">
101+
@solution(['solution' => $currentSolution])
102+
</div>
103+
@else
104+
<div class="tab-pane fade show" id="pills-{{ $currentSolution->id }}double" role="tabpanel"
105+
aria-labelledby="pills-{{ $currentSolution->id }}double-tab">
106+
@solution(['solution' => $currentSolution])
107+
</div>
108+
@endif
109+
@endforeach
110+
</div>
111+
</div>
112+
@endif
113+
</div>
114+
@else
115+
<div class="text-center py-5">
116+
<h3>{{ __('solution.login_to_view') }}</h3>
117+
<p class="text-muted">{{ __('solution.please_login_to_view_solution') }}</p>
118+
<a href="{{ route('login') }}" class="btn btn-primary mt-3">
119+
{{ __('login.submit') }}
120+
</a>
121+
</div>
122+
@endauth
123+
@endsection

tests/Feature/Http/Controllers/User/SolutionControllerTest.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace Tests\Feature\Http\Controllers\User;
44

55
use App\Models\Solution;
6+
use App\Models\User;
67
use Database\Seeders\ChaptersTableSeeder;
78
use Database\Seeders\ExercisesTableSeeder;
89
use Tests\ControllerTestCase;

0 commit comments

Comments
 (0)