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, ) -> Result, 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, ) -> Result, Status> { let request = request.into_inner(); let mut cache = self.cache().await?; let resp = cache .get_del::<_, Vec>(&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!() } }