|
8 | 8 | use App\Models\ResourceEdits; |
9 | 9 | use App\Models\ResourceReview; |
10 | 10 | use App\Services\CommentService; |
| 11 | +use App\Services\ComputerScienceResourceFilter; |
11 | 12 | use App\Services\ResourceReviewService; |
12 | 13 | use App\Services\SortingManagers\GeneralVotesSortingManager; |
13 | 14 | use App\Services\SortingManagers\ResourceSortingManager; |
@@ -40,151 +41,15 @@ function __construct( |
40 | 41 | /** |
41 | 42 | * Display a listing of the resource. |
42 | 43 | */ |
43 | | - public function index(Request $request) |
| 44 | + public function index(Request $request, ComputerScienceResourceFilter $filterService) |
44 | 45 | { |
45 | 46 | $query = ComputerScienceResource::query(); |
46 | 47 |
|
47 | | - // Eager load relations |
48 | | - $query->with(['tags', 'votes', 'upvoteSummary', 'reviewSummary', 'commentsCountRelationship']); |
| 48 | + // Apply all filters and sorting |
| 49 | + $filters = $request->query(); |
| 50 | + $query = $filterService->applyFilters($query, $filters); |
49 | 51 |
|
50 | | - $validator = Validator::make( |
51 | | - [ |
52 | | - 'name' => $request->query('name'), |
53 | | - 'description' => $request->query('description'), |
54 | | - 'platforms' => $request->query('platforms'), |
55 | | - 'difficulty' => $request->query('difficulty'), |
56 | | - 'pricing' => $request->query('pricing'), |
57 | | - 'topics' => $request->query('topics'), |
58 | | - 'programming_languages' => $request->query('programming_languages'), |
59 | | - 'general_tags' => $request->query('general_tags'), |
60 | | - |
61 | | - 'community_rating' => $request->query('community_rating'), |
62 | | - 'teaching_clarity' => $request->query('teaching_clarity'), |
63 | | - 'engagement' => $request->query('engagement'), |
64 | | - 'practicality' => $request->query('practicality'), |
65 | | - 'user_friendliness' => $request->query('user_friendliness'), |
66 | | - 'updates' => $request->query('updates'), |
67 | | - ], |
68 | | - [ |
69 | | - 'name' => ['nullable', 'string', 'max:100'], |
70 | | - 'name' => ['nullable', 'string', 'max:1000'], |
71 | | - 'platforms' => ['nullable', 'array', 'min:1'], |
72 | | - 'platforms.*' => ['required', 'distinct', 'string', Rule::in(config('computerScienceResource.platforms'))], |
73 | | - 'difficulty' => ['nullable', 'string', Rule::in(config('computerScienceResource.difficulties'))], |
74 | | - 'pricing' => ['nullable', 'string', Rule::in(config('computerScienceResource.pricings'))], |
75 | | - |
76 | | - 'topic_tags' => ['nullable', 'array', 'min:3'], |
77 | | - 'topic_tags.*' => ['required', 'distinct', 'string', 'max:50'], |
78 | | - |
79 | | - 'general_tags' => ['nullable', 'array'], |
80 | | - 'general_tags.*' => ['required', 'distinct', 'string', 'max:50'], |
81 | | - 'programming_language_tags' => ['nullable', 'array'], |
82 | | - 'programming_language_tags.*' => ['required', 'distinct', 'string', 'max:50'], |
83 | | - |
84 | | - 'community_rating' => ['nullable', 'integer', 'between:1,4'], |
85 | | - 'teaching_clarity' => ['nullable', 'integer', 'between:1,4'], |
86 | | - 'engagement' => ['nullable', 'integer', 'between:1,4'], |
87 | | - 'practicality' => ['nullable', 'integer', 'between:1,4'], |
88 | | - 'user_friendliness' => ['nullable', 'integer', 'between:1,4'], |
89 | | - 'updates' => ['nullable', 'integer', 'between:1,4'], |
90 | | - |
91 | | - // TODO: Add more validation for the dates |
92 | | - ] |
93 | | - ); |
94 | | - |
95 | | - if (!$validator->validate()) { |
96 | | - // TODO: actually show the error, need to flash instead |
97 | | - return back()->with('error', 'Invalid query parameters data'); |
98 | | - } |
99 | | - |
100 | | - // Fulltext search on name |
101 | | - if ($name = $request->query('name')) { |
102 | | - $query->whereFullText('name', $name); |
103 | | - } |
104 | | - |
105 | | - // Fulltext search on description |
106 | | - if ($description = $request->query('description')) { |
107 | | - $query->whereFullText('description', $description); |
108 | | - } |
109 | | - |
110 | | - // Filter by platforms (array) |
111 | | - if ($platforms = $request->query('platforms')) { |
112 | | - $query->where(function ($q) use ($platforms) { |
113 | | - foreach ((array) $platforms as $platform) { |
114 | | - $q->orWhereRaw('FIND_IN_SET(?, platforms)', [$platform]); |
115 | | - } |
116 | | - }); |
117 | | - } |
118 | | - |
119 | | - // Filter by difficulty (array) |
120 | | - if ($difficulty = $request->query('difficulty')) { |
121 | | - $query->whereIn('difficulty', (array) $difficulty); |
122 | | - } |
123 | | - |
124 | | - // Filter by pricing (array) |
125 | | - if ($pricing = $request->query('pricing')) { |
126 | | - $query->whereIn('pricing', (array) $pricing); |
127 | | - } |
128 | | - |
129 | | - // Filter by topic tags |
130 | | - if ($topics = $request->query('topics')) { |
131 | | - $query->withAnyTags((array) $topics, 'topics'); |
132 | | - } |
133 | | - |
134 | | - // Filter by programming languages |
135 | | - if ($programmingLanguages = $request->query('programming_languages')) { |
136 | | - $query->withAnyTags((array) $programmingLanguages, 'programming_languages'); |
137 | | - } |
138 | | - |
139 | | - // Filter by general tags |
140 | | - if ($generalTags = $request->query('general_tags')) { |
141 | | - $query->withAnyTags((array) $generalTags, 'general_tags'); |
142 | | - } |
143 | | - |
144 | | - |
145 | | - // Filter by reviews |
146 | | - $ratingFilters = [ |
147 | | - 'community', |
148 | | - 'teaching_clarity', |
149 | | - 'engagement', |
150 | | - 'practicality', |
151 | | - 'user_friendliness', |
152 | | - 'updates', |
153 | | - 'overall', |
154 | | - ]; |
155 | | - |
156 | | - foreach ($ratingFilters as $field) { |
157 | | - if ($rating = $request->query($field)) { |
158 | | - $query = $this->reviewService->applyRatingFilter($query, $field, $rating); |
159 | | - } |
160 | | - } |
161 | | - |
162 | | - // Filter by Date posted |
163 | | - if ($createdFrom = $request->query('created_from')) { |
164 | | - $query->whereDate('computer_science_resources.created_at', '>=', $createdFrom); |
165 | | - } |
166 | | - |
167 | | - if ($createdTo = $request->query('created_to')) { |
168 | | - $query->whereDate('computer_science_resources.created_at', '<=', $createdTo); |
169 | | - } |
170 | | - |
171 | | - // Filter by Date updated |
172 | | - if ($updatedFrom = $request->query('updated_from')) { |
173 | | - $query->whereDate('computer_science_resources.updated_at', '>=', $updatedFrom); |
174 | | - } |
175 | | - |
176 | | - if ($updatedTo = $request->query('updated_to')) { |
177 | | - $query->whereDate('computer_science_resources.updated_at', '<=', $updatedTo); |
178 | | - } |
179 | | - |
180 | | - /// Handle Sorting |
181 | | - $sortBy = $request->query('sort_by', 'top'); |
182 | | - $query = $this->resourceSortingManager->applySort($query, $sortBy); |
183 | | - if ($request->query('reverse', 'false') == 'true') { |
184 | | - $query = $this->resourceSortingManager->reverse($query); |
185 | | - } |
186 | | - |
187 | | - // Paginate and return |
| 52 | + // Paginate with appended query params |
188 | 53 | $resources = $query->paginate(10)->appends($request->query()); |
189 | 54 |
|
190 | 55 | return Inertia::render('Resources/Index', [ |
|
0 commit comments