parent
9918a6fe43
commit
17093de469
|
|
@ -71,6 +71,7 @@ services:
|
||||||
appflowy_cloud:
|
appflowy_cloud:
|
||||||
restart: on-failure
|
restart: on-failure
|
||||||
environment:
|
environment:
|
||||||
|
- RUST_LOG=trace
|
||||||
- APP_ENVIRONMENT=production
|
- APP_ENVIRONMENT=production
|
||||||
- APP__GOTRUE__JWT_SECRET=${GOTRUE_JWT_SECRET}
|
- APP__GOTRUE__JWT_SECRET=${GOTRUE_JWT_SECRET}
|
||||||
- APP__GOTRUE__EXT_URL=${API_EXTERNAL_URL}
|
- APP__GOTRUE__EXT_URL=${API_EXTERNAL_URL}
|
||||||
|
|
|
||||||
|
|
@ -163,7 +163,12 @@ where
|
||||||
|
|
||||||
let is_done = pending_msg.set_state(self.uid, MessageState::Done);
|
let is_done = pending_msg.set_state(self.uid, MessageState::Done);
|
||||||
if is_done {
|
if is_done {
|
||||||
trace!("[Client {}]: Did send: {}:{}", self.uid, object_id, msg_id);
|
trace!(
|
||||||
|
"[Client {}]: did send oid:{}|msg_id{} ",
|
||||||
|
self.uid,
|
||||||
|
object_id,
|
||||||
|
msg_id
|
||||||
|
);
|
||||||
self.notify();
|
self.notify();
|
||||||
}
|
}
|
||||||
is_done
|
is_done
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,7 @@ use shared_entity::dto::UserUpdateParams;
|
||||||
use shared_entity::dto::WorkspaceMembersParams;
|
use shared_entity::dto::WorkspaceMembersParams;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use std::time::SystemTime;
|
use std::time::SystemTime;
|
||||||
|
use tracing::instrument;
|
||||||
|
|
||||||
use gotrue_entity::{AccessTokenResponse, User};
|
use gotrue_entity::{AccessTokenResponse, User};
|
||||||
|
|
||||||
|
|
@ -153,6 +154,7 @@ impl Client {
|
||||||
/// - `Ok(String)`: A `String` containing the constructed authorization URL if the specified provider is available.
|
/// - `Ok(String)`: A `String` containing the constructed authorization URL if the specified provider is available.
|
||||||
/// - `Err(AppError)`: An `AppError` indicating either the OAuth provider is invalid or other issues occurred while fetching settings.
|
/// - `Err(AppError)`: An `AppError` indicating either the OAuth provider is invalid or other issues occurred while fetching settings.
|
||||||
///
|
///
|
||||||
|
#[instrument(level = "debug", skip_all, err)]
|
||||||
pub async fn generate_oauth_url_with_provider(
|
pub async fn generate_oauth_url_with_provider(
|
||||||
&self,
|
&self,
|
||||||
provider: &OAuthProvider,
|
provider: &OAuthProvider,
|
||||||
|
|
@ -172,6 +174,7 @@ impl Client {
|
||||||
/// Returns an OAuth URL by constructing the authorization URL for the specified provider.
|
/// Returns an OAuth URL by constructing the authorization URL for the specified provider.
|
||||||
/// The URL looks like, e.g., `appflowy-flutter://#access_token=...&expires_in=3600&provider_token=...&refresh_token=...&token_type=bearer`.
|
/// The URL looks like, e.g., `appflowy-flutter://#access_token=...&expires_in=3600&provider_token=...&refresh_token=...&token_type=bearer`.
|
||||||
///
|
///
|
||||||
|
#[instrument(level = "debug", skip_all, err)]
|
||||||
pub async fn generate_sign_in_url_with_email(
|
pub async fn generate_sign_in_url_with_email(
|
||||||
&self,
|
&self,
|
||||||
admin_user_email: &str,
|
admin_user_email: &str,
|
||||||
|
|
@ -210,6 +213,7 @@ impl Client {
|
||||||
Ok((user, is_new))
|
Ok((user, is_new))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[instrument(level = "debug", skip_all, err)]
|
||||||
#[inline]
|
#[inline]
|
||||||
async fn verify_token_cloud(&self, access_token: &str) -> Result<bool, AppError> {
|
async fn verify_token_cloud(&self, access_token: &str) -> Result<bool, AppError> {
|
||||||
let url = format!("{}/api/user/verify/{}", self.base_url, access_token);
|
let url = format!("{}/api/user/verify/{}", self.base_url, access_token);
|
||||||
|
|
@ -218,6 +222,7 @@ impl Client {
|
||||||
Ok(sign_in_resp.is_new)
|
Ok(sign_in_resp.is_new)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[instrument(level = "debug", skip_all, err)]
|
||||||
pub async fn create_magic_link(&self, email: &str, password: &str) -> Result<User, AppError> {
|
pub async fn create_magic_link(&self, email: &str, password: &str) -> Result<User, AppError> {
|
||||||
let user = self
|
let user = self
|
||||||
.gotrue_client
|
.gotrue_client
|
||||||
|
|
@ -234,6 +239,7 @@ impl Client {
|
||||||
Ok(user)
|
Ok(user)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[instrument(level = "debug", skip_all, err)]
|
||||||
pub async fn create_email_verified_user(
|
pub async fn create_email_verified_user(
|
||||||
&self,
|
&self,
|
||||||
email: &str,
|
email: &str,
|
||||||
|
|
@ -297,6 +303,7 @@ impl Client {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[instrument(level = "debug", skip_all, err)]
|
||||||
pub async fn profile(&self) -> Result<AFUserProfileView, AppError> {
|
pub async fn profile(&self) -> Result<AFUserProfileView, AppError> {
|
||||||
let url = format!("{}/api/user/profile", self.base_url);
|
let url = format!("{}/api/user/profile", self.base_url);
|
||||||
let resp = self
|
let resp = self
|
||||||
|
|
@ -309,6 +316,7 @@ impl Client {
|
||||||
.into_data()
|
.into_data()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[instrument(level = "debug", skip_all, err)]
|
||||||
pub async fn workspaces(&self) -> Result<AFWorkspaces, AppError> {
|
pub async fn workspaces(&self) -> Result<AFWorkspaces, AppError> {
|
||||||
let url = format!("{}/api/workspace/list", self.base_url);
|
let url = format!("{}/api/workspace/list", self.base_url);
|
||||||
let resp = self
|
let resp = self
|
||||||
|
|
@ -321,6 +329,7 @@ impl Client {
|
||||||
.into_data()
|
.into_data()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[instrument(level = "debug", skip_all, err)]
|
||||||
pub async fn get_workspace_members(
|
pub async fn get_workspace_members(
|
||||||
&self,
|
&self,
|
||||||
workspace_uuid: uuid::Uuid,
|
workspace_uuid: uuid::Uuid,
|
||||||
|
|
@ -339,6 +348,7 @@ impl Client {
|
||||||
.into_data()
|
.into_data()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[instrument(level = "debug", skip_all, err)]
|
||||||
pub async fn add_workspace_members(
|
pub async fn add_workspace_members(
|
||||||
&self,
|
&self,
|
||||||
workspace_uuid: uuid::Uuid,
|
workspace_uuid: uuid::Uuid,
|
||||||
|
|
@ -359,6 +369,7 @@ impl Client {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[instrument(level = "debug", skip_all, err)]
|
||||||
pub async fn remove_workspace_members(
|
pub async fn remove_workspace_members(
|
||||||
&self,
|
&self,
|
||||||
workspace_uuid: uuid::Uuid,
|
workspace_uuid: uuid::Uuid,
|
||||||
|
|
@ -379,6 +390,7 @@ impl Client {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[instrument(level = "debug", skip_all, err)]
|
||||||
pub async fn sign_in_password(&self, email: &str, password: &str) -> Result<bool, AppError> {
|
pub async fn sign_in_password(&self, email: &str, password: &str) -> Result<bool, AppError> {
|
||||||
let access_token_resp = self
|
let access_token_resp = self
|
||||||
.gotrue_client
|
.gotrue_client
|
||||||
|
|
@ -399,6 +411,7 @@ impl Client {
|
||||||
/// This function attempts to refresh the access token by sending a request to the authentication server
|
/// This function attempts to refresh the access token by sending a request to the authentication server
|
||||||
/// using the stored refresh token. If successful, it updates the stored access token with the new one
|
/// using the stored refresh token. If successful, it updates the stored access token with the new one
|
||||||
/// received from the server.
|
/// received from the server.
|
||||||
|
#[instrument(level = "debug", skip_all, err)]
|
||||||
pub async fn refresh(&self) -> Result<(), AppError> {
|
pub async fn refresh(&self) -> Result<(), AppError> {
|
||||||
let refresh_token = self
|
let refresh_token = self
|
||||||
.token
|
.token
|
||||||
|
|
@ -416,6 +429,7 @@ impl Client {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[instrument(level = "debug", skip_all, err)]
|
||||||
pub async fn sign_up(&self, email: &str, password: &str) -> Result<(), AppError> {
|
pub async fn sign_up(&self, email: &str, password: &str) -> Result<(), AppError> {
|
||||||
match self.gotrue_client.sign_up(email, password).await? {
|
match self.gotrue_client.sign_up(email, password).await? {
|
||||||
Authenticated(access_token_resp) => {
|
Authenticated(access_token_resp) => {
|
||||||
|
|
@ -429,11 +443,13 @@ impl Client {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[instrument(level = "debug", skip_all, err)]
|
||||||
pub async fn sign_out(&self) -> Result<(), AppError> {
|
pub async fn sign_out(&self) -> Result<(), AppError> {
|
||||||
self.gotrue_client.logout(&self.access_token()?).await?;
|
self.gotrue_client.logout(&self.access_token()?).await?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[instrument(level = "debug", skip_all, err)]
|
||||||
pub async fn update(&self, params: UserUpdateParams) -> Result<(), AppError> {
|
pub async fn update(&self, params: UserUpdateParams) -> Result<(), AppError> {
|
||||||
let updated_user = self
|
let updated_user = self
|
||||||
.gotrue_client
|
.gotrue_client
|
||||||
|
|
@ -448,6 +464,7 @@ impl Client {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[instrument(level = "debug", skip_all, err)]
|
||||||
pub async fn update_user_name(&self, new_name: &str) -> Result<(), AppError> {
|
pub async fn update_user_name(&self, new_name: &str) -> Result<(), AppError> {
|
||||||
let url = format!("{}/api/user/update", self.base_url);
|
let url = format!("{}/api/user/update", self.base_url);
|
||||||
let params = UpdateUsernameParams {
|
let params = UpdateUsernameParams {
|
||||||
|
|
@ -462,6 +479,7 @@ impl Client {
|
||||||
AppResponse::<()>::from_response(resp).await?.into_error()
|
AppResponse::<()>::from_response(resp).await?.into_error()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[instrument(level = "debug", skip_all, err)]
|
||||||
pub async fn create_collab(&self, params: InsertCollabParams) -> Result<(), AppError> {
|
pub async fn create_collab(&self, params: InsertCollabParams) -> Result<(), AppError> {
|
||||||
let url = format!("{}/api/collab/", self.base_url);
|
let url = format!("{}/api/collab/", self.base_url);
|
||||||
let resp = self
|
let resp = self
|
||||||
|
|
@ -473,6 +491,7 @@ impl Client {
|
||||||
AppResponse::<()>::from_response(resp).await?.into_error()
|
AppResponse::<()>::from_response(resp).await?.into_error()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[instrument(level = "debug", skip_all, err)]
|
||||||
pub async fn update_collab(&self, params: InsertCollabParams) -> Result<(), AppError> {
|
pub async fn update_collab(&self, params: InsertCollabParams) -> Result<(), AppError> {
|
||||||
let url = format!("{}/api/collab/", self.base_url);
|
let url = format!("{}/api/collab/", self.base_url);
|
||||||
let resp = self
|
let resp = self
|
||||||
|
|
@ -484,6 +503,7 @@ impl Client {
|
||||||
AppResponse::<()>::from_response(resp).await?.into_error()
|
AppResponse::<()>::from_response(resp).await?.into_error()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[instrument(level = "debug", skip_all, err)]
|
||||||
pub async fn get_collab(&self, params: QueryCollabParams) -> Result<RawData, AppError> {
|
pub async fn get_collab(&self, params: QueryCollabParams) -> Result<RawData, AppError> {
|
||||||
let url = format!("{}/api/collab/", self.base_url);
|
let url = format!("{}/api/collab/", self.base_url);
|
||||||
let resp = self
|
let resp = self
|
||||||
|
|
@ -497,6 +517,7 @@ impl Client {
|
||||||
.into_data()
|
.into_data()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[instrument(level = "debug", skip_all, err)]
|
||||||
pub async fn delete_collab(&self, params: DeleteCollabParams) -> Result<(), AppError> {
|
pub async fn delete_collab(&self, params: DeleteCollabParams) -> Result<(), AppError> {
|
||||||
let url = format!("{}/api/collab/", self.base_url);
|
let url = format!("{}/api/collab/", self.base_url);
|
||||||
let resp = self
|
let resp = self
|
||||||
|
|
|
||||||
|
|
@ -192,7 +192,7 @@ impl WSClient {
|
||||||
.channels
|
.channels
|
||||||
.write()
|
.write()
|
||||||
.entry(business_id)
|
.entry(business_id)
|
||||||
.or_insert_with(HashMap::new)
|
.or_default()
|
||||||
.insert(object_id, Arc::downgrade(&channel));
|
.insert(object_id, Arc::downgrade(&channel));
|
||||||
Ok(channel)
|
Ok(channel)
|
||||||
}
|
}
|
||||||
|
|
@ -221,7 +221,6 @@ impl WSClient {
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn set_state(&self, state: ConnectState) {
|
async fn set_state(&self, state: ConnectState) {
|
||||||
trace!("websocket state: {:?}", state);
|
|
||||||
self.state_notify.lock().set_state(state);
|
self.state_notify.lock().set_state(state);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -51,8 +51,6 @@ impl ServerFixIntervalPing {
|
||||||
loop {
|
loop {
|
||||||
tokio::select! {
|
tokio::select! {
|
||||||
_ = interval.tick() => {
|
_ = interval.tick() => {
|
||||||
// Send the ping
|
|
||||||
tracing::trace!("🟢ping from client");
|
|
||||||
let _ = sender.send(Message::Ping(vec![]));
|
let _ = sender.send(Message::Ping(vec![]));
|
||||||
if let Some(ping_count) = weak_ping_count.upgrade() {
|
if let Some(ping_count) = weak_ping_count.upgrade() {
|
||||||
let mut lock = ping_count.lock().await;
|
let mut lock = ping_count.lock().await;
|
||||||
|
|
@ -67,7 +65,6 @@ impl ServerFixIntervalPing {
|
||||||
},
|
},
|
||||||
msg = receiver.recv() => {
|
msg = receiver.recv() => {
|
||||||
if let Ok(Message::Pong(_)) = msg {
|
if let Ok(Message::Pong(_)) = msg {
|
||||||
tracing::trace!("🟢pong from server");
|
|
||||||
if let Some(ping_count) = weak_ping_count.upgrade() {
|
if let Some(ping_count) = weak_ping_count.upgrade() {
|
||||||
let mut lock = ping_count.lock().await;
|
let mut lock = ping_count.lock().await;
|
||||||
*lock = 0;
|
*lock = 0;
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@ impl ConnectStateNotify {
|
||||||
|
|
||||||
pub(crate) fn set_state(&mut self, state: ConnectState) {
|
pub(crate) fn set_state(&mut self, state: ConnectState) {
|
||||||
if self.state != state {
|
if self.state != state {
|
||||||
tracing::trace!("[🙂Client]: connect state changed to {:?}", state);
|
tracing::trace!("[WS]: {:?}", state);
|
||||||
self.state = state.clone();
|
self.state = state.clone();
|
||||||
let _ = self.sender.send(state);
|
let _ = self.sender.send(state);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
#[derive(Debug, thiserror::Error)]
|
#[derive(Debug, thiserror::Error)]
|
||||||
pub enum DatabaseError {
|
pub enum DatabaseError {
|
||||||
#[error("Record not found")]
|
#[error("Database not found")]
|
||||||
RecordNotFound,
|
RecordNotFound,
|
||||||
|
|
||||||
#[error(transparent)]
|
#[error(transparent)]
|
||||||
|
|
|
||||||
|
|
@ -26,7 +26,7 @@ impl AppError {
|
||||||
|
|
||||||
impl Display for AppError {
|
impl Display for AppError {
|
||||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||||
write!(f, "{}", self.message)
|
f.write_fmt(format_args!("code:{} msg: {}", self.code, self.message))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -43,5 +43,5 @@ fn name_from_user_metadata(value: &serde_json::Value) -> String {
|
||||||
.or(value.get("nickname"))
|
.or(value.get("nickname"))
|
||||||
.and_then(serde_json::Value::as_str)
|
.and_then(serde_json::Value::as_str)
|
||||||
.map(str::to_string)
|
.map(str::to_string)
|
||||||
.unwrap_or(String::new())
|
.unwrap_or_default()
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue