From 2de7598f8d4d45b07f30276c03d01fa76af46458 Mon Sep 17 00:00:00 2001 From: Paul Makles Date: Sun, 7 Apr 2024 18:10:11 +0100 Subject: [PATCH] refactor(quark): port get/set_settings, get_unreads #283 --- crates/core/models/src/v0/user_settings.rs | 20 ++++++++++++++++ crates/delta/src/routes/onboard/complete.rs | 2 +- crates/delta/src/routes/onboard/hello.rs | 6 +++-- crates/delta/src/routes/onboard/mod.rs | 2 +- crates/delta/src/routes/push/mod.rs | 2 +- crates/delta/src/routes/push/subscribe.rs | 19 ++++++--------- crates/delta/src/routes/push/unsubscribe.rs | 18 +++++++------- crates/delta/src/routes/sync/get_settings.rs | 25 +++++++------------- crates/delta/src/routes/sync/get_unreads.rs | 16 +++++++------ crates/delta/src/routes/sync/mod.rs | 2 +- crates/delta/src/routes/sync/set_settings.rs | 25 +++++++------------- 11 files changed, 69 insertions(+), 68 deletions(-) diff --git a/crates/core/models/src/v0/user_settings.rs b/crates/core/models/src/v0/user_settings.rs index 72e86c49..390e1953 100644 --- a/crates/core/models/src/v0/user_settings.rs +++ b/crates/core/models/src/v0/user_settings.rs @@ -1,6 +1,26 @@ +#[cfg(feature = "rocket")] +use rocket::FromForm; + use std::collections::HashMap; /// HashMap of user settings /// Each key is mapped to a tuple consisting of the /// revision timestamp and serialised data (in JSON format) pub type UserSettings = HashMap; + +auto_derived!( + /// Options for fetching settings + pub struct OptionsFetchSettings { + /// Keys to fetch + pub keys: Vec, + } + + /// Additional options for inserting settings + #[cfg_attr(feature = "rocket", derive(FromForm))] + pub struct OptionsSetSettings { + /// Timestamp of settings change. + /// + /// Used to avoid feedback loops. + pub timestamp: Option, + } +); diff --git a/crates/delta/src/routes/onboard/complete.rs b/crates/delta/src/routes/onboard/complete.rs index 51b43d7c..bc20aa97 100644 --- a/crates/delta/src/routes/onboard/complete.rs +++ b/crates/delta/src/routes/onboard/complete.rs @@ -28,7 +28,7 @@ pub struct DataOnboard { /// This sets a new username, completes onboarding and allows a user to start using Revolt. #[openapi(tag = "Onboarding")] #[post("/complete", data = "")] -pub async fn req( +pub async fn complete( db: &State, session: Session, user: Option, diff --git a/crates/delta/src/routes/onboard/hello.rs b/crates/delta/src/routes/onboard/hello.rs index e8caa430..92a0a8dd 100644 --- a/crates/delta/src/routes/onboard/hello.rs +++ b/crates/delta/src/routes/onboard/hello.rs @@ -1,4 +1,6 @@ -use revolt_quark::{authifier::models::Session, models::User}; +use authifier::models::Session; +use revolt_database::User; + use rocket::serde::json::Json; use serde::Serialize; @@ -14,7 +16,7 @@ pub struct DataHello { /// This will tell you whether the current account requires onboarding or whether you can continue to send requests as usual. You may skip calling this if you're restoring an existing session. #[openapi(tag = "Onboarding")] #[get("/hello")] -pub async fn req(_session: Session, user: Option) -> Json { +pub async fn hello(_session: Session, user: Option) -> Json { Json(DataHello { onboarding: user.is_none(), }) diff --git a/crates/delta/src/routes/onboard/mod.rs b/crates/delta/src/routes/onboard/mod.rs index 68da95ab..ff07d8cf 100644 --- a/crates/delta/src/routes/onboard/mod.rs +++ b/crates/delta/src/routes/onboard/mod.rs @@ -5,5 +5,5 @@ mod complete; mod hello; pub fn routes() -> (Vec, OpenApi) { - openapi_get_routes_spec![hello::req, complete::req] + openapi_get_routes_spec![hello::hello, complete::complete] } diff --git a/crates/delta/src/routes/push/mod.rs b/crates/delta/src/routes/push/mod.rs index 2409dc60..3b55d393 100644 --- a/crates/delta/src/routes/push/mod.rs +++ b/crates/delta/src/routes/push/mod.rs @@ -5,5 +5,5 @@ mod subscribe; mod unsubscribe; pub fn routes() -> (Vec, OpenApi) { - openapi_get_routes_spec![subscribe::req, unsubscribe::req] + openapi_get_routes_spec![subscribe::subscribe, unsubscribe::unsubscribe] } diff --git a/crates/delta/src/routes/push/subscribe.rs b/crates/delta/src/routes/push/subscribe.rs index dea9f412..0d3d09e4 100644 --- a/crates/delta/src/routes/push/subscribe.rs +++ b/crates/delta/src/routes/push/subscribe.rs @@ -1,12 +1,10 @@ -use revolt_quark::{ - authifier::{ - models::{Session, WebPushSubscription}, - Authifier, - }, - EmptyResponse, Error, Result, +use authifier::{ + models::{Session, WebPushSubscription}, + Authifier, }; - +use revolt_result::{create_database_error, Result}; use rocket::{serde::json::Json, State}; +use rocket_empty::EmptyResponse; /// # Push Subscribe /// @@ -15,7 +13,7 @@ use rocket::{serde::json::Json, State}; /// If an existing subscription exists on this session, it will be removed. #[openapi(tag = "Web Push")] #[post("/subscribe", data = "")] -pub async fn req( +pub async fn subscribe( authifier: &State, mut session: Session, data: Json, @@ -25,8 +23,5 @@ pub async fn req( .save(authifier) .await .map(|_| EmptyResponse) - .map_err(|_| Error::DatabaseError { - operation: "save", - with: "session", - }) + .map_err(|_| create_database_error!("save", "session")) } diff --git a/crates/delta/src/routes/push/unsubscribe.rs b/crates/delta/src/routes/push/unsubscribe.rs index cbbe70de..dcc9179f 100644 --- a/crates/delta/src/routes/push/unsubscribe.rs +++ b/crates/delta/src/routes/push/unsubscribe.rs @@ -1,7 +1,7 @@ -use revolt_quark::{ - authifier::{models::Session, Authifier}, - EmptyResponse, Error, Result, -}; +use authifier::{models::Session, Authifier}; + +use revolt_result::{create_database_error, Result}; +use rocket_empty::EmptyResponse; use rocket::State; @@ -10,14 +10,14 @@ use rocket::State; /// Remove the Web Push subscription associated with the current session. #[openapi(tag = "Web Push")] #[post("/unsubscribe")] -pub async fn req(authifier: &State, mut session: Session) -> Result { +pub async fn unsubscribe( + authifier: &State, + mut session: Session, +) -> Result { session.subscription = None; session .save(authifier) .await .map(|_| EmptyResponse) - .map_err(|_| Error::DatabaseError { - operation: "save", - with: "session", - }) + .map_err(|_| create_database_error!("save", "session")) } diff --git a/crates/delta/src/routes/sync/get_settings.rs b/crates/delta/src/routes/sync/get_settings.rs index 3c40d3be..12302925 100644 --- a/crates/delta/src/routes/sync/get_settings.rs +++ b/crates/delta/src/routes/sync/get_settings.rs @@ -1,17 +1,8 @@ -use revolt_quark::{ - models::{User, UserSettings}, - Db, Result, -}; - +use revolt_database::{Database, User}; +use revolt_models::v0; +use revolt_result::Result; use rocket::serde::json::Json; -use serde::{Deserialize, Serialize}; - -/// # Fetch Options -#[derive(Serialize, Deserialize, JsonSchema)] -pub struct OptionsFetchSettings { - /// Keys to fetch - keys: Vec, -} +use rocket::State; /// # Fetch Settings /// @@ -20,11 +11,11 @@ pub struct OptionsFetchSettings { /// This will return an object with the requested keys, each value is a tuple of `(timestamp, value)`, the value is the previously uploaded data. #[openapi(tag = "Sync")] #[post("/settings/fetch", data = "")] -pub async fn req( - db: &Db, +pub async fn fetch( + db: &State, user: User, - options: Json, -) -> Result> { + options: Json, +) -> Result> { db.fetch_user_settings(&user.id, &options.into_inner().keys) .await .map(Json) diff --git a/crates/delta/src/routes/sync/get_unreads.rs b/crates/delta/src/routes/sync/get_unreads.rs index 94faefe7..90efcf68 100644 --- a/crates/delta/src/routes/sync/get_unreads.rs +++ b/crates/delta/src/routes/sync/get_unreads.rs @@ -1,15 +1,17 @@ -use revolt_quark::{ - models::{ChannelUnread, User}, - Db, Result, -}; - +use revolt_database::{Database, User}; +use revolt_models::v0; +use revolt_result::Result; use rocket::serde::json::Json; +use rocket::State; /// # Fetch Unreads /// /// Fetch information about unread state on channels. #[openapi(tag = "Sync")] #[get("/unreads")] -pub async fn req(db: &Db, user: User) -> Result>> { - db.fetch_unreads(&user.id).await.map(Json) +pub async fn unreads(db: &State, user: User) -> Result>> { + db.fetch_unreads(&user.id) + .await + .map(|v| v.into_iter().map(|u| u.into()).collect()) + .map(Json) } diff --git a/crates/delta/src/routes/sync/mod.rs b/crates/delta/src/routes/sync/mod.rs index 35acf239..b97c2ad8 100644 --- a/crates/delta/src/routes/sync/mod.rs +++ b/crates/delta/src/routes/sync/mod.rs @@ -6,5 +6,5 @@ mod get_unreads; mod set_settings; pub fn routes() -> (Vec, OpenApi) { - openapi_get_routes_spec![get_settings::req, set_settings::req, get_unreads::req] + openapi_get_routes_spec![get_settings::fetch, set_settings::set, get_unreads::unreads] } diff --git a/crates/delta/src/routes/sync/set_settings.rs b/crates/delta/src/routes/sync/set_settings.rs index e86f9fcd..361d5871 100644 --- a/crates/delta/src/routes/sync/set_settings.rs +++ b/crates/delta/src/routes/sync/set_settings.rs @@ -1,33 +1,24 @@ -use revolt_quark::models::User; -use revolt_quark::r#impl::UserSettingsImpl; -use revolt_quark::{Db, EmptyResponse, Result}; +use revolt_database::{Database, User, UserSettingsImpl}; +use revolt_models::v0; use chrono::prelude::*; -use rocket::serde::json::Json; -use serde::{Deserialize, Serialize}; +use revolt_result::Result; +use rocket::{serde::json::Json, State}; +use rocket_empty::EmptyResponse; use std::collections::HashMap; type Data = HashMap; -/// # Set Options -#[derive(FromForm, Serialize, Deserialize, JsonSchema)] -pub struct OptionsSetSettings { - /// Timestamp of settings change. - /// - /// Used to avoid feedback loops. - timestamp: Option, -} - /// # Set Settings /// /// Upload data to save to settings. #[openapi(tag = "Sync")] #[post("/settings/set?", data = "")] -pub async fn req( - db: &Db, +pub async fn set( + db: &State, user: User, data: Json, - options: OptionsSetSettings, + options: v0::OptionsSetSettings, ) -> Result { let data = data.into_inner(); let current_time = Utc::now().timestamp_millis();