Skip to content

Commit

Permalink
make duration work optional (#25)
Browse files Browse the repository at this point in the history
  • Loading branch information
AnthonyBuisset authored Oct 25, 2023
1 parent f2ba522 commit 1ce94a3
Show file tree
Hide file tree
Showing 7 changed files with 26 additions and 40 deletions.
4 changes: 2 additions & 2 deletions api/src/application/payment/request.rs
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ impl Usecase {
recipient_id: GithubUserId,
amount: Decimal,
currency: &'static Currency,
hours_worked: u32,
hours_worked: Option<u32>,
reason: PaymentReason,
) -> Result<(PaymentId, CommandId), DomainError> {
let payment_id = PaymentId::new();
Expand All @@ -53,7 +53,7 @@ impl Usecase {
requestor_id,
recipient_id,
Amount::from_decimal(amount, currency),
Duration::hours(hours_worked as i64),
hours_worked.map(|hours_worked| Duration::hours(hours_worked as i64)),
reason.clone(),
);

Expand Down
6 changes: 5 additions & 1 deletion api/src/domain/projectors/projections.rs
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,11 @@ impl EventListener<Event> for Projector {
currency: amount.currency().try_into()?,
requested_at,
invoice_received_at: None,
hours_worked: i32::try_from(duration_worked.num_hours()).unwrap_or(0),
hours_worked: duration_worked
.and_then(|duration_worked| {
i32::try_from(duration_worked.num_hours()).ok()
})
.unwrap_or(0),
})?;

reason.work_items.into_iter().try_for_each(
Expand Down
2 changes: 1 addition & 1 deletion api/src/presentation/http/routes/payment/request.rs
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ pub struct Request {
recipient_id: GithubUserId,
amount: Decimal,
currency: &'static Currency,
hours_worked: u32,
hours_worked: Option<u32>,
reason: dto::payment::Reason,
}

Expand Down
17 changes: 8 additions & 9 deletions api/tests/payment_it.rs
Original file line number Diff line number Diff line change
Expand Up @@ -176,7 +176,7 @@ impl<'a> Test<'a> {
Decimal::from(10),
currencies::USD
));
assert_eq!(duration_worked, Duration::hours(1));
assert_eq!(duration_worked, Some(Duration::hours(1)));
assert_eq!(reason, PaymentReason {
work_items: vec![PaymentWorkItem::PullRequest {
id: GithubPullRequestId::from(1012167246u64),
Expand Down Expand Up @@ -231,7 +231,6 @@ impl<'a> Test<'a> {
"recipientId": 595505,
"amount": 0.00001,
"currency": "ETH",
"hoursWorked": 1,
"reason": {
"workItems": [{
"type": "PULL_REQUEST",
Expand Down Expand Up @@ -300,7 +299,7 @@ impl<'a> Test<'a> {
Decimal::from_str("0.00001").unwrap(),
currencies::ETH
));
assert_eq!(duration_worked, Duration::hours(1));
assert_eq!(duration_worked, None);
assert_eq!(reason, PaymentReason {
work_items: vec![PaymentWorkItem::PullRequest {
id: GithubPullRequestId::from(1012167246u64),
Expand Down Expand Up @@ -507,7 +506,7 @@ impl<'a> Test<'a> {
requestor_id: UserId::new(),
recipient_id: GithubUserId::from(595505u64),
amount: Amount::from_decimal(Decimal::from(100), currencies::USD),
duration_worked: Duration::hours(2),
duration_worked: Some(Duration::hours(2)),
reason: PaymentReason { work_items: vec![] },
requested_at: Utc::now().naive_utc(),
}
Expand Down Expand Up @@ -589,7 +588,7 @@ impl<'a> Test<'a> {
requestor_id: UserId::new(),
recipient_id: GithubUserId::from(595505u64),
amount: Amount::from_decimal(Decimal::from(100), currencies::USD),
duration_worked: Duration::hours(2),
duration_worked: Some(Duration::hours(2)),
reason: PaymentReason { work_items: vec![] },
requested_at: Utc::now().naive_utc(),
}
Expand Down Expand Up @@ -667,7 +666,7 @@ impl<'a> Test<'a> {
requestor_id: UserId::new(),
recipient_id: GithubUserId::from(595505u64),
amount: Amount::from_decimal(Decimal::from(100), currencies::USD),
duration_worked: Duration::hours(2),
duration_worked: Some(Duration::hours(2)),
reason: PaymentReason { work_items: vec![] },
requested_at: Utc::now().naive_utc(),
}
Expand Down Expand Up @@ -741,7 +740,7 @@ impl<'a> Test<'a> {
requestor_id: UserId::new(),
recipient_id: GithubUserId::from(595505u64),
amount: Amount::from_decimal(Decimal::from(100), currencies::USD),
duration_worked: Duration::hours(2),
duration_worked: Some(Duration::hours(2)),
reason: PaymentReason { work_items: vec![] },
requested_at: Utc::now().naive_utc(),
}
Expand Down Expand Up @@ -845,7 +844,7 @@ impl<'a> Test<'a> {
requestor_id: UserId::new(),
recipient_id: GithubUserId::from(595505u64),
amount: Amount::from_decimal(Decimal::from(100), currencies::USD),
duration_worked: Duration::hours(2),
duration_worked: Some(Duration::hours(2)),
reason: PaymentReason { work_items: vec![] },
requested_at: Utc::now().naive_utc(),
}
Expand Down Expand Up @@ -953,7 +952,7 @@ impl<'a> Test<'a> {
requestor_id: UserId::new(),
recipient_id: GithubUserId::from(595505u64),
amount: Amount::from_decimal(Decimal::from(100), currencies::STARK),
duration_worked: Duration::hours(2),
duration_worked: Some(Duration::hours(2)),
reason: PaymentReason { work_items: vec![] },
requested_at: Utc::now().naive_utc(),
}
Expand Down
10 changes: 5 additions & 5 deletions common/domain/src/payment/aggregate.rs
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ impl Payment {
requestor_id: UserId,
recipient_id: GithubUserId,
amount: Amount,
duration_worked: Duration,
duration_worked: Option<Duration>,
reason: Reason,
) -> Self {
Self::default().with_pending_events(vec![PaymentEvent::Requested {
Expand Down Expand Up @@ -212,7 +212,7 @@ mod tests {
requestor_id,
recipient_id,
amount,
duration_worked,
duration_worked: Some(duration_worked),
reason,
requested_at: Utc::now().naive_utc(),
}])
Expand Down Expand Up @@ -354,7 +354,7 @@ mod tests {
requestor_id,
recipient_id,
amount.clone(),
duration_worked,
Some(duration_worked),
reason.clone(),
)
.collect::<Vec<_>>();
Expand All @@ -377,7 +377,7 @@ mod tests {
requestor_id,
recipient_id,
amount,
duration_worked,
duration_worked: Some(duration_worked),
reason,
requested_at,
}
Expand All @@ -392,7 +392,7 @@ mod tests {
requestor_id: Default::default(),
recipient_id: Default::default(),
amount: Amount::from_decimal(Decimal::ZERO, Default::default()),
duration_worked: Duration::hours(0),
duration_worked: None,
reason: Default::default(),
requested_at: Default::default(),
};
Expand Down
4 changes: 2 additions & 2 deletions common/domain/src/payment/events.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@ pub enum Event {
recipient_id: GithubUserId,
#[serde(with = "crate::amount::serde")]
amount: Amount,
#[serde_as(as = "DurationSeconds<i64>")]
duration_worked: Duration,
#[serde_as(as = "Option<DurationSeconds<i64>>")]
duration_worked: Option<Duration>,
reason: Reason,
requested_at: NaiveDateTime,
},
Expand Down
23 changes: 3 additions & 20 deletions common/domain/src/payment/state.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ pub enum Status {
}

#[serde_as]
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[derive(Default, Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct State {
pub id: PaymentId,
pub project_id: ProjectId,
Expand All @@ -27,25 +27,8 @@ pub struct State {
pub recipient_id: GithubUserId,
pub requestor_id: UserId,
pub work_items: Vec<PaymentWorkItem>,
#[serde_as(as = "DurationSeconds<i64>")]
pub duration_worked: Duration,
}

impl Default for State {
fn default() -> Self {
Self {
duration_worked: Duration::seconds(0),
id: Default::default(),
project_id: Default::default(),
requested_amount: Default::default(),
paid_amount: Default::default(),
currency: Default::default(),
status: Default::default(),
recipient_id: Default::default(),
requestor_id: Default::default(),
work_items: Default::default(),
}
}
#[serde_as(as = "Option<DurationSeconds<i64>>")]
pub duration_worked: Option<Duration>,
}

impl EventSourcable for State {
Expand Down

0 comments on commit 1ce94a3

Please sign in to comment.