@@ -22,6 +22,8 @@ use axum::{
22
22
use base64:: { engine:: general_purpose:: STANDARD as b64, Engine } ;
23
23
use chrono:: { DateTime , Utc } ;
24
24
use futures_util:: stream:: TryStreamExt ;
25
+ use once_cell:: sync:: Lazy ;
26
+ use regex:: Regex ;
25
27
use serde:: { Deserialize , Serialize } ;
26
28
use sqlx:: Row ;
27
29
use std:: collections:: { BTreeMap , HashMap , HashSet } ;
@@ -156,7 +158,6 @@ async fn get_search_results(
156
158
}
157
159
158
160
use crate :: utils:: APP_USER_AGENT ;
159
- use once_cell:: sync:: Lazy ;
160
161
use reqwest:: header:: { HeaderMap , HeaderValue , ACCEPT , USER_AGENT } ;
161
162
use reqwest:: Client as HttpClient ;
162
163
@@ -498,6 +499,13 @@ impl_axum_webpage! {
498
499
status = |search| search. status,
499
500
}
500
501
502
+ fn retrive_sort_from_paginate ( query : & str ) -> String {
503
+ static RE : Lazy < Regex > = Lazy :: new ( || Regex :: new ( r"[?&]sort=([^&]+)" ) . unwrap ( ) ) ;
504
+ let cap = RE . captures ( query) . unwrap ( ) ;
505
+ cap. get ( 1 )
506
+ . map_or ( "relevance" . to_string ( ) , |v| v. as_str ( ) . to_string ( ) )
507
+ }
508
+
501
509
pub ( crate ) async fn search_handler (
502
510
mut conn : DbConnection ,
503
511
Extension ( pool) : Extension < Pool > ,
@@ -509,7 +517,7 @@ pub(crate) async fn search_handler(
509
517
. get ( "query" )
510
518
. map ( |q| q. to_string ( ) )
511
519
. unwrap_or_else ( || "" . to_string ( ) ) ;
512
- let sort_by = params
520
+ let mut sort_by = params
513
521
. get ( "sort" )
514
522
. map ( |q| q. to_string ( ) )
515
523
. unwrap_or_else ( || "relevance" . to_string ( ) ) ;
@@ -578,7 +586,7 @@ pub(crate) async fn search_handler(
578
586
) ;
579
587
return Err ( AxumNope :: NoResults ) ;
580
588
}
581
-
589
+ sort_by = retrive_sort_from_paginate ( & query_params ) ;
582
590
get_search_results ( & mut conn, & config, & query_params) . await ?
583
591
} else if !query. is_empty ( ) {
584
592
let query_params: String = form_urlencoded:: Serializer :: new ( String :: new ( ) )
0 commit comments