From 062a3e26bcf1a1d27dc87e7e79af21b6e5609ceb Mon Sep 17 00:00:00 2001 From: Joe Ardent Date: Sun, 14 Apr 2024 21:22:16 -0700 Subject: [PATCH] split title and preson search --- src/lib.rs | 2 +- src/search.rs | 37 +++++++++++++++++++++++++++--- templates/my_watches_page.html | 2 +- templates/search_watches_page.html | 21 +++++++++-------- 4 files changed, 48 insertions(+), 14 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index ac0e3af..6107bb5 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -80,7 +80,7 @@ pub async fn app(db_pool: sqlx::SqlitePool) -> IntoMakeService { .route("/watch", get(get_watch)) .route("/watch/:watch", get(get_watch)) .route("/watch/status/:watch", get(get_watch_status)) - .route("/search", get(get_search_watch)) + .route("/title-search", get(get_search_watch)) .route("/add", get(get_add_new_watch).post(post_add_new_watch)) .route( "/add/watch", diff --git a/src/search.rs b/src/search.rs index 4bcfda6..f6d6baa 100644 --- a/src/search.rs +++ b/src/search.rs @@ -24,20 +24,28 @@ pub enum SearchResult { } #[derive(Debug, Default, Clone, Deserialize, PartialEq, Eq)] -pub struct SearchQuery { +pub struct SearchWatchQuery { #[serde(default, deserialize_with = "empty_string_as_none")] pub title: Option, #[serde(default, deserialize_with = "empty_string_as_none")] pub year: Option, } +#[derive(Debug, Default, Clone, Deserialize, PartialEq, Eq)] +pub struct SearchStarQuery { + #[serde(default, deserialize_with = "empty_string_as_none")] + pub name: Option, + #[serde(default, deserialize_with = "empty_string_as_none")] + pub year: Option, +} + pub async fn get_search_watch( auth: AuthSession, State(pool): State, - Query(search): Query, + Query(search): Query, ) -> impl IntoResponse { let user = auth.user; - let SearchQuery { title, year } = &search; + let SearchWatchQuery { title, year } = &search; let watches: Vec = match (title, year) { (Some(title), None) => sqlx::query_as( @@ -53,3 +61,26 @@ pub async fn get_search_watch( user, } } + +pub async fn get_search_star( + auth: AuthSession, + State(pool): State, + Query(search): Query, +) -> impl IntoResponse { + let user = auth.user; + let SearchStarQuery { name, year } = &search; + + let watches: Vec = match (name, year) { + (Some(title), None) => sqlx::query_as( + "select * from watches where id in (select id from watch_search where title match ? order by rank)").bind( + title.trim()).fetch_all(&pool).await.unwrap_or_default(), + (Some(title), Some(year)) => sqlx::query_as("select * from watches where id in (select id from watch_search where title match ? order by rank) and release_date = ?").bind(title.trim()).bind(year.trim()).fetch_all(&pool).await.unwrap_or_default(), + (None, Some(year)) => sqlx::query_as("select * from watches where release_date = ? order by title").bind(year.trim()).fetch_all(&pool).await.unwrap_or_default(), + _ => sqlx::query_as("select * from (select * from watches order by random() limit 50) order by release_date asc").fetch_all(&pool).await.unwrap_or_default() + }; + + SearchPage { + results: watches, + user, + } +} diff --git a/templates/my_watches_page.html b/templates/my_watches_page.html index 3e3882c..fad8f67 100644 --- a/templates/my_watches_page.html +++ b/templates/my_watches_page.html @@ -17,7 +17,7 @@

-

+
diff --git a/templates/search_watches_page.html b/templates/search_watches_page.html index 17ca328..a2e7039 100644 --- a/templates/search_watches_page.html +++ b/templates/search_watches_page.html @@ -8,22 +8,25 @@

Whatcha Watchin?

- -

Search

+ +

Title Search


-
- -
- - -
- + + +
+ +
+ + + +
+