add working endpoints for getting your watches
This commit is contained in:
parent
1e9d97bd19
commit
c44c89005c
8 changed files with 97 additions and 5 deletions
|
@ -20,7 +20,10 @@ pub(crate) mod util;
|
|||
pub mod watches;
|
||||
pub use templates::*;
|
||||
pub use watches::templates::*;
|
||||
use watches::{ShowKind, Watch};
|
||||
use watches::{
|
||||
handlers::{get_search_watch, get_watches, post_search_watch, put_add_watch},
|
||||
ShowKind, Watch,
|
||||
};
|
||||
|
||||
#[cfg(test)]
|
||||
pub mod test_utils;
|
||||
|
@ -37,6 +40,9 @@ pub async fn app(db_pool: SqlitePool, secret: &[u8]) -> Router {
|
|||
.route("/signup_success/:id", get(handle_signup_success))
|
||||
.route("/login", get(get_login).post(post_login))
|
||||
.route("/logout", get(get_logout).post(post_logout))
|
||||
.route("/watches", get(get_watches))
|
||||
.route("/search", get(get_search_watch).post(post_search_watch))
|
||||
.route("/add", get(get_search_watch).put(put_add_watch))
|
||||
.fallback(handle_slash_redir)
|
||||
.layer(middleware::from_fn_with_state(
|
||||
db_pool.clone(),
|
||||
|
|
|
@ -6,7 +6,14 @@ use axum::{
|
|||
use sqlx::{query_as, SqlitePool};
|
||||
use uuid::Uuid;
|
||||
|
||||
use crate::{ShowKind, User, Watch};
|
||||
use crate::{AuthContext, GetWatches, ShowKind, User, Watch};
|
||||
|
||||
//-************************************************************************
|
||||
// Constants
|
||||
//-************************************************************************
|
||||
|
||||
const GET_WATCHES_QUERY: &str =
|
||||
"select * from watches left join witch_watch on $1 = witch_watch.witch and watches.id = witch_watch.watch";
|
||||
|
||||
//-************************************************************************
|
||||
// Error types for Watch creation
|
||||
|
@ -32,13 +39,29 @@ impl IntoResponse for WatchAddError {
|
|||
}
|
||||
|
||||
/// Add a Watch to the whole system
|
||||
pub async fn post_add_watch() {}
|
||||
pub async fn put_add_watch() {}
|
||||
|
||||
/// A single Watch
|
||||
pub async fn get_watch() {}
|
||||
|
||||
/// everything the user has saved
|
||||
pub async fn get_watches() {}
|
||||
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() {
|
||||
query_as(GET_WATCHES_QUERY)
|
||||
.bind(user.as_ref().unwrap().id)
|
||||
.fetch_all(&pool)
|
||||
.await
|
||||
.unwrap_or_default()
|
||||
} else {
|
||||
vec![]
|
||||
};
|
||||
|
||||
GetWatches {
|
||||
watches,
|
||||
user: user.clone(),
|
||||
}
|
||||
}
|
||||
|
||||
pub async fn get_search_watch() {}
|
||||
|
||||
|
|
|
@ -16,6 +16,12 @@ pub enum ShowKind {
|
|||
Unknown = 4,
|
||||
}
|
||||
|
||||
impl std::fmt::Display for ShowKind {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
todo!()
|
||||
}
|
||||
}
|
||||
|
||||
impl Default for ShowKind {
|
||||
fn default() -> Self {
|
||||
Self::Unknown
|
||||
|
|
|
@ -1 +1,11 @@
|
|||
use askama::Template;
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
use crate::{User, Watch};
|
||||
|
||||
#[derive(Debug, Default, Template, Deserialize, Serialize, PartialEq, Eq)]
|
||||
#[template(path = "get_watches.html")]
|
||||
pub struct GetWatches {
|
||||
pub watches: Vec<Watch>,
|
||||
pub user: Option<User>,
|
||||
}
|
||||
|
|
37
templates/get_watches.html
Normal file
37
templates/get_watches.html
Normal file
|
@ -0,0 +1,37 @@
|
|||
{% extends "base.html" %}
|
||||
{% import "macros.html" as m %}
|
||||
|
||||
{% block title %}Welcome to Witch Watch, Bish{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
<h1>Whatcha Watchin?</h1>
|
||||
|
||||
{% match user %}
|
||||
{% when Some with (usr) %}
|
||||
<p>
|
||||
Hello, {{ usr.username }}! It's nice to see you.
|
||||
</p>
|
||||
</br>
|
||||
<p>Here are your things to watch:</p>
|
||||
<div class="watchlist">
|
||||
<ul>
|
||||
{% for watch in watches %}
|
||||
<li><span class="watchtitle">{{watch.title}}</span> -- {% call m::get_or_default(watch.release_date, "when??") %}: </li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</div>
|
||||
<p>
|
||||
<form action="/search" enctype="application/x-www-form-urlencoded" method="post">
|
||||
<label for="search">Looking for something else to watch?</label>
|
||||
<input type="text" name="search" id="search"></br>
|
||||
<input type="submit" value="Let's go!">
|
||||
</form>
|
||||
</p>
|
||||
{% else %}
|
||||
<p>
|
||||
Heya, why don't you <a href="/login">log in</a> or <a href="/signup">sign up</a>?
|
||||
</p>
|
||||
{% endmatch %}
|
||||
|
||||
{% endblock %}
|
|
@ -9,7 +9,7 @@
|
|||
{% match user %}
|
||||
{% when Some with (usr) %}
|
||||
<p>
|
||||
Hello, {{ usr.username }}! It's nice to see you.
|
||||
Hello, {{ usr.username }}! It's nice to see you. <a href="watches">Let's get watchin'!</a>
|
||||
</p>
|
||||
</br>
|
||||
<p>
|
||||
|
|
10
templates/macros.html
Normal file
10
templates/macros.html
Normal file
|
@ -0,0 +1,10 @@
|
|||
{% macro get_or_default(val, def) %}
|
||||
|
||||
{% match val %}
|
||||
{% when Some with (v) %}
|
||||
{{v}}
|
||||
{% else %}
|
||||
{{def}}
|
||||
{% endmatch %}
|
||||
|
||||
{% endmacro %}
|
Loading…
Reference in a new issue