Skip to content

Commit ce7c9af

Browse files
authored
feat: implemented fetch me project user (#181)
1 parent 1148af3 commit ce7c9af

File tree

3 files changed

+95
-1
lines changed

3 files changed

+95
-1
lines changed

Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/domain/project/command.rs

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -321,6 +321,37 @@ pub async fn fetch_user(
321321
Ok(project_users_aggregated)
322322
}
323323

324+
pub async fn fetch_me_user(
325+
cache: Arc<dyn ProjectDrivenCache>,
326+
auth0: Arc<dyn Auth0Driven>,
327+
cmd: FetchMeUserCmd,
328+
) -> Result<ProjectUserAggregated> {
329+
let user_id = assert_credential(&cmd.credential)?;
330+
assert_permission(cache.clone(), &cmd.credential, &cmd.project_id, None).await?;
331+
332+
let Some(project_user) = cache
333+
.find_user_permission(&user_id, &cmd.project_id)
334+
.await?
335+
else {
336+
return Err(Error::CommandMalformed(
337+
"invalid project and user id".into(),
338+
));
339+
};
340+
341+
let profile = auth0.find_info(&project_user.user_id).await?;
342+
343+
let project_user_aggregated = ProjectUserAggregated {
344+
user_id: project_user.user_id.clone(),
345+
project_id: project_user.project_id,
346+
name: profile.name,
347+
email: profile.email,
348+
role: project_user.role,
349+
created_at: project_user.created_at,
350+
};
351+
352+
Ok(project_user_aggregated)
353+
}
354+
324355
pub async fn delete_user(
325356
cache: Arc<dyn ProjectDrivenCache>,
326357
event: Arc<dyn EventDrivenBridge>,
@@ -731,6 +762,20 @@ impl FetchUserCmd {
731762
}
732763
}
733764

765+
#[derive(Debug, Clone)]
766+
pub struct FetchMeUserCmd {
767+
pub credential: Credential,
768+
pub project_id: String,
769+
}
770+
impl FetchMeUserCmd {
771+
pub fn new(credential: Credential, project_id: String) -> Result<Self> {
772+
Ok(Self {
773+
credential,
774+
project_id,
775+
})
776+
}
777+
}
778+
734779
#[derive(Debug, Clone)]
735780
pub struct DeleteUserCmd {
736781
pub credential: Credential,
@@ -992,6 +1037,14 @@ mod tests {
9921037
}
9931038
}
9941039
}
1040+
impl Default for FetchMeUserCmd {
1041+
fn default() -> Self {
1042+
Self {
1043+
credential: Credential::Auth0("user id".into()),
1044+
project_id: Uuid::new_v4().to_string(),
1045+
}
1046+
}
1047+
}
9951048
impl Default for DeleteUserCmd {
9961049
fn default() -> Self {
9971050
Self {
@@ -1837,4 +1890,22 @@ mod tests {
18371890
let result = delete(Arc::new(cache), Arc::new(event), cmd).await;
18381891
assert!(result.is_err());
18391892
}
1893+
1894+
#[tokio::test]
1895+
async fn it_should_fetch_me_project_user() {
1896+
let mut cache = MockProjectDrivenCache::new();
1897+
cache
1898+
.expect_find_user_permission()
1899+
.returning(|_, _| Ok(Some(ProjectUser::default())));
1900+
1901+
let mut auth0 = MockAuth0Driven::new();
1902+
auth0
1903+
.expect_find_info()
1904+
.return_once(|_| Ok(Auth0Profile::default()));
1905+
1906+
let cmd = FetchMeUserCmd::default();
1907+
1908+
let result = fetch_me_user(Arc::new(cache), Arc::new(auth0), cmd).await;
1909+
assert!(result.is_ok());
1910+
}
18401911
}

src/drivers/grpc/project.rs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,29 @@ impl proto::project_service_server::ProjectService for ProjectServiceImpl {
281281

282282
Ok(tonic::Response::new(message))
283283
}
284+
async fn fetch_me_project_user(
285+
&self,
286+
request: tonic::Request<proto::FetchMeProjectUserRequest>,
287+
) -> Result<tonic::Response<proto::FetchMeProjectUserResponse>, tonic::Status> {
288+
let credential = match request.extensions().get::<Credential>() {
289+
Some(credential) => credential.clone(),
290+
None => return Err(Status::unauthenticated("invalid credential")),
291+
};
292+
293+
let req = request.into_inner();
294+
295+
let cmd = project::command::FetchMeUserCmd::new(credential, req.project_id)?;
296+
297+
let user =
298+
project::command::fetch_me_user(self.cache.clone(), self.auth0.clone(), cmd.clone())
299+
.await?;
300+
301+
let message = proto::FetchMeProjectUserResponse {
302+
records: vec![user.into()],
303+
};
304+
305+
Ok(tonic::Response::new(message))
306+
}
284307
async fn fetch_project_user_invites(
285308
&self,
286309
request: tonic::Request<proto::FetchProjectUserInvitesRequest>,

0 commit comments

Comments
 (0)