summaryrefslogtreecommitdiffstats
path: root/crates/users-service/src/server/manager.rs
diff options
context:
space:
mode:
authorrtkay123 <dev@kanjala.com>2025-07-27 18:16:41 +0200
committerrtkay123 <dev@kanjala.com>2025-07-27 18:16:41 +0200
commit3c4d17cf2840c643b8cd111ef775750cc5ae83b3 (patch)
tree2b7d25b24d94141a6d9255426d4f973cced5d278 /crates/users-service/src/server/manager.rs
parente26d87f4fa18999c6bcfbcf32cfa85adab11acdd (diff)
downloadsellershut-3c4d17cf2840c643b8cd111ef775750cc5ae83b3.tar.bz2
sellershut-3c4d17cf2840c643b8cd111ef775750cc5ae83b3.zip
refactor: profile -> users
Diffstat (limited to 'crates/users-service/src/server/manager.rs')
-rw-r--r--crates/users-service/src/server/manager.rs85
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!()
+ }
+}