Skip to content

Commit

Permalink
Merge pull request #153 from sohosai/feature/user-with-project
Browse files Browse the repository at this point in the history
ユーザーを取得したときに、そのユーザーが所有する企画を返すように
  • Loading branch information
appare45 authored Apr 7, 2024
2 parents 2608d32 + 1dca968 commit 4a52a13
Show file tree
Hide file tree
Showing 5 changed files with 67 additions and 10 deletions.
5 changes: 5 additions & 0 deletions crates/sos24-presentation/src/model/user.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
use serde::{Deserialize, Serialize};

use sos24_use_case::dto::user::{CreateUserDto, UpdateUserDto, UserDto, UserRoleDto};

#[derive(Debug, Serialize, Deserialize)]
Expand Down Expand Up @@ -62,6 +63,8 @@ pub struct User {
pub email: String,
pub phone_number: String,
pub role: UserRole,
pub owned_project_id: Option<String>,
pub owned_project_title: Option<String>,
pub created_at: String,
pub updated_at: String,
pub deleted_at: Option<String>,
Expand All @@ -76,6 +79,8 @@ impl From<UserDto> for User {
email: value.email,
phone_number: value.phone_number,
role: value.role.into(),
owned_project_id: value.owned_project_id,
owned_project_title: value.owned_project_title,
created_at: value.created_at.to_rfc3339(),
updated_at: value.updated_at.to_rfc3339(),
deleted_at: value.deleted_at.map(|it| it.to_rfc3339()),
Expand Down
26 changes: 20 additions & 6 deletions crates/sos24-use-case/src/dto/user.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
use sos24_domain::entity::project::Project;
use sos24_domain::entity::{
common::date::WithDate,
user::{User, UserEmail, UserId, UserKanaName, UserName, UserPhoneNumber, UserRole},
Expand Down Expand Up @@ -87,25 +88,37 @@ pub struct UserDto {
pub email: String,
pub phone_number: String,
pub role: UserRoleDto,
pub owned_project_id: Option<String>,
pub owned_project_title: Option<String>,
pub created_at: chrono::DateTime<chrono::Utc>,
pub updated_at: chrono::DateTime<chrono::Utc>,
pub deleted_at: Option<chrono::DateTime<chrono::Utc>>,
}

impl FromEntity for UserDto {
type Entity = WithDate<User>;
fn from_entity(entity: Self::Entity) -> Self {
let user = entity.value.destruct();
type Entity = (WithDate<User>, Option<WithDate<Project>>);
fn from_entity((user_entity, project_entity): Self::Entity) -> Self {
let user = user_entity.value.destruct();
let (project_id, project_title) = match project_entity {
Some(project) => {
let project = project.value.destruct();
(Some(project.id.value()), Some(project.title.value()))
}
None => (None, None),
};

Self {
id: user.id.value(),
name: user.name.value(),
kana_name: user.kana_name.value(),
email: user.email.value(),
phone_number: user.phone_number.value(),
role: UserRoleDto::from_entity(user.role),
created_at: entity.created_at,
updated_at: entity.updated_at,
deleted_at: entity.deleted_at,
owned_project_id: project_id.map(|id| id.to_string()),
owned_project_title: project_title,
created_at: user_entity.created_at,
updated_at: user_entity.updated_at,
deleted_at: user_entity.deleted_at,
}
}
}
Expand Down Expand Up @@ -142,6 +155,7 @@ impl FromEntity for UserRoleDto {
}
}
}

impl std::fmt::Display for UserRoleDto {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Expand Down
34 changes: 32 additions & 2 deletions crates/sos24-use-case/src/interactor/user/find_by_id.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ use sos24_domain::entity::permission::PermissionDeniedError;
use sos24_domain::entity::user::UserId;
use sos24_domain::repository::{user::UserRepository, Repositories};

use crate::context::Context;
use crate::context::{Context, OwnedProject};
use crate::dto::user::UserDto;
use crate::dto::FromEntity;
use crate::interactor::user::{UserUseCase, UserUseCaseError};
Expand All @@ -21,8 +21,14 @@ impl<R: Repositories> UserUseCase<R> {
.await?
.ok_or(UserUseCaseError::NotFound(id.clone()))?;

let raw_project = match ctx.project(Arc::clone(&self.repositories)).await? {
Some(OwnedProject::Owner(project)) => Some(project),
Some(OwnedProject::SubOwner(project)) => Some(project),
None => None,
};

if raw_user.value.is_visible_to(&actor) {
Ok(UserDto::from_entity(raw_user))
Ok(UserDto::from_entity((raw_user, raw_project)))
} else {
Err(UserUseCaseError::PermissionDeniedError(
PermissionDeniedError,
Expand Down Expand Up @@ -53,6 +59,14 @@ mod tests {
UserRole::General,
))))
});
repositories
.project_repository_mut()
.expect_find_by_owner_id()
.returning(|_| Ok(None));
repositories
.project_repository_mut()
.expect_find_by_sub_owner_id()
.returning(|_| Ok(None));
let use_case = UserUseCase::new(Arc::new(repositories));

let ctx = Context::with_actor(fixture::actor::actor1(UserRole::General));
Expand All @@ -73,6 +87,14 @@ mod tests {
UserRole::General,
))))
});
repositories
.project_repository_mut()
.expect_find_by_owner_id()
.returning(|_| Ok(None));
repositories
.project_repository_mut()
.expect_find_by_sub_owner_id()
.returning(|_| Ok(None));
let use_case = UserUseCase::new(Arc::new(repositories));

let ctx = Context::with_actor(fixture::actor::actor1(UserRole::General));
Expand All @@ -98,6 +120,14 @@ mod tests {
UserRole::General,
))))
});
repositories
.project_repository_mut()
.expect_find_by_owner_id()
.returning(|_| Ok(None));
repositories
.project_repository_mut()
.expect_find_by_sub_owner_id()
.returning(|_| Ok(None));
let use_case = UserUseCase::new(Arc::new(repositories));

let ctx = Context::with_actor(fixture::actor::actor1(UserRole::Committee));
Expand Down
6 changes: 4 additions & 2 deletions crates/sos24-use-case/src/interactor/user/list.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,10 @@ impl<R: Repositories> UserUseCase<R> {
ensure!(actor.has_permission(Permissions::READ_USER_ALL));

let raw_user_list = self.repositories.user_repository().list().await?;
let news_list = raw_user_list.into_iter().map(UserDto::from_entity);
Ok(news_list.collect())
let user_list = raw_user_list
.into_iter()
.map(|raw_user| UserDto::from_entity((raw_user, None)));
Ok(user_list.collect())
}
}

Expand Down
6 changes: 6 additions & 0 deletions schema/user.yml
Original file line number Diff line number Diff line change
Expand Up @@ -302,6 +302,12 @@ schemas:
type: string
role:
$ref: "#/components/UserRole"
owned_project_id:
type: string
nullable: true
owned_project_name:
type: string
nullable: true
created_at:
type: string
format: date-time
Expand Down

0 comments on commit 4a52a13

Please sign in to comment.