diff --git a/src/db.rs b/src/db.rs index 511b82d..694ef49 100644 --- a/src/db.rs +++ b/src/db.rs @@ -35,8 +35,10 @@ pub type Result> = std::result::Resu #[derive(Serialize)] pub struct Note { pub id: i32, + pub uuid: String, pub content: String, pub list_id: i32, + pub writer_id: i32, } impl ToString for Note { fn to_string(&self) -> String { @@ -101,6 +103,7 @@ impl<'a> FromRequest<'a> for User { #[derive(Serialize)] pub struct List { pub id: i32, + pub uuid: String, pub name: String, pub owner_id: i32, } @@ -109,10 +112,44 @@ impl ToString for List { format!("{}: {} (owned by {})", self.id, self.name, self.owner_id) } } +impl List { + pub async fn from_uuid(list_uuid: String, db: &mut PoolConnection) -> Result> { + match sqlx::query!(" + SELECT * FROM list WHERE uuid = $1", list_uuid) + .fetch_optional(db) + .await? { + Some(list) => Ok(Some(List { + id: list.id, + uuid: list.uuid, + name: list.name.clone(), + owner_id: list.owner_id, + })), + None => Ok(None), + } + } +} + +pub async fn get_notes_from_list(list_id: i32, db: &mut PoolConnection) -> Result> { + Ok(sqlx::query!(" + SELECT * + FROM note + WHERE list_id = $1", list_id) + .fetch_all(db) + .await? + .iter() + .map(|r| Note { + id: r.id, + uuid: r.uuid.clone(), + list_id: r.list_id, + content: r.content.clone(), + writer_id: r.writer_id, + }) + .collect()) +} pub async fn get_list_notes(db: &mut PoolConnection, lid: i32) -> Result> { Ok(sqlx::query!(" - SELECT id,content,list_id + SELECT id,content,list_id,uuid,writer_id FROM note WHERE list_id = $1", lid) .fetch_all(db) @@ -120,31 +157,34 @@ pub async fn get_list_notes(db: &mut PoolConnection, lid: i32) -> Resu .iter() .map(|r| Note { id: r.id, + uuid: r.uuid.clone(), content: r.content.clone(), - list_id: r.list_id + list_id: r.list_id, + writer_id: r.writer_id, }) .collect()) } pub async fn get_user_lists(db: &mut PoolConnection, uid: i32) -> Result> { Ok(sqlx::query!(" - SELECT id,name,owner_id + SELECT id,name,owner_id,uuid FROM list WHERE owner_id = $1", uid) .fetch_all(db) .await? .iter() .map(|r| List { - name: r.name.clone(), id: r.id, - owner_id: r.owner_id + uuid: r.uuid.clone(), + owner_id: r.owner_id, + name: r.name.clone(), }) .collect()) } pub async fn get_user_lists_from_perms(db: &mut PoolConnection, uid: i32) -> Result> { Ok(sqlx::query!(" - SELECT list.id,list.name,list.owner_id + SELECT list.id,list.name,list.owner_id,uuid FROM list JOIN perms ON list.id=perms.list_id WHERE perms.user_id = $1 @@ -155,11 +195,22 @@ pub async fn get_user_lists_from_perms(db: &mut PoolConnection, uid: i .map(|r| List { name: r.name.clone(), id: r.id, + uuid: r.uuid.clone(), owner_id: r.owner_id }) .collect()) } +pub async fn add_note_to_list(db: &mut PoolConnection, list_id: i32, content: String, writer_id: i32) -> Result { + match sqlx::query!( + "INSERT INTO note (list_id, writer_id, content) VALUES ($1, $2, $3)", list_id, writer_id, content) + .execute(db) + .await { + Ok(_) => Ok(true), + Err(e) => Ok(false), + } +} + pub async fn get_user_from_email(db: &mut PoolConnection, email: String) -> Result> { match sqlx::query!( "SELECT * FROM users WHERE email = $1", diff --git a/src/forms.rs b/src/forms.rs index 415ab48..4584d4a 100644 --- a/src/forms.rs +++ b/src/forms.rs @@ -25,3 +25,9 @@ pub struct PermsForm<'a> { pub perm: i32, } +#[derive(FromForm)] +pub struct NewNoteForm<'a> { + pub content: &'a str, + pub list_uuid: &'a str, +} + diff --git a/src/main.rs b/src/main.rs index d4f2f6a..bf5d5a4 100644 --- a/src/main.rs +++ b/src/main.rs @@ -16,15 +16,19 @@ use forms::{ NewUserForm, NewListForm, PermsForm, + NewNoteForm, }; use db::{ List, Notes, + Note, Result, add_permission, get_user_from_email, get_user_lists, get_user_lists_from_perms, + get_notes_from_list, + add_note_to_list, User, }; @@ -45,6 +49,7 @@ use rocket::{ http::{ Cookie, CookieJar, + RawStr, }, }; @@ -133,6 +138,23 @@ async fn new_list_form(_user: User) -> Template { async fn new_list_form_not_logged_in() -> Redirect { Redirect::to(uri!(home)) } +#[get("/new/note/")] +async fn new_note_form(mut db: Connection, user: User, list_uuid: String) -> Result