public async Task <IActionResult> Create([FromBody] BidModel model) { // TODO: Validations // - Make sure user can bid // - Make sure last bid wasn't current user var product = await _dbContext.Products.FindAsync(model.ProductId); if (product == null) { _logger.LogInformation("Product {productId} not found", model.ProductId); return(NotFound()); } var evt = await _dbContext.Events.FindAsync(product.EventId); if (evt == null) { _logger.LogInformation("Event {eventId} not found", product.EventId); return(NotFound()); } var user = await _userManager.GetUserAsync(User); var placeBidRequest = new PlaceBidRequest { Event = evt, Product = product, User = user, Amount = model.Amount }; try { var bidResult = await _bidService.PlaceBidAsync(placeBidRequest); if (bidResult.ResultType == PlaceBidResultType.BiddingClosed) { return(BadRequest("Bidding for event is not open")); } else if (bidResult.ResultType == PlaceBidResultType.InvalidAmount) { return(BadRequest($"Bid amount must be {product.NextMinBidAmount} or greater")); } // Success return(Created("", model)); } catch (Exception ex) { _logger.LogError(ex, "Error placing bid for product ID {id} (User: {userId})", model.ProductId, user.Id); return(StatusCode(500)); // TODO: Return something different } }