From b0385830edf502ca10eeb8f01f5c2f7b73b664ef Mon Sep 17 00:00:00 2001 From: Dessalines Date: Mon, 6 Dec 2021 14:10:53 -0500 Subject: [PATCH] A few additions: - Add a DeleteAccount response. - RegistrationApplicationView now has the safe LocalUserSettings. - Adding VerifyEmail to websocket API, added a proper response type. --- crates/api/src/lib.rs | 3 ++ crates/api/src/local_user.rs | 4 +-- crates/api_common/src/person.rs | 9 +++-- crates/api_crud/src/user/delete.rs | 13 +++---- crates/apub/src/fetcher/webfinger.rs | 4 +-- crates/db_schema/src/impls/local_user.rs | 4 +++ crates/db_schema/src/source/local_user.rs | 2 ++ .../src/registration_application_view.rs | 34 ++++++++++++++----- crates/websocket/src/lib.rs | 1 + src/api_routes.rs | 3 +- 10 files changed, 51 insertions(+), 26 deletions(-) diff --git a/crates/api/src/lib.rs b/crates/api/src/lib.rs index 42df3df88..26a41d3d2 100644 --- a/crates/api/src/lib.rs +++ b/crates/api/src/lib.rs @@ -84,6 +84,9 @@ pub async fn match_websocket_operation( UserOperation::GetUnreadCount => { do_websocket_operation::(context, id, op, data).await } + UserOperation::VerifyEmail => { + do_websocket_operation::(context, id, op, data).await + } // Private Message ops UserOperation::MarkPrivateMessageAsRead => { diff --git a/crates/api/src/local_user.rs b/crates/api/src/local_user.rs index 76ca308fd..f4686d814 100644 --- a/crates/api/src/local_user.rs +++ b/crates/api/src/local_user.rs @@ -935,7 +935,7 @@ impl Perform for GetUnreadCount { #[async_trait::async_trait(?Send)] impl Perform for VerifyEmail { - type Response = (); + type Response = VerifyEmailResponse; async fn perform( &self, @@ -963,6 +963,6 @@ impl Perform for VerifyEmail { }) .await??; - Ok(()) + Ok(VerifyEmailResponse {}) } } diff --git a/crates/api_common/src/person.rs b/crates/api_common/src/person.rs index 648e5c591..47c26591e 100644 --- a/crates/api_common/src/person.rs +++ b/crates/api_common/src/person.rs @@ -81,8 +81,7 @@ pub struct ChangePassword { #[derive(Debug, Serialize, Deserialize)] pub struct LoginResponse { - /// This is None in response to `Register` if email verification is enabled, and in response to - /// `DeleteAccount`. + /// This is None in response to `Register` if email verification is enabled, or the server requires registration applications. pub jwt: Option>, pub registration_created: bool, pub verify_email_sent: bool, @@ -201,6 +200,9 @@ pub struct DeleteAccount { pub auth: Sensitive, } +#[derive(Debug, Serialize, Deserialize, Clone)] +pub struct DeleteAccountResponse {} + #[derive(Debug, Serialize, Deserialize)] pub struct PasswordReset { pub email: Sensitive, @@ -291,3 +293,6 @@ pub struct GetUnreadCountResponse { pub struct VerifyEmail { pub token: String, } + +#[derive(Debug, Serialize, Deserialize, Clone)] +pub struct VerifyEmailResponse {} diff --git a/crates/api_crud/src/user/delete.rs b/crates/api_crud/src/user/delete.rs index 47ca7e4d0..c3977e726 100644 --- a/crates/api_crud/src/user/delete.rs +++ b/crates/api_crud/src/user/delete.rs @@ -8,15 +8,15 @@ use lemmy_websocket::LemmyContext; #[async_trait::async_trait(?Send)] impl PerformCrud for DeleteAccount { - type Response = LoginResponse; + type Response = DeleteAccountResponse; #[tracing::instrument(skip(self, context, _websocket_id))] async fn perform( &self, context: &Data, _websocket_id: Option, - ) -> Result { - let data: &DeleteAccount = self; + ) -> Result { + let data = self; let local_user_view = get_local_user_view_from_jwt(data.auth.as_ref(), context.pool(), context.secret()).await?; @@ -50,11 +50,6 @@ impl PerformCrud for DeleteAccount { }) .await??; - // TODO rework this - Ok(LoginResponse { - jwt: None, - verify_email_sent: false, - registration_created: false, - }) + Ok(DeleteAccountResponse {}) } } diff --git a/crates/apub/src/fetcher/webfinger.rs b/crates/apub/src/fetcher/webfinger.rs index 7fb73889a..388a5ec8e 100644 --- a/crates/apub/src/fetcher/webfinger.rs +++ b/crates/apub/src/fetcher/webfinger.rs @@ -84,9 +84,7 @@ where *request_counter += 1; if *request_counter > context.settings().http_fetch_retry_limit { - return Err(LemmyError::from(anyhow::anyhow!( - "Request retry limit reached" - ))); + return Err(LemmyError::from_message("Request retry limit reached")); } let response = retry(|| context.client().get(&fetch_url).send()).await?; diff --git a/crates/db_schema/src/impls/local_user.rs b/crates/db_schema/src/impls/local_user.rs index a01aee06e..c7696155b 100644 --- a/crates/db_schema/src/impls/local_user.rs +++ b/crates/db_schema/src/impls/local_user.rs @@ -31,6 +31,8 @@ mod safe_settings_type { show_scores, show_read_posts, show_new_post_notifs, + email_verified, + accepted_application, ); impl ToSafeSettings for LocalUser { @@ -54,6 +56,8 @@ mod safe_settings_type { show_scores, show_read_posts, show_new_post_notifs, + email_verified, + accepted_application, ) } } diff --git a/crates/db_schema/src/source/local_user.rs b/crates/db_schema/src/source/local_user.rs index 71d53dd89..88defa6db 100644 --- a/crates/db_schema/src/source/local_user.rs +++ b/crates/db_schema/src/source/local_user.rs @@ -68,4 +68,6 @@ pub struct LocalUserSettings { pub show_scores: bool, pub show_read_posts: bool, pub show_new_post_notifs: bool, + pub email_verified: bool, + pub accepted_application: bool, } diff --git a/crates/db_views/src/registration_application_view.rs b/crates/db_views/src/registration_application_view.rs index 73be84cb8..1a5fc9bbb 100644 --- a/crates/db_views/src/registration_application_view.rs +++ b/crates/db_views/src/registration_application_view.rs @@ -3,25 +3,25 @@ use lemmy_db_schema::{ limit_and_offset, schema::{local_user, person, person_alias_1, registration_application}, source::{ - local_user::LocalUser, + local_user::{LocalUser, LocalUserSettings}, person::{Person, PersonAlias1, PersonSafe, PersonSafeAlias1}, registration_application::RegistrationApplication, }, - traits::{MaybeOptional, ToSafe, ViewToVec}, + traits::{MaybeOptional, ToSafe, ToSafeSettings, ViewToVec}, }; use serde::{Deserialize, Serialize}; #[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] pub struct RegistrationApplicationView { pub registration_application: RegistrationApplication, - pub creator_local_user: LocalUser, + pub creator_local_user: LocalUserSettings, pub creator: PersonSafe, pub admin: Option, } type RegistrationApplicationViewTuple = ( RegistrationApplication, - LocalUser, + LocalUserSettings, PersonSafe, Option, ); @@ -42,7 +42,7 @@ impl RegistrationApplicationView { .order_by(registration_application::published.desc()) .select(( registration_application::all_columns, - local_user::all_columns, + LocalUser::safe_settings_columns_tuple(), Person::safe_columns_tuple(), PersonAlias1::safe_columns_tuple().nullable(), )) @@ -128,7 +128,7 @@ impl<'a> RegistrationApplicationQueryBuilder<'a> { .order_by(registration_application::published.desc()) .select(( registration_application::all_columns, - local_user::all_columns, + LocalUser::safe_settings_columns_tuple(), Person::safe_columns_tuple(), PersonAlias1::safe_columns_tuple().nullable(), )) @@ -179,7 +179,7 @@ mod tests { use lemmy_db_schema::{ establish_unpooled_connection, source::{ - local_user::{LocalUser, LocalUserForm}, + local_user::{LocalUser, LocalUserForm, LocalUserSettings}, person::*, registration_application::{RegistrationApplication, RegistrationApplicationForm}, }, @@ -262,7 +262,25 @@ mod tests { let mut expected_sara_app_view = RegistrationApplicationView { registration_application: sara_app.to_owned(), - creator_local_user: inserted_sara_local_user.to_owned(), + creator_local_user: LocalUserSettings { + id: inserted_sara_local_user.id, + person_id: inserted_sara_local_user.person_id, + email: inserted_sara_local_user.email, + show_nsfw: inserted_sara_local_user.show_nsfw, + theme: inserted_sara_local_user.theme, + default_sort_type: inserted_sara_local_user.default_sort_type, + default_listing_type: inserted_sara_local_user.default_listing_type, + lang: inserted_sara_local_user.lang, + show_avatars: inserted_sara_local_user.show_avatars, + send_notifications_to_email: inserted_sara_local_user.send_notifications_to_email, + validator_time: inserted_sara_local_user.validator_time, + show_bot_accounts: inserted_sara_local_user.show_bot_accounts, + show_scores: inserted_sara_local_user.show_scores, + show_read_posts: inserted_sara_local_user.show_read_posts, + show_new_post_notifs: inserted_sara_local_user.show_new_post_notifs, + email_verified: inserted_sara_local_user.email_verified, + accepted_application: inserted_sara_local_user.accepted_application, + }, creator: PersonSafe { id: inserted_sara_person.id, name: inserted_sara_person.name.to_owned(), diff --git a/crates/websocket/src/lib.rs b/crates/websocket/src/lib.rs index e8dc02645..3035dfe27 100644 --- a/crates/websocket/src/lib.rs +++ b/crates/websocket/src/lib.rs @@ -118,6 +118,7 @@ pub enum UserOperation { ListPostReports, GetReportCount, GetUnreadCount, + VerifyEmail, FollowCommunity, GetReplies, GetPersonMentions, diff --git a/src/api_routes.rs b/src/api_routes.rs index 8e6ad3b2a..88466485b 100644 --- a/src/api_routes.rs +++ b/src/api_routes.rs @@ -211,8 +211,7 @@ pub fn config(cfg: &mut web::ServiceConfig, rate_limit: &RateLimit) { ) .route("/report_count", web::get().to(route_get::)) .route("/unread_count", web::get().to(route_get::)) - // TODO: currently GET for easier testing, but should probably be POST - .route("/verify_email", web::get().to(route_get::)), + .route("/verify_email", web::post().to(route_post::)), ) // Admin Actions .service(