feat: implement magic link sign in (#5036)

This commit is contained in:
Lucas.Xu
2024-04-11 16:33:28 +08:00
committed by GitHub
parent b7b4ea2da1
commit 1597f7d94c
81 changed files with 599 additions and 473 deletions

View File

@ -77,6 +77,15 @@ impl TryInto<SignUpParams> for SignUpPayloadPB {
}
}
#[derive(ProtoBuf, Default)]
pub struct MagicLinkSignInPB {
#[pb(index = 1)]
pub email: String,
#[pb(index = 2)]
pub redirect_to: String,
}
#[derive(ProtoBuf, Default)]
pub struct OauthSignInPB {
/// Use this field to store the third party auth information.

View File

@ -288,6 +288,19 @@ pub async fn get_user_setting(
data_result_ok(user_setting)
}
#[tracing::instrument(level = "debug", skip(data, manager), err)]
pub async fn sign_in_with_magic_link_handler(
data: AFPluginData<MagicLinkSignInPB>,
manager: AFPluginState<Weak<UserManager>>,
) -> Result<(), FlowyError> {
let manager = upgrade_manager(manager)?;
let params = data.into_inner();
manager
.sign_in_with_magic_link(&params.email, &params.redirect_to)
.await?;
Ok(())
}
#[tracing::instrument(level = "debug", skip(data, manager), err)]
pub async fn oauth_sign_in_handler(
data: AFPluginData<OauthSignInPB>,

View File

@ -23,6 +23,7 @@ pub fn init(user_manager: Weak<UserManager>) -> AFPlugin {
.state(user_manager)
.state(store_preferences)
.event(UserEvent::SignInWithEmailPassword, sign_in_with_email_password_handler)
.event(UserEvent::MagicLinkSignIn, sign_in_with_magic_link_handler)
.event(UserEvent::SignUp, sign_up)
.event(UserEvent::InitUser, init_user_handler)
.event(UserEvent::GetUserProfile, get_user_profile_handler)
@ -226,6 +227,9 @@ pub enum UserEvent {
#[event(input = "AcceptWorkspaceInvitationPB")]
AcceptWorkspaceInvitation = 49,
#[event(input = "MagicLinkSignInPB", output = "UserProfilePB")]
MagicLinkSignIn = 50,
}
pub trait UserStatusCallback: Send + Sync + 'static {

View File

@ -672,6 +672,18 @@ impl UserManager {
Ok(url)
}
pub(crate) async fn sign_in_with_magic_link(
&self,
email: &str,
redirect_to: &str,
) -> Result<(), FlowyError> {
let auth_service = self.cloud_services.get_user_service()?;
auth_service
.sign_in_with_magic_link(email, redirect_to)
.await
.map_err(|err| FlowyError::server_error().with_context(err))
}
pub(crate) async fn generate_oauth_url(
&self,
oauth_provider: &str,