public async Task <ObjectResult> PostPurchase(PurchaseDto purchaseDto) { var currency = await _context.Currencies.FirstOrDefaultAsync(x => x.Id == purchaseDto.CurrencyId); if (currency == null) { return(new BadRequestObjectResult(new ApiResponseDto { Success = false, Message = "Currency not found" })); } var currencyPrice = await _currencyPriceServices.GetPriceByCurrencyName(currency.Source); if (currencyPrice == null) { return(new BadRequestObjectResult(new ApiResponseDto { Success = false, Message = "Could not get the currency price" })); } var price = currency.MultiplyBy.HasValue ? currencyPrice.Buy * currency.MultiplyBy.Value : currencyPrice.Buy; var today = DateTimeOffset.Now; var firstDayOfMonth = new DateTime(today.Year, today.Month, 1); var lastDayOfMonth = firstDayOfMonth.AddMonths(1).AddDays(-1); var purchasesInCurrentMonth = await _context.Purchases.Where(x => x.UserId == purchaseDto.UserId && x.CreatedDate > firstDayOfMonth && x.CreatedDate < lastDayOfMonth).SumAsync(x => x.Quantity / x.Price); if (purchasesInCurrentMonth + purchaseDto.Quantity / price > currency.MonthlyLimit) { return(new BadRequestObjectResult(new ApiResponseDto { Success = false, Message = $"Purchase limit for this currency is {currency.MonthlyLimit} by month" })); } var purchase = new Purchase { UserId = purchaseDto.UserId, Quantity = purchaseDto.Quantity, Price = price, CurrencyId = purchaseDto.CurrencyId }; _context.Purchases.Add(purchase); await _context.SaveChangesAsync(); return(new OkObjectResult(new ApiResponseDto { Success = true })); }
public async Task <IActionResult> GetCurrenciesPrices() { var currencies = await _context.Currencies.Where(x => !x.Disabled).ToListAsync(); var result = new List <CurrencyPriceDto>(); foreach (var currency in currencies) { var currencyPrice = await _currencyPriceServices.GetPriceByCurrencyName(currency.Source); currencyPrice.Name = currency.Name; result.Add(currencyPrice); } return(new OkObjectResult(result)); }