summaryrefslogtreecommitdiffstats
path: root/crates/users-service/src
diff options
context:
space:
mode:
Diffstat (limited to 'crates/users-service/src')
-rw-r--r--crates/users-service/src/server/manager.rs64
1 files changed, 57 insertions, 7 deletions
diff --git a/crates/users-service/src/server/manager.rs b/crates/users-service/src/server/manager.rs
index 6affb4a..6738123 100644
--- a/crates/users-service/src/server/manager.rs
+++ b/crates/users-service/src/server/manager.rs
@@ -1,15 +1,55 @@
use prost::Message;
use sellershut_core::users::{
- CompleteUserRequest, CreateUserRequest, CreateUserResponse, User,
+ CompleteUserRequest, CreateUserRequest, CreateUserResponse, User, UserType,
users_service_server::UsersService,
};
use stack_up::redis::AsyncCommands;
+use time::OffsetDateTime;
use tonic::{Request, Response, Status, async_trait};
use tracing::{error, trace};
use uuid::Uuid;
use crate::state::AppHandle;
+struct DbUser {
+ id: String,
+ username: String,
+ inbox: String,
+ outbox: String,
+ email: Option<String>,
+ avatar: Option<String>,
+ created_at: OffsetDateTime,
+ updated_at: OffsetDateTime,
+ description: Option<String>,
+ user_type: String,
+ public_key: String,
+ local: bool,
+}
+
+impl TryFrom<DbUser> for User {
+ type Error = Status;
+
+ fn try_from(value: DbUser) -> Result<Self, Self::Error> {
+ let user_type = UserType::from_str_name(&value.user_type)
+ .ok_or_else(|| Status::internal("invalid user type"))?
+ .into();
+ Ok(Self {
+ id: value.id,
+ email: value.email,
+ username: value.username,
+ avatar: value.avatar,
+ created_at: Some(value.created_at.into()),
+ updated_at: Some(value.updated_at.into()),
+ description: value.description,
+ user_type,
+ public_key: value.public_key,
+ inbox: value.inbox,
+ outbox: value.outbox,
+ local: value.local,
+ })
+ }
+}
+
#[async_trait]
impl UsersService for AppHandle {
#[doc = " Create a new user profile"]
@@ -54,7 +94,8 @@ impl UsersService for AppHandle {
let create_user = CreateUserRequest::decode(resp.as_ref())
.map_err(|_e| Status::data_loss("internal data corrupted"))?;
- let user = sqlx::query!(
+ let user = sqlx::query_as!(
+ DbUser,
"insert
into
profile (
@@ -63,12 +104,14 @@ impl UsersService for AppHandle {
inbox,
outbox,
local,
- avatar_url,
+ avatar,
description,
user_type,
- public_key
+ public_key,
+ email
)
- values ($1, $2, $3, $4, $5, $6, $7, $8, $9)
+ values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10)
+ returning *
",
request.id,
request.username,
@@ -79,7 +122,14 @@ impl UsersService for AppHandle {
request.description,
request.user_type.to_string(),
request.public_key,
- );
- todo!()
+ create_user.email,
+ )
+ .fetch_one(&self.services.postgres)
+ .await
+ .map_err(|_e| Status::internal("storage error"))?;
+
+ let user = User::try_from(user)?;
+
+ Ok(Response::new(user))
}
}