88use App \Models \ResourceEdits ;
99use App \Models \ResourceReview ;
1010use App \Services \CommentService ;
11+ use App \Services \ResourceReviewService ;
1112use App \Services \UpvoteService ;
1213use Illuminate \Http \Request ;
1314use Illuminate \Support \Facades \Auth ;
1415use Illuminate \Support \Facades \Log ;
16+ use Illuminate \Support \Facades \Validator ;
17+ use Illuminate \Validation \Rule ;
1518use Inertia \Inertia ;
1619
1720class ComputerScienceResourceController extends Controller
1821{
1922 protected $ commentService ;
2023 protected $ upvoteService ;
24+ protected $ reviewService ;
2125
22- function __construct (CommentService $ commentService , UpvoteService $ upvoteService )
26+ function __construct (CommentService $ commentService , UpvoteService $ upvoteService, ResourceReviewService $ reviewService )
2327 {
2428 $ this ->commentService = $ commentService ;
2529 $ this ->upvoteService = $ upvoteService ;
30+ $ this ->reviewService = $ reviewService ;
2631 }
2732
2833 /**
@@ -35,6 +40,43 @@ public function index(Request $request)
3540 // Eager load relations
3641 $ query ->with (['tags ' , 'votes ' , 'upvoteSummary ' , 'reviewSummary ' , 'commentsCountRelationship ' ]);
3742
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+ ],
55+ [
56+ 'name ' => ['nullable ' , 'string ' , 'max:100 ' ],
57+ 'name ' => ['nullable ' , 'string ' , 'max:1000 ' ],
58+ 'platforms ' => ['nullable ' , 'array ' , 'min:1 ' ],
59+ 'platforms.* ' => ['required ' , 'distinct ' , 'string ' , Rule::in (config ('computerScienceResource.platforms ' ))],
60+ 'difficulty ' => ['nullable ' , 'string ' , Rule::in (config ('computerScienceResource.difficulties ' ))],
61+ 'pricing ' => ['nullable ' , 'string ' , Rule::in (config ('computerScienceResource.pricings ' ))],
62+
63+ 'topic_tags ' => ['nullable ' , 'array ' , 'min:3 ' ],
64+ 'topic_tags.* ' => ['required ' , 'distinct ' , 'string ' , 'max:50 ' ],
65+
66+ 'general_tags ' => ['nullable ' , 'array ' ],
67+ 'general_tags.* ' => ['required ' , 'distinct ' , 'string ' , 'max:50 ' ],
68+ 'programming_language_tags ' => ['nullable ' , 'array ' ],
69+ 'programming_language_tags.* ' => ['required ' , 'distinct ' , 'string ' , 'max:50 ' ],
70+
71+ 'community_rating ' => ['nullable ' , 'integer ' , 'between:1,4 ' ],
72+ ]);
73+
74+ if (!$ validator ->validate ())
75+ {
76+ // TODO: actually show the error, need to flash instead
77+ return back ()->with ('error ' , 'Invalid query parameters data ' );
78+ }
79+
3880 // Fulltext search on name
3981 if ($ name = $ request ->query ('name ' )) {
4082 $ query ->whereFullText ('name ' , $ name );
@@ -79,7 +121,10 @@ public function index(Request $request)
79121 $ query ->withAnyTags ((array ) $ generalTags , 'general_tags ' );
80122 }
81123
82-
124+ // Filter by reviews
125+ if ($ commmunityRating = $ request ->query ('community_rating ' )) {
126+ $ query = $ this ->reviewService ->applyRatingFilter ($ query , 'community ' , $ commmunityRating );
127+ }
83128
84129 // Paginate and return
85130 $ resources = $ query ->paginate (10 )->appends ($ request ->query ());
0 commit comments