-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathlib.rs
More file actions
124 lines (115 loc) · 4.29 KB
/
lib.rs
File metadata and controls
124 lines (115 loc) · 4.29 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
use std::fmt::Debug;
use chrono::{DateTime, Utc};
use event_store_adapter_rs::types::{EventStoreReadError, EventStoreWriteError};
use thiserror::Error;
use command_domain::group_chat::*;
use command_domain::user_account::UserAccountId;
#[derive(Debug, Error)]
pub enum GroupChatRepositoryError {
#[error("Failed to store the group chat: {0:?}")]
StoreError(GroupChat, EventStoreWriteError),
#[error("Failed to find the group chat by id: {0:?}")]
FindByIdError(GroupChatId, EventStoreReadError),
}
/// グループチャットのリポジトリ。
#[async_trait::async_trait]
pub trait GroupChatRepository: Debug + Clone + Sync + Send + 'static {
/// グループチャットのイベント及びスナップを保存する。
///
/// # 引数
/// - `event` - グループチャットのイベント
/// - `version` - グループチャットのバージョン
/// - `snapshot` - グループチャットのスナップショット
///
/// # 戻り値
/// - 成功した場合はOk, 失敗した場合はErrを返す。
async fn store(&mut self, event: &GroupChatEvent, snapshot: &GroupChat) -> Result<(), GroupChatRepositoryError>;
/// 指定したグループチャットIDに該当するグループチャットを取得する。
///
/// # 引数
/// - `id` - グループチャットID
///
/// # 戻り値
/// - 取得できた場合はOk(GroupChat), 取得できなかった場合はErrを返す。
async fn find_by_id(&self, id: &GroupChatId) -> Result<Option<GroupChat>, GroupChatRepositoryError>;
}
#[derive(Debug, Clone, Error)]
pub enum GroupChatReadModelUpdateDaoError {
#[error("Failed to insert group chat")]
InsertGroupChatError,
#[error("Failed to delete group chat")]
DeleteGroupChatError,
#[error("Failed to rename group chat")]
RenameGroupChatError,
#[error("Failed to insert member")]
InsertMemberError,
#[error("Failed to delete member")]
DeleteMemberError,
#[error("Failed to insert message")]
InsertMessageError,
#[error("Failed to update message")]
UpdateMessageError,
#[error("Failed to delete message")]
DeleteMessageError,
}
/// グループチャットリードモデル更新用のデータアクセスオブジェクト。
///
/// NOTE: このデータアクセスオブジェクトはあくまで書き込み用です。読み込み用のデータアクセスオブジェクトはクエリ側に別途定義します。
#[async_trait::async_trait]
pub trait GroupChatReadModelUpdateDao {
/// グループチャットリードモデルを作成します。
async fn insert_group_chat(
&self,
aggregate_id: GroupChatId,
name: GroupChatName,
administrator_id: UserAccountId,
created_at: DateTime<Utc>,
) -> Result<(), GroupChatReadModelUpdateDaoError>;
/// グループチャットリードモデルを削除します。
async fn delete_group_chat(
&self,
aggregate_id: GroupChatId,
updated_at: DateTime<Utc>,
) -> Result<(), GroupChatReadModelUpdateDaoError>;
/// グループチャットリードモデルの名前を変更します。
async fn rename_group_chat(
&self,
aggregate_id: GroupChatId,
name: GroupChatName,
updated_at: DateTime<Utc>,
) -> Result<(), GroupChatReadModelUpdateDaoError>;
/// メンバーリードモデルを追加します。
async fn insert_member(
&self,
aggregate_id: GroupChatId,
member_id: MemberId,
account_id: UserAccountId,
role: MemberRole,
created_at: DateTime<Utc>,
) -> Result<(), GroupChatReadModelUpdateDaoError>;
/// メンバーリードモデルを削除します。
async fn delete_member(
&self,
aggregate_id: GroupChatId,
account_id: UserAccountId,
) -> Result<(), GroupChatReadModelUpdateDaoError>;
/// メッセージリードモデル追加します。
async fn insert_message(
&self,
aggregate_id: GroupChatId,
message: Message,
created_at: DateTime<Utc>,
) -> Result<(), GroupChatReadModelUpdateDaoError>;
async fn update_message(
&self,
aggregate_id: GroupChatId,
message: Message,
updated_at: DateTime<Utc>,
) -> Result<(), GroupChatReadModelUpdateDaoError>;
/// メッセージリードモデルを削除します。
async fn delete_message(
&self,
message_id: MessageId,
updated_at: DateTime<Utc>,
) -> Result<(), GroupChatReadModelUpdateDaoError>;
}