1010use App \Services \CommentService ;
1111use App \Services \ResourceReviewService ;
1212use App \Services \SortingManagers \GeneralVotesSortingManager ;
13+ use App \Services \SortingManagers \ResourceSortingManager ;
1314use Illuminate \Http \Request ;
1415use Illuminate \Support \Facades \Auth ;
1516use Illuminate \Support \Facades \Log ;
@@ -22,12 +23,18 @@ class ComputerScienceResourceController extends Controller
2223 protected $ commentService ;
2324 protected $ generalVotesSortingManager ;
2425 protected $ reviewService ;
25-
26- function __construct (CommentService $ commentService , GeneralVotesSortingManager $ generalVotesSortingManager , ResourceReviewService $ reviewService )
27- {
26+ protected $ resourceSortingManager ;
27+
28+ function __construct (
29+ CommentService $ commentService ,
30+ GeneralVotesSortingManager $ generalVotesSortingManager ,
31+ ResourceReviewService $ reviewService ,
32+ ResourceSortingManager $ resourceSortingManager ,
33+ ) {
2834 $ this ->commentService = $ commentService ;
2935 $ this ->generalVotesSortingManager = $ generalVotesSortingManager ;
3036 $ this ->reviewService = $ reviewService ;
37+ $ this ->resourceSortingManager = $ resourceSortingManager ;
3138 }
3239
3340 /**
@@ -40,49 +47,52 @@ public function index(Request $request)
4047 // Eager load relations
4148 $ query ->with (['tags ' , 'votes ' , 'upvoteSummary ' , 'reviewSummary ' , 'commentsCountRelationship ' ]);
4249
43- $ validator = Validator::make ([
44- 'name ' => $ request ->query ('name ' ),
45- 'description ' => $ request ->query ('description ' ),
46- 'platforms ' => $ request ->query ('platforms ' ),
47- 'difficulty ' => $ request ->query ('difficulty ' ),
48- 'pricing ' => $ request ->query ('pricing ' ),
49- 'topics ' => $ request ->query ('topics ' ),
50- 'programming_languages ' => $ request ->query ('programming_languages ' ),
51- 'general_tags ' => $ request ->query ('general_tags ' ),
52-
53- 'community_rating ' => $ request ->query ('community_rating ' ),
54- 'teaching_clarity ' => $ request ->query ('teaching_clarity ' ),
55- 'engagement ' => $ request ->query ('engagement ' ),
56- 'practicality ' => $ request ->query ('practicality ' ),
57- 'user_friendliness ' => $ request ->query ('user_friendliness ' ),
58- 'updates ' => $ request ->query ('updates ' ),
59- ],
60- [
61- 'name ' => ['nullable ' , 'string ' , 'max:100 ' ],
62- 'name ' => ['nullable ' , 'string ' , 'max:1000 ' ],
63- 'platforms ' => ['nullable ' , 'array ' , 'min:1 ' ],
64- 'platforms.* ' => ['required ' , 'distinct ' , 'string ' , Rule::in (config ('computerScienceResource.platforms ' ))],
65- 'difficulty ' => ['nullable ' , 'string ' , Rule::in (config ('computerScienceResource.difficulties ' ))],
66- 'pricing ' => ['nullable ' , 'string ' , Rule::in (config ('computerScienceResource.pricings ' ))],
67-
68- 'topic_tags ' => ['nullable ' , 'array ' , 'min:3 ' ],
69- 'topic_tags.* ' => ['required ' , 'distinct ' , 'string ' , 'max:50 ' ],
70-
71- 'general_tags ' => ['nullable ' , 'array ' ],
72- 'general_tags.* ' => ['required ' , 'distinct ' , 'string ' , 'max:50 ' ],
73- 'programming_language_tags ' => ['nullable ' , 'array ' ],
74- 'programming_language_tags.* ' => ['required ' , 'distinct ' , 'string ' , 'max:50 ' ],
75-
76- 'community_rating ' => ['nullable ' , 'integer ' , 'between:1,4 ' ],
77- 'teaching_clarity ' => ['nullable ' , 'integer ' , 'between:1,4 ' ],
78- 'engagement ' => ['nullable ' , 'integer ' , 'between:1,4 ' ],
79- 'practicality ' => ['nullable ' , 'integer ' , 'between:1,4 ' ],
80- 'user_friendliness ' => ['nullable ' , 'integer ' , 'between:1,4 ' ],
81- 'updates ' => ['nullable ' , 'integer ' , 'between:1,4 ' ],
82- ]);
83-
84- if (!$ validator ->validate ())
85- {
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 ()) {
8696 // TODO: actually show the error, need to flash instead
8797 return back ()->with ('error ' , 'Invalid query parameters data ' );
8898 }
@@ -141,7 +151,7 @@ public function index(Request $request)
141151 'user_friendliness ' ,
142152 'updates ' ,
143153 'overall_rating ' ,
144- ];
154+ ];
145155
146156 foreach ($ ratingFilters as $ field ) {
147157 if ($ rating = $ request ->query ($ field )) {
@@ -168,10 +178,8 @@ public function index(Request $request)
168178 }
169179
170180 /// Handle Sorting
171-
172- // Sort by votes
173-
174- // Sort by reviews
181+ $ sortBy = $ request ->query ('sort_by ' , 'top ' );
182+ $ query = $ this ->resourceSortingManager ->applySort ($ query , $ sortBy );
175183
176184 // Paginate and return
177185 $ resources = $ query ->paginate (10 )->appends ($ request ->query ());
0 commit comments