Skip to content

Commit 406edf8

Browse files
authored
refactor: simplify Repository and Serde traits, introduce AnyRepository, remove ProtobufSerde (#270)
1 parent ba65aed commit 406edf8

24 files changed

Lines changed: 519 additions & 592 deletions

File tree

eventually-postgres/src/aggregate.rs

Lines changed: 11 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use std::marker::PhantomData;
22

33
use async_trait::async_trait;
44
use eventually::aggregate::Aggregate;
5-
use eventually::serde::{Deserializer, Serde, Serializer};
5+
use eventually::serde::Serde;
66
use eventually::version::Version;
77
use eventually::{aggregate, version};
88
use sqlx::{PgPool, Postgres, Row};
@@ -15,7 +15,7 @@ where
1515
OutT: From<T>,
1616
OutEvt: From<T::Event>,
1717
TSerde: Serde<OutT>,
18-
EvtSerde: Serializer<OutEvt>,
18+
EvtSerde: Serde<OutEvt>,
1919
{
2020
pool: PgPool,
2121
aggregate_serde: TSerde,
@@ -32,7 +32,7 @@ where
3232
OutT: From<T>,
3333
OutEvt: From<T::Event>,
3434
TSerde: Serde<OutT>,
35-
EvtSerde: Serializer<OutEvt>,
35+
EvtSerde: Serde<OutEvt>,
3636
{
3737
pub async fn new(
3838
pool: PgPool,
@@ -100,7 +100,7 @@ where
100100
OutT: From<T> + Send + Sync,
101101
OutEvt: From<T::Event>,
102102
TSerde: Serde<OutT> + Send + Sync,
103-
EvtSerde: Serializer<OutEvt>,
103+
EvtSerde: Serde<OutEvt>,
104104
{
105105
async fn save_aggregate_state(
106106
&self,
@@ -138,7 +138,7 @@ where
138138
}
139139

140140
#[async_trait]
141-
impl<T, OutT, OutEvt, TSerde, EvtSerde> aggregate::repository::Getter<T>
141+
impl<T, OutT, OutEvt, TSerde, EvtSerde> aggregate::Repository<T>
142142
for Repository<T, OutT, OutEvt, TSerde, EvtSerde>
143143
where
144144
T: Aggregate + TryFrom<OutT> + Send + Sync,
@@ -147,15 +147,16 @@ where
147147
OutT: From<T> + Send + Sync,
148148
OutEvt: From<T::Event> + Send + Sync,
149149
TSerde: Serde<OutT> + Send + Sync,
150-
<TSerde as Deserializer<OutT>>::Error: std::error::Error + Send + Sync + 'static,
151-
EvtSerde: Serializer<OutEvt> + Send + Sync,
150+
<TSerde as Serde<OutT>>::Error: std::error::Error + Send + Sync + 'static,
151+
EvtSerde: Serde<OutEvt> + Send + Sync,
152152
{
153-
type Error = GetError;
153+
type GetError = GetError;
154+
type SaveError = SaveError;
154155

155156
async fn get(
156157
&self,
157158
id: &T::Id,
158-
) -> Result<aggregate::Root<T>, aggregate::repository::GetError<Self::Error>> {
159+
) -> Result<aggregate::Root<T>, aggregate::repository::GetError<Self::GetError>> {
159160
let aggregate_id = id.to_string();
160161

161162
let row = sqlx::query(
@@ -188,24 +189,8 @@ where
188189
aggregate,
189190
))
190191
}
191-
}
192-
193-
#[async_trait]
194-
impl<T, OutT, OutEvt, TSerde, EvtSerde> aggregate::repository::Saver<T>
195-
for Repository<T, OutT, OutEvt, TSerde, EvtSerde>
196-
where
197-
T: Aggregate + TryFrom<OutT> + Send + Sync,
198-
<T as Aggregate>::Id: ToString,
199-
<T as TryFrom<OutT>>::Error: std::error::Error + Send + Sync + 'static,
200-
OutT: From<T> + Send + Sync,
201-
OutEvt: From<T::Event> + Send + Sync,
202-
TSerde: Serde<OutT> + Send + Sync,
203-
<TSerde as Deserializer<OutT>>::Error: std::error::Error + Send + Sync + 'static,
204-
EvtSerde: Serializer<OutEvt> + Send + Sync,
205-
{
206-
type Error = SaveError;
207192

208-
async fn save(&self, root: &mut aggregate::Root<T>) -> Result<(), Self::Error> {
193+
async fn save(&self, root: &mut aggregate::Root<T>) -> Result<(), Self::SaveError> {
209194
let events_to_commit = root.take_uncommitted_events();
210195

211196
if events_to_commit.is_empty() {

eventually-postgres/src/event.rs

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,11 @@ use std::string::ToString;
44
use async_trait::async_trait;
55
use chrono::Utc;
66
use eventually::message::{Message, Metadata};
7-
use eventually::serde::{Deserializer, Serde, Serializer};
7+
use eventually::serde::Serde;
88
use eventually::version::Version;
99
use eventually::{event, version};
1010
use futures::future::ready;
1111
use futures::{StreamExt, TryStreamExt};
12-
use lazy_static::lazy_static;
1312
use regex::Regex;
1413
use sqlx::postgres::{PgDatabaseError, PgRow};
1514
use sqlx::{PgPool, Postgres, Row, Transaction};
@@ -60,7 +59,7 @@ impl From<AppendError> for Option<version::ConflictError> {
6059

6160
pub(crate) async fn append_domain_event<Evt, OutEvt>(
6261
tx: &mut Transaction<'_, Postgres>,
63-
serde: &impl Serializer<OutEvt>,
62+
serde: &impl Serde<OutEvt>,
6463
event_stream_id: &str,
6564
event_version: i32,
6665
new_event_stream_version: i32,
@@ -97,7 +96,7 @@ where
9796

9897
pub(crate) async fn append_domain_events<Evt, OutEvt>(
9998
tx: &mut Transaction<'_, Postgres>,
100-
serde: &impl Serializer<OutEvt>,
99+
serde: &impl Serde<OutEvt>,
101100
event_stream_id: &str,
102101
new_version: i32,
103102
events: Vec<event::Envelope<Evt>>,
@@ -176,7 +175,7 @@ where
176175
<Evt as TryFrom<OutEvt>>::Error: std::error::Error + Send + Sync + 'static,
177176
OutEvt: From<Evt> + Send + Sync,
178177
S: Serde<OutEvt> + Send + Sync,
179-
<S as Deserializer<OutEvt>>::Error: std::error::Error + Send + Sync + 'static,
178+
<S as Serde<OutEvt>>::Error: std::error::Error + Send + Sync + 'static,
180179
{
181180
fn event_row_to_persisted_event(
182181
&self,
@@ -213,7 +212,7 @@ where
213212
<Evt as TryFrom<OutEvt>>::Error: std::error::Error + Send + Sync + 'static,
214213
OutEvt: From<Evt> + Send + Sync,
215214
S: Serde<OutEvt> + Send + Sync,
216-
<S as Deserializer<OutEvt>>::Error: std::error::Error + Send + Sync + 'static,
215+
<S as Serde<OutEvt>>::Error: std::error::Error + Send + Sync + 'static,
217216
{
218217
type Error = StreamError;
219218

@@ -250,7 +249,7 @@ where
250249
<Evt as TryFrom<OutEvt>>::Error: std::error::Error + Send + Sync + 'static,
251250
OutEvt: From<Evt> + Send + Sync,
252251
S: Serde<OutEvt> + Send + Sync,
253-
<S as Deserializer<OutEvt>>::Error: std::error::Error + Send + Sync + 'static,
252+
<S as Serde<OutEvt>>::Error: std::error::Error + Send + Sync + 'static,
254253
{
255254
type Error = AppendError;
256255

eventually-postgres/tests/aggregate_repository.rs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
use eventually::aggregate::repository::{GetError, Getter, Saver};
2-
use eventually::serde::json::Json;
1+
use eventually::aggregate::repository::GetError;
2+
use eventually::aggregate::Repository;
3+
use eventually::serde::json::JsonSerde;
34
use eventually::version;
45
use eventually_postgres::aggregate;
56
use futures::TryFutureExt;
@@ -15,8 +16,8 @@ async fn it_works() {
1516

1617
let aggregate_repository = aggregate::Repository::new(
1718
pool,
18-
Json::<setup::TestAggregate>::default(),
19-
Json::<setup::TestDomainEvent>::default(),
19+
JsonSerde::<setup::TestAggregate>::default(),
20+
JsonSerde::<setup::TestDomainEvent>::default(),
2021
)
2122
.await
2223
.unwrap();
@@ -64,8 +65,8 @@ async fn it_detects_data_races_and_returns_conflict_error() {
6465

6566
let aggregate_repository = aggregate::Repository::new(
6667
pool,
67-
Json::<setup::TestAggregate>::default(),
68-
Json::<setup::TestDomainEvent>::default(),
68+
JsonSerde::<setup::TestAggregate>::default(),
69+
JsonSerde::<setup::TestDomainEvent>::default(),
6970
)
7071
.await
7172
.unwrap();

eventually-postgres/tests/event_store.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
use std::time::{SystemTime, UNIX_EPOCH};
22

33
use eventually::event::{Appender, Persisted, StreamVersionExpected, Streamer, VersionSelect};
4-
use eventually::serde::json::Json;
4+
use eventually::serde::json::JsonSerde;
55
use eventually::version;
66
use eventually::version::Version;
77
use eventually_postgres::event;
8-
use futures::{TryFutureExt, TryStreamExt};
8+
use futures::TryStreamExt;
99
use rand::Rng;
1010

1111
mod setup;
@@ -16,7 +16,7 @@ async fn append_with_no_version_check_works() {
1616
.await
1717
.expect("connection to the database should work");
1818

19-
let event_store = event::Store::new(pool, Json::<setup::TestDomainEvent>::default())
19+
let event_store = event::Store::new(pool, JsonSerde::<setup::TestDomainEvent>::default())
2020
.await
2121
.unwrap();
2222

@@ -72,7 +72,7 @@ async fn it_works_with_version_check_for_conflict() {
7272
.await
7373
.expect("connection to the database should work");
7474

75-
let event_store = event::Store::new(pool, Json::<setup::TestDomainEvent>::default())
75+
let event_store = event::Store::new(pool, JsonSerde::<setup::TestDomainEvent>::default())
7676
.await
7777
.unwrap();
7878

@@ -148,7 +148,7 @@ async fn it_handles_concurrent_writes_to_the_same_stream() {
148148
.await
149149
.expect("connection to the database should work");
150150

151-
let event_store = event::Store::new(pool, Json::<setup::TestDomainEvent>::default())
151+
let event_store = event::Store::new(pool, JsonSerde::<setup::TestDomainEvent>::default())
152152
.await
153153
.unwrap();
154154

eventually/Cargo.toml

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,7 @@ default = []
2121
tracing = ["dep:tracing"]
2222
serde-prost = ["dep:prost"]
2323
serde-json = ["dep:serde_json"]
24-
serde-protobuf = ["dep:protobuf", "dep:protobuf-json-mapping"]
25-
full = ["serde-prost", "serde-json", "serde-protobuf", "tracing"]
24+
full = ["serde-prost", "serde-json", "tracing"]
2625

2726
[dependencies]
2827
async-trait = "0.1.74"
@@ -31,9 +30,8 @@ thiserror = "1.0.50"
3130
prost = { version = "0.12.1", optional = true }
3231
serde_json = { version = "1.0.108", optional = true }
3332
serde = { version = "1.0.192", features = ["derive"] }
34-
protobuf = { version = "3.3.0", optional = true }
35-
protobuf-json-mapping = { version = "3.3.0", optional = true }
3633
tracing = { version = "0.1.40", features = ["async-await"], optional = true }
34+
anyhow = "1.0.75"
3735

3836
[dev-dependencies]
3937
# NOTE: this is only used for test components and assertions.
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -387,8 +387,8 @@ pub(crate) mod test_user_domain {
387387
mod test {
388388
use std::error::Error;
389389

390-
use crate::aggregate::repository::{Getter, Saver};
391390
use crate::aggregate::test_user_domain::{User, UserEvent};
391+
use crate::aggregate::Repository;
392392
use crate::event::store::EventStoreExt;
393393
use crate::{aggregate, event, version};
394394

0 commit comments

Comments
 (0)