1313use LIQRGV \QueryFilter \Exception \NotModelException ;
1414use LIQRGV \QueryFilter \Struct \FilterStruct ;
1515use LIQRGV \QueryFilter \Struct \ModelBuilderStruct ;
16+ use LIQRGV \QueryFilter \Struct \SortStruct ;
1617
1718class RequestParser
1819{
@@ -54,17 +55,23 @@ public function getBuilder(): Builder
5455 $ modelBuilderStruct = $ this ->createModelBuilderStruct ($ this ->request );
5556 $ model = $ this ->createModel ($ modelBuilderStruct ->baseModelName );
5657
57- return $ this ->applyFilter ($ model ::query (), $ modelBuilderStruct ->filters );
58+ $ builder = $ this ->applyFilter ($ model ::query (), $ modelBuilderStruct ->filters );
59+ $ builder = $ this ->applySorter ($ builder , $ modelBuilderStruct ->sorter );
60+
61+ return $ builder ;
5862 }
5963
6064 private function createModelBuilderStruct (Request $ request ): ModelBuilderStruct
6165 {
62- $ filterQuery = $ request ->filter ?: [];
66+ $ queryParam = $ request ->query ;
67+ $ filterQuery = $ queryParam ->get ('filter ' ) ?? [];
68+ $ sortQuery = $ queryParam ->get ('sort ' ) ?? null ;
6369
6470 $ baseModelName = $ this ->getBaseModelName ($ request );
6571 $ filters = $ this ->parseFilter ($ filterQuery );
72+ $ sorter = $ this ->parseSorter ($ sortQuery );
6673
67- return new ModelBuilderStruct ($ baseModelName , $ filters );
74+ return new ModelBuilderStruct ($ baseModelName , $ filters, $ sorter );
6875 }
6976
7077 private function getBaseModelName (Request $ request ): string
@@ -126,6 +133,23 @@ private function parseFilter(array $filterQuery = []): array
126133 return $ filters ;
127134 }
128135
136+ private function parseSorter (?string $ sortQuery ): ?SortStruct
137+ {
138+ if (is_null ($ sortQuery )) {
139+ return null ;
140+ }
141+
142+ $ fieldPattern = "/^\-?([a-zA-z\_]+)$/ " ;
143+ if (preg_match ($ fieldPattern , $ sortQuery , $ match )) {
144+ $ fieldName = $ match [1 ];
145+ $ direction = $ sortQuery [0 ] == "- " ? "DESC " : "ASC " ;
146+
147+ return new SortStruct ($ fieldName , $ direction );
148+ }
149+
150+ return null ;
151+ }
152+
129153 private function getModelFromNamespaces (string $ modelName , array $ modelNamespaces )
130154 {
131155 foreach ($ modelNamespaces as $ modelNamespace ) {
@@ -150,6 +174,15 @@ private function applyFilter(Builder $builder, array $filters): Builder
150174 return $ builder ;
151175 }
152176
177+ private function applySorter (Builder $ builder , ?SortStruct $ sorter )
178+ {
179+ if (is_null ($ sorter )) {
180+ return $ builder ;
181+ }
182+
183+ return $ builder ->orderBy ($ sorter ->fieldName , $ sorter ->direction );
184+ }
185+
153186 private function createModel (string $ baseModelName )
154187 {
155188 $ model = new $ baseModelName ;
0 commit comments