aboutsummaryrefslogtreecommitdiff
path: root/server/src/routes/userdata.rs
diff options
context:
space:
mode:
Diffstat (limited to 'server/src/routes/userdata.rs')
-rw-r--r--server/src/routes/userdata.rs83
1 files changed, 46 insertions, 37 deletions
diff --git a/server/src/routes/userdata.rs b/server/src/routes/userdata.rs
index 2ded24a..8803bde 100644
--- a/server/src/routes/userdata.rs
+++ b/server/src/routes/userdata.rs
@@ -3,10 +3,10 @@
which is licensed under the GNU Affero General Public License (version 3); see /COPYING.
Copyright (C) 2023 metamuffin <metamuffin.org>
*/
-use super::ui::{account::session::Session, error::MyResult};
+use super::ui::{account::session::Session, error::MyResult, node::DatabaseNodeUserDataExt};
use crate::routes::ui::node::rocket_uri_macro_r_library_node;
use anyhow::anyhow;
-use jellybase::database::Database;
+use jellybase::database::{DataAcid, ReadableTable, Ser, TableExt, T_NODE, T_USER_NODE};
use jellycommon::user::{NodeUserData, WatchedState};
use rocket::{
get, post, response::Redirect, serde::json::Json, FromFormField, State, UriDisplayQuery,
@@ -22,38 +22,41 @@ pub enum UrlWatchedState {
#[get("/n/<id>/userdata")]
pub fn r_node_userdata(
session: Session,
- db: &State<Database>,
+ db: &State<DataAcid>,
id: &str,
) -> MyResult<Json<NodeUserData>> {
- db.node
- .get(&id.to_string())?
- .ok_or(anyhow!("node does not exist"))?;
- let key = (session.user.name.clone(), id.to_owned());
- Ok(Json(db.user_node.get(&key)?.unwrap_or_default()))
+ let (_, _, u) = db.get_node_with_userdata(id, &session)?;
+ Ok(Json(u))
}
#[post("/n/<id>/watched?<state>")]
pub async fn r_player_watched(
session: Session,
- db: &State<Database>,
+ db: &State<DataAcid>,
id: &str,
state: UrlWatchedState,
) -> MyResult<Redirect> {
- db.node
- .get(&id.to_string())?
- .ok_or(anyhow!("node does not exist"))?;
+ T_NODE.get(db, id)?.ok_or(anyhow!("node does not exist"))?;
- let key = (session.user.name.clone(), id.to_owned());
+ // let key = (session.user.name.clone(), id.to_owned());
- db.user_node.fetch_and_update(&key, |t| {
- let mut t = t.unwrap_or_default();
- t.watched = match state {
- UrlWatchedState::None => WatchedState::None,
- UrlWatchedState::Watched => WatchedState::Watched,
- UrlWatchedState::Pending => WatchedState::Pending,
- };
- Some(t)
- })?;
+ let txn = db.begin_write()?;
+ let mut user_nodes = txn.open_table(T_USER_NODE)?;
+
+ let mut udata = user_nodes
+ .get((session.user.name.as_str(), id))?
+ .map(|x| x.value().0)
+ .unwrap_or_default();
+
+ udata.watched = match state {
+ UrlWatchedState::None => WatchedState::None,
+ UrlWatchedState::Watched => WatchedState::Watched,
+ UrlWatchedState::Pending => WatchedState::Pending,
+ };
+
+ user_nodes.insert((session.user.name.as_str(), id), Ser(udata))?;
+ drop(user_nodes);
+ txn.commit()?;
Ok(Redirect::found(rocket::uri!(r_library_node(id))))
}
@@ -61,24 +64,30 @@ pub async fn r_player_watched(
#[post("/n/<id>/progress?<t>")]
pub async fn r_player_progress(
session: Session,
- db: &State<Database>,
+ db: &State<DataAcid>,
id: &str,
t: f64,
) -> MyResult<()> {
- db.node
- .get(&id.to_string())?
- .ok_or(anyhow!("node does not exist"))?;
+ T_NODE.get(db, id)?.ok_or(anyhow!("node does not exist"))?;
+
+ let txn = db.begin_write()?;
+ let mut user_nodes = txn.open_table(T_USER_NODE)?;
+
+ let mut udata = user_nodes
+ .get((session.user.name.as_str(), id))?
+ .map(|x| x.value().0)
+ .unwrap_or_default();
+
+ udata.watched = match udata.watched {
+ WatchedState::None | WatchedState::Pending | WatchedState::Progress(_) => {
+ WatchedState::Progress(t)
+ }
+ WatchedState::Watched => WatchedState::Watched,
+ };
+
+ user_nodes.insert((session.user.name.as_str(), id), Ser(udata))?;
+ drop(user_nodes);
+ txn.commit()?;
- let key = (session.user.name.clone(), id.to_owned());
- db.user_node.fetch_and_update(&key, |d| {
- let mut d = d.unwrap_or_default();
- d.watched = match d.watched {
- WatchedState::None | WatchedState::Pending | WatchedState::Progress(_) => {
- WatchedState::Progress(t)
- }
- WatchedState::Watched => WatchedState::Watched,
- };
- Some(d)
- })?;
Ok(())
}