flesh out get_watch()
This commit is contained in:
parent
48a1233534
commit
7c42b6316a
4 changed files with 106 additions and 11 deletions
|
@ -23,6 +23,8 @@ use templates::*;
|
|||
use users::User;
|
||||
use watches::{templates::*, ShowKind, Watch};
|
||||
|
||||
use crate::watches::handlers::get_watch;
|
||||
|
||||
type AuthContext =
|
||||
axum_login::extractors::AuthContext<uuid::Uuid, User, axum_login::SqliteStore<User>>;
|
||||
|
||||
|
@ -47,6 +49,8 @@ pub async fn app(db_pool: sqlx::SqlitePool, session_secret: &[u8]) -> axum::Rout
|
|||
.route("/login", get(get_login).post(post_login))
|
||||
.route("/logout", get(get_logout).post(post_logout))
|
||||
.route("/watches", get(get_watches))
|
||||
.route("/watch", get(get_watch))
|
||||
.route("/watch/:id", get(get_watch))
|
||||
.route("/search", get(get_search_watch).post(post_search_watch))
|
||||
.route(
|
||||
"/add",
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
use axum::{
|
||||
extract::{Form, Query, State},
|
||||
extract::{Form, Path, Query, State},
|
||||
http::StatusCode,
|
||||
response::{IntoResponse, Response},
|
||||
};
|
||||
|
@ -7,7 +7,7 @@ use serde::Deserialize;
|
|||
use sqlx::{query_as, SqlitePool};
|
||||
use uuid::Uuid;
|
||||
|
||||
use super::templates::GetSearchWatches;
|
||||
use super::templates::{GetSearchWatches, GetWatch};
|
||||
use crate::{AuthContext, GetWatches, ShowKind, User, Watch};
|
||||
|
||||
//-************************************************************************
|
||||
|
@ -17,6 +17,8 @@ use crate::{AuthContext, GetWatches, ShowKind, User, Watch};
|
|||
const GET_WATCHES_QUERY: &str =
|
||||
"select * from watches left join witch_watch on $1 = witch_watch.witch and watches.id = witch_watch.watch";
|
||||
|
||||
const GET_WATCH_QUERY: &str = "select * from watches where id = $1";
|
||||
|
||||
//-************************************************************************
|
||||
// Error types for Watch creation
|
||||
//-************************************************************************
|
||||
|
@ -40,11 +42,34 @@ impl IntoResponse for WatchAddError {
|
|||
}
|
||||
}
|
||||
|
||||
//-************************************************************************
|
||||
// Types for receiving arguments from search queries
|
||||
//-************************************************************************
|
||||
|
||||
#[derive(Debug, Default, Clone, Deserialize)]
|
||||
pub struct SimpleSearchQuery {
|
||||
search: String,
|
||||
}
|
||||
|
||||
#[derive(Debug, Default, Clone, Deserialize)]
|
||||
pub struct FullSearchQuery {
|
||||
pub title: Option<String>,
|
||||
pub kind: Option<String>,
|
||||
pub year: Option<i64>,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Deserialize)]
|
||||
pub enum SearchQuery {
|
||||
Full(FullSearchQuery),
|
||||
Simple(SimpleSearchQuery),
|
||||
}
|
||||
|
||||
impl Default for SearchQuery {
|
||||
fn default() -> Self {
|
||||
SearchQuery::Simple(SimpleSearchQuery::default())
|
||||
}
|
||||
}
|
||||
|
||||
//-************************************************************************
|
||||
// handlers
|
||||
//-************************************************************************
|
||||
|
@ -56,12 +81,34 @@ pub async fn put_add_watch() {}
|
|||
pub async fn post_add_watch() {}
|
||||
|
||||
/// A single Watch
|
||||
pub async fn get_watch() {}
|
||||
pub async fn get_watch(
|
||||
auth: AuthContext,
|
||||
watch: Option<Path<String>>,
|
||||
State(pool): State<SqlitePool>,
|
||||
) -> impl IntoResponse {
|
||||
let id = if let Some(Path(id)) = watch {
|
||||
id
|
||||
} else {
|
||||
"".to_string()
|
||||
};
|
||||
let id = id.trim();
|
||||
|
||||
let watch: Option<Watch> = query_as(GET_WATCH_QUERY)
|
||||
.bind(id)
|
||||
.fetch_one(&pool)
|
||||
.await
|
||||
.ok();
|
||||
|
||||
GetWatch {
|
||||
watch,
|
||||
user: auth.current_user,
|
||||
}
|
||||
}
|
||||
|
||||
/// everything the user has saved
|
||||
pub async fn get_watches(auth: AuthContext, State(pool): State<SqlitePool>) -> impl IntoResponse {
|
||||
let user = &auth.current_user;
|
||||
let watches: Vec<Watch> = if user.is_some() {
|
||||
let user = auth.current_user;
|
||||
let watches: Vec<Watch> = if (user).is_some() {
|
||||
query_as(GET_WATCHES_QUERY)
|
||||
.bind(user.as_ref().unwrap().id)
|
||||
.fetch_all(&pool)
|
||||
|
@ -71,23 +118,27 @@ pub async fn get_watches(auth: AuthContext, State(pool): State<SqlitePool>) -> i
|
|||
vec![]
|
||||
};
|
||||
|
||||
GetWatches {
|
||||
watches,
|
||||
user: user.clone(),
|
||||
}
|
||||
GetWatches { watches, user }
|
||||
}
|
||||
|
||||
pub async fn get_search_watch(
|
||||
auth: AuthContext,
|
||||
State(_pool): State<SqlitePool>,
|
||||
search: Option<Query<SimpleSearchQuery>>,
|
||||
search: Option<Query<SearchQuery>>,
|
||||
) -> impl IntoResponse {
|
||||
use SearchQuery::*;
|
||||
let search = match search {
|
||||
Some(Query(SimpleSearchQuery { search })) => search,
|
||||
Some(Query(Simple(SimpleSearchQuery { search }))) => search,
|
||||
Some(Query(Full(q))) => {
|
||||
// obviously this is dumb
|
||||
format!("{q:?}")
|
||||
}
|
||||
None => "".to_owned(),
|
||||
};
|
||||
let search = search.trim().to_string();
|
||||
|
||||
let user = auth.current_user;
|
||||
|
||||
GetSearchWatches {
|
||||
watches: vec![],
|
||||
user,
|
||||
|
|
|
@ -17,3 +17,10 @@ pub struct GetSearchWatches {
|
|||
pub user: Option<User>,
|
||||
pub search: String,
|
||||
}
|
||||
|
||||
#[derive(Debug, Default, Template, Deserialize, Serialize, PartialEq, Eq, OptionalOptionalUser)]
|
||||
#[template(path = "get_watch.html")]
|
||||
pub struct GetWatch {
|
||||
pub watch: Option<Watch>,
|
||||
pub user: Option<User>,
|
||||
}
|
||||
|
|
33
templates/get_watch.html
Normal file
33
templates/get_watch.html
Normal file
|
@ -0,0 +1,33 @@
|
|||
{% extends "base.html" %}
|
||||
{% import "macros.html" as m %}
|
||||
|
||||
{% block title %}Welcome to Witch Watch, Bish{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
<h1>Whatcha Watchin?</h1>
|
||||
|
||||
{% match watch %}
|
||||
|
||||
{% when Some with (watch) %}
|
||||
|
||||
<div class="watch">
|
||||
<span class="watchtitle">{{watch.title}}</span> -- {% call m::get_or_default(watch.release_date, "when??") %}
|
||||
</div>
|
||||
|
||||
{% else %}
|
||||
|
||||
<div class="no-watch-found">Sorry, maybe you meant to <a href="/search">search for something</a>?</div>
|
||||
|
||||
{% endmatch %}
|
||||
|
||||
|
||||
<p>
|
||||
<form action="/search" enctype="application/x-www-form-urlencoded" method="get">
|
||||
<label for="search">quick search</label>
|
||||
<input type="text" name="search" id="search"></br>
|
||||
<input type="submit" value="Let's go!">
|
||||
</form>
|
||||
</p>
|
||||
|
||||
{% endblock %}
|
Loading…
Reference in a new issue