#event-sourcing #cqrs #ddd

event-store-adapter-rs

将 DynamoDB 转换为事件存储的 crate

102 个版本 (53 个稳定版)

1.1.37 2024年5月30日
1.1.32 2024年4月30日
1.1.19 2024年3月29日
0.2.45 2024年1月18日
0.2.28 2023年11月25日

#2 in #cqrs

Download history 520/week @ 2024-04-15 875/week @ 2024-04-22 698/week @ 2024-04-29 3/week @ 2024-05-06 300/week @ 2024-05-13 357/week @ 2024-05-20 337/week @ 2024-05-27 152/week @ 2024-06-03 204/week @ 2024-06-10 86/week @ 2024-06-17 135/week @ 2024-06-24 254/week @ 2024-07-01 122/week @ 2024-07-08 147/week @ 2024-07-15 167/week @ 2024-07-22 550/week @ 2024-07-29

每月 1,131 次下载

MIT/Apache

49KB
1K SLoC

event-store-adapter-rs

Workflow Status crates.io docs.rs Renovate License

此库旨在将 DynamoDB 转换为支持 CQRS/事件存储的事件存储库。

日语

使用方法

您可以使用 EventStore 轻松实现支持事件存储的存储库。

pub struct UserAccountRepository {
  event_store: EventStore<UserAccount, UserAccountEvent>,
}

impl UserAccountRepository {
  pub async fn store_event(&mut self, event: &UserAccountEvent, version: usize) -> Result<(), RepositoryError> {
    let result = self.event_store.persist_event(event, version).await;
    match result {
      Ok(_) => Ok(()),
      Err(err) => Err(Self::handle_event_store_write_error(err)),
    }
  }

  pub async fn store_event_and_snapshot(
    &mut self,
    event: &UserAccountEvent,
    snapshot: &UserAccount,
  ) -> Result<(), RepositoryError> {
    let result = self.event_store.persist_event_and_snapshot(event, snapshot).await;
    match result {
      Ok(_) => Ok(()),
      Err(err) => Err(Self::handle_event_store_write_error(err)),
    }
  }

  pub async fn find_by_id(&self, id: &UserAccountId) -> Result<Option<UserAccount>, RepositoryError> {
    let snapshot_result = self.event_store.get_latest_snapshot_by_id(id).await;
    match snapshot_result {
      Ok(snapshot_opt) => match snapshot_opt {
        Some(snapshot) => {
          let events = self
            .event_store
            .get_events_by_id_since_seq_nr(id, snapshot.seq_nr() + 1)
            .await;
          match events {
            Ok(events) => Ok(Some(UserAccount::replay(events, snapshot))),
            Err(err) => Err(Self::handle_event_store_read_error(err)),
          }
        }
        None => Ok(None),
      },
      Err(err) => Err(Self::handle_event_store_read_error(err)),
    }
  }
    
}

以下是一个存储库使用的示例。

let event_store = EventStore::new(
  aws_dynamodb_client.clone(),
  journal_table_name.to_string(),
  journal_aid_index_name.to_string(),
  snapshot_table_name.to_string(),
  snapshot_aid_index_name.to_string(),
  64,
);
 
let mut repository = UserAccountRepository::new(event_store);
 
// Replay the aggregate from the event store
let mut user_account = repository.find_by_id(user_account_id).await.unwrap();

// Execute a command on the aggregate
let user_account_event = user_account.rename(name).unwrap();
 
// Store the new event without a snapshot
repository
  .store_event(&user_account_event, user_account.version())
  .await
// Store the new event with a snapshot
//  repository
//  .store_event_and_snapshot(&user_account_event, &user_account)
//  .await

表格规范

docs/DATABASE_SCHEMA.md

CQRS/事件存储示例

j5ik2o/cqrs-es-example-rs

许可证。

MIT 许可证。详细信息请见 LICENSE

依赖项

~22MB
~385K SLoC