Skip to content

Commit cc3cef5

Browse files
committed
Rename and delete idea(keys)
1 parent 487301d commit cc3cef5

1 file changed

Lines changed: 169 additions & 21 deletions

File tree

app/Http/Controllers/IdeaController.php

Lines changed: 169 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,39 +2,187 @@
22

33
namespace App\Http\Controllers;
44

5-
use App\Models\IdeaKey;
5+
use App\Models\Enums\IdeaStatusEnum;
6+
use App\Models\Idea;
7+
use Illuminate\Http\Request;
68
use Orchid\Support\Facades\Toast;
79

810
class IdeaController extends Controller
911
{
10-
/**
11-
* @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View|\Illuminate\Foundation\Application|null
12-
*/
13-
public function index()
12+
public function index(Request $request)
1413
{
15-
return view('idea.index');
14+
$query = Idea::query()->with('author');
15+
16+
if ($user = $request->user()) {
17+
$query->where(function ($q) use ($user) {
18+
$q->where('status', IdeaStatusEnum::Published)
19+
->orWhere('status', IdeaStatusEnum::Implemented)
20+
->orWhere(function ($subQ) use ($user) {
21+
$subQ->where('status', IdeaStatusEnum::Proposed)
22+
->where('user_id', $user->id);
23+
});
24+
})
25+
->orderByRaw("CASE WHEN user_id = ? AND status = 'proposed' THEN 0 ELSE 1 END", [$user->id])
26+
->orderBy('votes_count', 'desc');
27+
} else {
28+
$query->whereIn('status', [IdeaStatusEnum::Published, IdeaStatusEnum::Implemented])
29+
->orderBy('votes_count', 'desc');
30+
}
31+
32+
$ideas = $query->simplePaginate(5);
33+
34+
if ($user = $request->user()) {
35+
$ideas->getCollection()->transform(function ($idea) use ($user) {
36+
$idea->user_vote = $idea->getUserVote($user);
37+
38+
return $idea;
39+
});
40+
}
41+
42+
$isTurboFrameRequest = $request->header('Turbo-Frame');
43+
44+
if (! $isTurboFrameRequest && ! $request->isMethod('POST')) {
45+
return view('ideas.index', [
46+
'ideas' => $ideas,
47+
]);
48+
}
49+
50+
return turbo_stream([
51+
turbo_stream()->removeAll('.idea-placeholder'),
52+
turbo_stream()->append('ideas-frame', view('ideas._list', [
53+
'ideas' => $ideas,
54+
])),
55+
turbo_stream()->replace('idea-more', view('ideas._pagination', [
56+
'ideas' => $ideas,
57+
])),
58+
]);
59+
}
60+
61+
public function create()
62+
{
63+
return view('ideas.edit', [
64+
'idea' => new Idea,
65+
]);
1666
}
1767

18-
/**
19-
* @return \Illuminate\Http\RedirectResponse
20-
*/
21-
public function store()
68+
public function store(Request $request)
2269
{
23-
Toast::success('Laravel Idea с 30 июля 2025 года бесплатен для всех пользователей PhpStorm.')
24-
->disableAutoHide();
70+
$this->authorize('create', Idea::class);
71+
72+
$validated = $request->validate([
73+
'title' => 'required|string|max:255',
74+
'description' => 'required|string|max:5000',
75+
]);
76+
77+
$idea = Idea::create([
78+
'title' => $validated['title'],
79+
'description' => $validated['description'],
80+
'user_id' => $request->user()->id,
81+
]);
82+
83+
$idea->load('author');
84+
$idea->user_vote = $idea->getUserVote($request->user());
85+
86+
Toast::info('Спасибо за идею! Она будет рассмотрена в ближайшее время.');
2587

26-
return redirect()->route('home');
88+
return redirect()->route('ideas.index');
2789
}
2890

29-
/**
30-
* @param \App\Models\IdeaKey $key
31-
*
32-
* @return \Illuminate\Contracts\View\View
33-
*/
34-
public function key(IdeaKey $key)
91+
public function vote(Request $request, Idea $idea)
3592
{
36-
return view('idea.key', [
37-
'key' => $key,
93+
$this->authorize('vote', $idea);
94+
95+
$validated = $request->validate([
96+
'vote' => 'required|integer|in:1',
97+
]);
98+
99+
$idea->toggleVote($request->user(), $validated['vote']);
100+
101+
$idea = $idea->fresh();
102+
$idea->user_vote = $idea->getUserVote($request->user());
103+
104+
return turbo_stream([
105+
turbo_stream()
106+
->target("idea-vote-{$idea->id}")
107+
->action('replace')
108+
->view('ideas._vote-button', [
109+
'idea' => $idea,
110+
]),
111+
]);
112+
}
113+
114+
public function search(Request $request)
115+
{
116+
$query = $request->input('q', '');
117+
$user = $request->user();
118+
119+
if (strlen($query) < 3) {
120+
$ideaQuery = Idea::query()->with('author');
121+
122+
if ($user) {
123+
$ideaQuery->where(function ($q) use ($user) {
124+
$q->where('status', IdeaStatusEnum::Published)
125+
->orWhere('status', IdeaStatusEnum::Implemented)
126+
->orWhere(function ($subQ) use ($user) {
127+
$subQ->where('status', IdeaStatusEnum::Proposed)
128+
->where('user_id', $user->id);
129+
});
130+
})
131+
->orderByRaw("CASE WHEN user_id = ? AND status = 'proposed' THEN 0 ELSE 1 END", [$user->id])
132+
->orderBy('votes_count', 'desc');
133+
} else {
134+
$ideaQuery->whereIn('status', [IdeaStatusEnum::Published, IdeaStatusEnum::Implemented])
135+
->orderBy('votes_count', 'desc');
136+
}
137+
138+
$ideas = $ideaQuery->simplePaginate(5);
139+
} else {
140+
$searchQuery = Idea::search($query);
141+
142+
if ($user) {
143+
$searchQuery->query(fn ($builder) => $builder
144+
->with('author')
145+
->where(function ($q) use ($user) {
146+
$q->where('status', IdeaStatusEnum::Published)
147+
->orWhere('status', IdeaStatusEnum::Implemented)
148+
->orWhere(function ($subQ) use ($user) {
149+
$subQ->where('status', IdeaStatusEnum::Proposed)
150+
->where('user_id', $user->id);
151+
});
152+
})
153+
->orderByRaw("CASE WHEN user_id = ? AND status = 'proposed' THEN 0 ELSE 1 END", [$user->id])
154+
->orderBy('votes_count', 'desc')
155+
);
156+
} else {
157+
$searchQuery->whereIn('status', [IdeaStatusEnum::Published, IdeaStatusEnum::Implemented])
158+
->query(fn ($builder) => $builder->with('author'))
159+
->orderBy('votes_count', 'desc');
160+
}
161+
162+
$ideas = $searchQuery->simplePaginate(5);
163+
}
164+
165+
if ($user) {
166+
$ideas->getCollection()->transform(function ($idea) use ($user) {
167+
$idea->user_vote = $idea->getUserVote($user);
168+
169+
return $idea;
170+
});
171+
}
172+
173+
return turbo_stream([
174+
turbo_stream()
175+
->target('ideas-frame')
176+
->action('replace')
177+
->view('ideas._search-results', [
178+
'ideas' => $ideas,
179+
]),
180+
turbo_stream()
181+
->target('idea-more')
182+
->action('replace')
183+
->view('ideas._pagination', [
184+
'ideas' => $ideas,
185+
]),
38186
]);
39187
}
40188
}

0 commit comments

Comments
 (0)