AppFlowy-Cloud/src/api/user.rs

64 lines
2.3 KiB
Rust

use crate::biz::user::auth::jwt::{Authorization, UserUuid};
use crate::biz::user::user_info::{get_profile, get_user_workspace_info, update_user};
use crate::biz::user::user_verify::verify_token;
use crate::state::AppState;
use actix_web::web::{Data, Json};
use actix_web::Result;
use actix_web::{web, Scope};
use database_entity::dto::{AFUserProfile, AFUserWorkspaceInfo};
use shared_entity::dto::auth_dto::{SignInTokenResponse, UpdateUserParams};
use shared_entity::response::AppResponseError;
use shared_entity::response::{AppResponse, JsonAppResponse};
pub fn user_scope() -> Scope {
web::scope("/api/user")
.service(web::resource("/verify/{access_token}").route(web::get().to(verify_user_handler)))
.service(web::resource("/update").route(web::post().to(update_user_handler)))
.service(web::resource("/profile").route(web::get().to(get_user_profile_handler)))
.service(web::resource("/workspace").route(web::get().to(get_user_workspace_info_handler)))
}
#[tracing::instrument(skip(state, path), err)]
async fn verify_user_handler(
path: web::Path<String>,
state: Data<AppState>,
) -> Result<JsonAppResponse<SignInTokenResponse>> {
let access_token = path.into_inner();
let is_new = verify_token(&access_token, state.as_ref())
.await
.map_err(AppResponseError::from)?;
let resp = SignInTokenResponse { is_new };
Ok(AppResponse::Ok().with_data(resp).into())
}
#[tracing::instrument(skip(state), err)]
async fn get_user_profile_handler(
uuid: UserUuid,
state: Data<AppState>,
) -> Result<JsonAppResponse<AFUserProfile>> {
let profile = get_profile(&state.pg_pool, &uuid)
.await
.map_err(AppResponseError::from)?;
Ok(AppResponse::Ok().with_data(profile).into())
}
#[tracing::instrument(skip(state), err)]
async fn get_user_workspace_info_handler(
uuid: UserUuid,
state: Data<AppState>,
) -> Result<JsonAppResponse<AFUserWorkspaceInfo>> {
let info = get_user_workspace_info(&state.pg_pool, &uuid).await?;
Ok(AppResponse::Ok().with_data(info).into())
}
#[tracing::instrument(skip(state, auth, payload), err)]
async fn update_user_handler(
auth: Authorization,
payload: Json<UpdateUserParams>,
state: Data<AppState>,
) -> Result<JsonAppResponse<()>> {
let params = payload.into_inner();
update_user(&state.pg_pool, auth.uuid()?, params).await?;
Ok(AppResponse::Ok().into())
}