Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 28 additions & 27 deletions auction-server/src/auction/repository/models.rs
Original file line number Diff line number Diff line change
Expand Up @@ -365,68 +365,68 @@ impl Svm {
fn get_update_bid_query(
bid: &entities::Bid,
new_status: entities::BidStatusSvm,
) -> anyhow::Result<Query<'_, Postgres, PgArguments>> {
) -> anyhow::Result<(Query<'_, Postgres, PgArguments>, Option<OffsetDateTime>)> {
let now = OffsetDateTime::now_utc();
match &new_status {
entities::BidStatusSvm::Pending => {
Err(anyhow::anyhow!("Cannot update bid status to pending"))
}
entities::BidStatusSvm::AwaitingSignature { auction } => Ok(sqlx::query!(
entities::BidStatusSvm::AwaitingSignature { auction } => Ok((sqlx::query!(
"UPDATE bid SET status = $1, auction_id = $2 WHERE id = $3 AND status = $4",
BidStatus::AwaitingSignature as _,
auction.id,
bid.id,
BidStatus::Pending as _,
)),
entities::BidStatusSvm::SentToUserForSubmission { auction } => Ok(sqlx::query!(
), None)),
entities::BidStatusSvm::SentToUserForSubmission { auction } => Ok((sqlx::query!(
"UPDATE bid SET status = $1, auction_id = $2 WHERE id = $3 AND status = $4",
BidStatus::SentToUserForSubmission as _,
auction.id,
bid.id,
BidStatus::Pending as _,
)),
entities::BidStatusSvm::Submitted { auction } => Ok(sqlx::query!(
), None)),
entities::BidStatusSvm::Submitted { auction } => Ok((sqlx::query!(
"UPDATE bid SET status = $1, auction_id = $2 WHERE id = $3 AND status IN ($4, $5, $6)",
BidStatus::Submitted as _,
auction.id,
bid.id,
BidStatus::Pending as _,
BidStatus::AwaitingSignature as _,
BidStatus::SentToUserForSubmission as _,
)),
entities::BidStatusSvm::Lost { auction: Some(auction) } => Ok(sqlx::query!(
), None)),
entities::BidStatusSvm::Lost { auction: Some(auction) } => Ok((sqlx::query!(
"UPDATE bid SET status = $1, auction_id = $2, conclusion_time = $3 WHERE id = $4 AND status = $5",
BidStatus::Lost as _,
auction.id,
PrimitiveDateTime::new(now.date(), now.time()),
bid.id,
BidStatus::Pending as _
)),
entities::BidStatusSvm::Lost { auction: None } => Ok(sqlx::query!(
), Some(now))),
entities::BidStatusSvm::Lost { auction: None } => Ok((sqlx::query!(
"UPDATE bid SET status = $1, conclusion_time = $2 WHERE id = $3 AND status = $4",
BidStatus::Lost as _,
PrimitiveDateTime::new(now.date(), now.time()),
bid.id,
BidStatus::Pending as _
)),
entities::BidStatusSvm::Won { .. } | entities::BidStatusSvm::Failed { reason: None, .. } => Ok(sqlx::query!(
), Some(now))),
entities::BidStatusSvm::Won { .. } | entities::BidStatusSvm::Failed { reason: None, .. } => Ok((sqlx::query!(
"UPDATE bid SET status = $1, conclusion_time = $2 WHERE id = $3 AND status IN ($4, $5)",
Self::convert_bid_status(&new_status) as _,
PrimitiveDateTime::new(now.date(), now.time()),
bid.id,
BidStatus::Submitted as _,
BidStatus::SentToUserForSubmission as _,
)),
entities::BidStatusSvm::Failed { reason : Some(reason), .. } => Ok(sqlx::query!(
), Some(now))),
entities::BidStatusSvm::Failed { reason : Some(reason), .. } => Ok((sqlx::query!(
"UPDATE bid SET status = $1, conclusion_time = $2, status_reason = $3 WHERE id = $4 AND status IN ($5, $6)",
Self::convert_bid_status(&new_status) as _,
PrimitiveDateTime::new(now.date(), now.time()),
BidStatusReason::from(reason.clone()) as _,
bid.id,
BidStatus::Submitted as _,
BidStatus::SentToUserForSubmission as _,
)),
entities::BidStatusSvm::Expired { auction } => Ok(sqlx::query!(
), Some(now))),
entities::BidStatusSvm::Expired { auction } => Ok((sqlx::query!(
"UPDATE bid SET status = $1, conclusion_time = $2, auction_id = $3 WHERE id = $4 AND status IN ($5, $6, $7, $8)",
BidStatus::Expired as _,
PrimitiveDateTime::new(now.date(), now.time()),
Expand All @@ -436,29 +436,29 @@ impl Svm {
BidStatus::Submitted as _,
BidStatus::AwaitingSignature as _,
BidStatus::SentToUserForSubmission as _,
)),
entities::BidStatusSvm::Cancelled { auction } => Ok(sqlx::query!(
), Some(now))),
entities::BidStatusSvm::Cancelled { auction } => Ok((sqlx::query!(
"UPDATE bid SET status = $1, conclusion_time = $2, auction_id = $3 WHERE id = $4 AND status = $5",
BidStatus::Cancelled as _,
PrimitiveDateTime::new(now.date(), now.time()),
auction.id,
bid.id,
BidStatus::AwaitingSignature as _,
)),
), Some(now))),
entities::BidStatusSvm::SubmissionFailed { auction, reason } => {
Ok(match reason {
entities::BidSubmissionFailedReason::Cancelled => {
sqlx::query!(
(sqlx::query!(
"UPDATE bid SET status = $1, conclusion_time = $2, auction_id = $3 WHERE id = $4 AND status = $5",
BidStatus::SubmissionFailedCancelled as _,
PrimitiveDateTime::new(now.date(), now.time()),
auction.id,
bid.id,
BidStatus::Cancelled as _,
)
), Some(now))
},
&entities::BidSubmissionFailedReason::DeadlinePassed => {
sqlx::query!(
(sqlx::query!(
"UPDATE bid SET status = $1, conclusion_time = $2, auction_id = $3 WHERE id = $4 AND status IN ($5, $6, $7)",
BidStatus::SubmissionFailedDeadlinePassed as _,
PrimitiveDateTime::new(now.date(), now.time()),
Expand All @@ -467,7 +467,7 @@ impl Svm {
BidStatus::AwaitingSignature as _,
BidStatus::SentToUserForSubmission as _,
BidStatus::Cancelled as _,
)
), Some(now))
}
})

Expand Down Expand Up @@ -577,7 +577,7 @@ pub trait Database: Debug + Send + Sync + 'static {
&self,
bid: &entities::Bid,
new_status: &BidStatusSvm,
) -> anyhow::Result<bool>;
) -> anyhow::Result<(bool, Option<OffsetDateTime>)>;
}

#[async_trait]
Expand Down Expand Up @@ -833,12 +833,13 @@ impl Database for DB {
&self,
bid: &entities::Bid,
new_status: &entities::BidStatusSvm,
) -> anyhow::Result<bool> {
let update_query = Svm::get_update_bid_query(bid, new_status.clone())?;
) -> anyhow::Result<(bool, Option<OffsetDateTime>)> {
let (update_query, conclusion_time_new) =
Svm::get_update_bid_query(bid, new_status.clone())?;
let result = update_query.execute(self).await.inspect_err(|_| {
tracing::Span::current().record("result", "error");
})?;
Ok(result.rows_affected() > 0)
Ok((result.rows_affected() > 0, conclusion_time_new))
}
}

Expand Down
8 changes: 5 additions & 3 deletions auction-server/src/auction/repository/update_bid_status.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ use {
self,
BidStatus,
},
time::OffsetDateTime,
};

impl Repository {
Expand All @@ -29,12 +30,13 @@ impl Repository {
&self,
bid: entities::Bid,
new_status: entities::BidStatusSvm,
) -> anyhow::Result<bool> {
let is_updated = self.db.update_bid_status(&bid, &new_status).await?;
) -> anyhow::Result<(bool, Option<OffsetDateTime>)> {
let (is_updated, conclusion_time_new) =
self.db.update_bid_status(&bid, &new_status).await?;
if is_updated && !new_status.is_pending() {
self.remove_in_memory_pending_bids(&[bid.clone()]).await;
self.update_in_memory_auction_bid(&bid, new_status).await;
}
Ok(is_updated)
Ok((is_updated, conclusion_time_new))
}
}
9 changes: 7 additions & 2 deletions auction-server/src/auction/service/update_bid_status.rs
Original file line number Diff line number Diff line change
Expand Up @@ -65,11 +65,14 @@ impl Service {
}

#[tracing::instrument(skip_all, fields(bid_id, status), err(level = tracing::Level::TRACE))]
pub async fn update_bid_status(&self, input: UpdateBidStatusInput) -> Result<bool, RestError> {
pub async fn update_bid_status(
&self,
mut input: UpdateBidStatusInput,
) -> Result<bool, RestError> {
tracing::Span::current().record("bid_id", input.bid.id.to_string());
tracing::Span::current().record("status", format!("{:?}", input.new_status));

let is_updated = self
let (is_updated, conclusion_time_new) = self
.repo
.update_bid_status(input.bid.clone(), input.new_status.clone())
.await
Expand All @@ -78,6 +81,8 @@ impl Service {
RestError::TemporarilyUnavailable
})?;

input.bid.conclusion_time = conclusion_time_new;

// TODO: Do not rely on db to see if the status is changed
// we can rely on the write guard and our in memory structure

Expand Down
Loading