diff options
Diffstat (limited to 'crates/users-service/src/server/manager.rs')
-rw-r--r-- | crates/users-service/src/server/manager.rs | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/crates/users-service/src/server/manager.rs b/crates/users-service/src/server/manager.rs new file mode 100644 index 0000000..6affb4a --- /dev/null +++ b/crates/users-service/src/server/manager.rs @@ -0,0 +1,85 @@ +use prost::Message; +use sellershut_core::users::{ + CompleteUserRequest, CreateUserRequest, CreateUserResponse, User, + users_service_server::UsersService, +}; +use stack_up::redis::AsyncCommands; +use tonic::{Request, Response, Status, async_trait}; +use tracing::{error, trace}; +use uuid::Uuid; + +use crate::state::AppHandle; + +#[async_trait] +impl UsersService for AppHandle { + #[doc = " Create a new user profile"] + async fn create_user( + &self, + request: Request<CreateUserRequest>, + ) -> Result<Response<CreateUserResponse>, Status> { + trace!("creating user"); + let data = request.into_inner(); + let id = Uuid::now_v7().to_string(); + + let bytes = data.encode_to_vec(); + let mut cache = self.cache().await?; + cache + .set_ex::<_, _, ()>(&id, &bytes, self.local_config.temp_ttl) + .await + .inspect_err(|e| error!("{e}")) + .map_err(|_e| Status::internal("storage not ready"))?; + + Ok(Response::new(CreateUserResponse { temp_id: id })) + } + + #[doc = " Complete Profile"] + async fn complete_user( + &self, + request: Request<CompleteUserRequest>, + ) -> Result<Response<User>, Status> { + let request = request.into_inner(); + + let mut cache = self.cache().await?; + + let resp = cache + .get_del::<_, Vec<u8>>(&request.id) + .await + .inspect_err(|e| error!("{e}")) + .map_err(|_e| Status::internal("storage not ready"))?; + + if resp.is_empty() { + return Err(Status::data_loss("user unavailable")); + } + + let create_user = CreateUserRequest::decode(resp.as_ref()) + .map_err(|_e| Status::data_loss("internal data corrupted"))?; + + let user = sqlx::query!( + "insert + into + profile ( + id, + username, + inbox, + outbox, + local, + avatar_url, + description, + user_type, + public_key + ) + values ($1, $2, $3, $4, $5, $6, $7, $8, $9) + ", + request.id, + request.username, + request.inbox, + request.outbox, + request.local, + request.avatar.or(create_user.avatar), + request.description, + request.user_type.to_string(), + request.public_key, + ); + todo!() + } +} |